不是WPF主题为什么要使用systemColors中?(Why don't WPF them

2019-06-26 19:06发布

看着在WPF的各种开源的主题,我有点惊讶地看到,颜色不映射到系统颜色。 所以,如果你改变你的整个系统的配置,这些主题不会改变,以适应。

是否有正确使用系统的颜色,如果是这样,我怎么写一个按钮的风格,将利用这些颜色的任何主题?

举个例子,这里有一个按钮的风格:

    <Style x:Key="specialButton" TargetType="Button">
        <Setter Property="SnapsToDevicePixels" Value="True"/>
        <Setter Property="OverridesDefaultStyle" Value="True"/>
        <Setter Property="FocusVisualStyle" Value="{StaticResource ButtonFocusVisual}"/>
        <Setter Property="Background" Value="{StaticResource NormalBrush}"/>
        <Setter Property="Margin" Value="2"/>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="Button">
                    <Border Name="border"
                    BorderThickness="1"
                    Background="{TemplateBinding Background}"
                    BorderBrush="{StaticResource NormalBorderBrush}"
                    Padding="1,1">
                        <ContentPresenter Name="content" HorizontalAlignment="Center" VerticalAlignment="Center" RecognizesAccessKey="True"/>
                    </Border>
                    <ControlTemplate.Triggers>
                        <Trigger Property="IsMouseOver" Value="True">
                            <Setter TargetName="border" Property="BorderBrush" Value="{StaticResource DarkBrush}"/>
                        </Trigger>
                        <Trigger Property="IsPressed" Value="True">
                            <Setter TargetName="border" Property="Background" Value="{StaticResource PressedBrush}"/>
                            <Setter TargetName="border" Property="BorderBrush" Value="{StaticResource PressedBorderBrush}"/>
                        </Trigger>
                        <Trigger Property="IsDefaulted" Value="True">
                            <Setter TargetName="border" Property="BorderBrush" Value="{StaticResource DefaultedBorderBrush}"/>
                        </Trigger>
                        <Trigger Property="IsFocused" Value="True">
                            <Setter TargetName="border" Property="BorderBrush" Value="{StaticResource DefaultedBorderBrush}"/>
                        </Trigger>
                        <Trigger Property="IsEnabled" Value="False">
                            <Setter TargetName="border" Property="Background" Value="{StaticResource DisabledBackgroundBrush}"/>
                            <Setter TargetName="border" Property="BorderBrush" Value="{StaticResource DisabledBorderBrush}"/>
                            <Setter Property="Foreground" Value="{StaticResource DisabledForegroundBrush}"/>
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

现在的问题是,让他们挂接到系统颜色如何指定命名的静态资源? 例如,背景可能是这样的:

    <LinearGradientBrush x:Key="NormalBrush" StartPoint="0,0" EndPoint="0,1">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="{DynamicResource {x:Static SystemColors.ControlLightLightColorKey}}" Offset="0.0"/>
                <GradientStop Color="{DynamicResource {x:Static SystemColors.ControlLightColorKey}}" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>

然而,这看上去一点也不像一个标准的按钮。 如果我使用XAMLPAD检查按钮,我可以看到以下内容:

     <LinearGradientBrush x:Key="NormalBrush" StartPoint="0,0" EndPoint="0,1">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="#FFF3F3F3" Offset="0.0"/>
                <GradientStop Color="#FFEBEBEB" Offset="0.5"/>
                <GradientStop Color="#FFDDDDDD" Offset="0.5"/>
                <GradientStop Color="#FFCDCDCD" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>

使用的颜色似乎是常量,而不是基于系统颜色。

Answer 1:

我不知道第三方的主题,但系统的颜色在XAML都可以通过SystemColors类。 此类公开,可以在以下两种方式之一XAML中使用的资源键:

<Border Background="{x:Static SystemColors.ControlDarkBrushKey}" />

要么:

<Border Background="{StaticResource {x:Static SystemColors.ControlDarkBrushKey}}" />

无论是上述的应该给你一个边框与背景相同的系统的ControlDarkBrush颜色。 我给的文档链接提供可用资源的完整列表。

值得一提的是, SystemColors为您提供既Brush可用的每一种颜色,并且颜色本身-所以,如果你想创建自己的画笔,从一个系统颜色变淡到另一个,你可以轻松地创建这一点。



文章来源: Why don't WPF themes use SystemColors?