4

查看可用于 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>

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

4

1 回答 1

2

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

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

或者:

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

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

值得注意的是,它SystemColors为您提供了Brush每种可用颜色的颜色以及颜色本身 - 因此,如果您想创建自己的画笔,从一种系统颜色渐变到另一种系统颜色,您可以轻松创建它。

于 2012-08-06T12:57:21.990 回答