sourcetip

스킨닝:색상을 다른 색상의 StaticResource로 사용

fileupload 2023. 4. 23. 11:02
반응형

스킨닝:색상을 다른 색상의 StaticResource로 사용

어플리케이션에 스킨링을 구현했습니다.응용 프로그램은 스킨별 리소스 사전에 있는 색상을 사용하는 Brushes.xaml 리소스 사전을 로드합니다.따라서 선택한 스킨에 따라 하나의 Color.xaml만 로드됩니다.

피부 고유 색상.xaml

    <Color x:Key="TextBoxBackgroundColor">#C4AF8D</Color>
    <Color x:Key="TextBoxForegroundColor">#6B4E2C</Color>
    <Color x:Key="ToolBarButtonForegroundColor">#6B4E2C</Color>

Brushs.xaml:

    <SolidColorBrush 
        x:Key="TextBoxBackground" 
        Color="{DynamicResource TextBoxBackgroundColor}" />
    <SolidColorBrush 
        x:Key="TextBoxForeground" 
        Color="{DynamicResource TextBoxForegroundColor}" />

보시다시피 여러 색상(TextBoxForgroundColor 및 ToolBarButtonForgroundColor)은 동일합니다.특히 사용한 색상은 16진수치로 인식할 수 없기 때문에 점점 혼란스러워지기 때문에 회피하고 싶습니다.두 가지 색상을 하나로 결합하는 것이 좋습니다만, TextBoxForgroundColor와 ToolBarButtonForgroundColor가 다른 스킨이 있습니다.

제가 하고 싶은 일은 다음과 같습니다.

<Color x:Key="DarkBrown">#C4AF8D</Color>

<Color x:Key="TextBoxBackgroundColor" Color={StaticResource DarkBrown} />
<Color x:Key="ToolBarButtonForegroundColor" Color={StaticResource DarkBrown} />

Xaml에서 이게 가능한가요?난 방법을 찾지 못했다.

이건?

<Color x:Key="DarkBrown">#C4AF8D</Color>

<DynamicResource x:Key="TextBoxBackgroundColor" ResourceKey="DarkBrown"/>
<DynamicResource x:Key="ToolBarButtonForegroundColor" ResourceKey="DarkBrown"/>

고급 사용 사례 및 여러 수준의 별칭에 대해서는 이 답변을 참조하십시오.

Brushs.xaml 피부 전용으로 만들면 어떨까요?그러면 다음과 같이 됩니다.

<Color x:Key="DarkBrown">#C4AF8D</Color>

<SolidColorBrush x:Key="TextBoxBackgroundBrush" Color="{StaticResource DarkBrown}" />
<SolidColorBrush x:Key="ToolBarButtonForegroundBrush" Color="{StaticResource DarkBrown}" />

브러시를 피부 특화시키는 것에 찬성하는 또 다른 포인트는 브러시를 피부 특화시키고 싶은 상황이 있다는 것입니다.ToolBarButtonForegroundBrush한 피부에는 단색 브러시, 다른 피부에는 그라데이션 브러시.

H.B.의 대답은 매우 흥미롭고 나는 이 질문이 원하는 것을 정확히 하고 싶기 때문에 그것을 꽤 많이 가지고 놀았다.

WPF 3.5에서는 Dynamic Resource를 사용할 수 없습니다.즉, 런타임에 예외를 발생시킵니다(Amenti가 말한 것).단, 공유하는 색상을 참조하는 색상을 작성한 경우 Static Resource는 WPF 3.5와 WPF 4.0 모두에서 작동합니다.

즉, 이 xaml은 WPF 3.5와 WPF 4.0 모두에서 동작합니다.

<Window
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="ColorsReferencingColors.MainWindow"
    x:Name="Window"
    Title="MainWindow"
    Width="640"
    Height="480"
>
    <Window.Resources>
        <Color x:Key="DarkBlue">DarkBlue</Color>
        <StaticResource x:Key="EllipseBackgroundColor" ResourceKey="DarkBlue"/>
        <SolidColorBrush
            x:Key="ellipseFillBrush"
            Color="{DynamicResource EllipseBackgroundColor}"
        />
    </Window.Resources>
    <Grid>
        <StackPanel Margin="25">
            <Ellipse
                Width="200"
                Height="200"
                Fill="{DynamicResource ellipseFillBrush}"
            />
        </StackPanel>
    </Grid>
</Window>

또 다른 언급은 이 접근방식이 디자이너(Visual Studio 2008 및 2010 디자이너, Blend 3 및 4 디자이너)에게 큰 피해를 준다는 것입니다.이것이 Kaxaml 1.7이 H.B.의 Xaml을 좋아하지 않았던 것과 같은 이유라고 추측한다(H.B.의 답변에 대한 코멘트 스트림을 따르고 있다면).

그러나 단순한 테스트 케이스에서는 설계자를 무너뜨리지만, 일상 업무에서 사용하는 대규모 애플리케이션의 설계 표면을 무너뜨리지는 않는 것 같습니다.정말 이상해!즉, 디자이너에서 아직 기능하고 있는 것에 관심이 있다면, 어쨌든 이 방법을 사용해 보십시오.당신의 디자이너는 여전히 일할 수 있다!

Color에는 Color 속성이 없으므로 마지막 부분을 사용할 수 없습니다.

A Color에는 R, G, B 및 A 속성이 있습니다.따라서 4바이트를 리소스로 생성할 수 있습니다.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
     xmlns:sys="clr-namespace:System;assembly=mscorlib">
    <sys:Byte x:Key="r">#23</sys:Byte>
    <sys:Byte x:Key="g">#45</sys:Byte>
    <sys:Byte x:Key="b">#67</sys:Byte>
    <sys:Byte x:Key="a">#FF</sys:Byte>

    <Color x:Key="c1" R="{StaticResource r}"
       G="{StaticResource g}"
       B="{StaticResource b}"
       A="{StaticResource a}"/>

    <Color x:Key="c2" R="{StaticResource r}"
       G="{StaticResource g}"
       B="{StaticResource b}"
       A="{StaticResource a}"/>

</ResourceDictionary>

여전히 당신이 원하는 것은 아니지만, 그것은 효과가 있을 것이다.

언급URL : https://stackoverflow.com/questions/4802419/skinning-using-a-color-as-staticresource-for-another-color

반응형