2012-08-06 65 views
3

看看WPF可用的各种开源主题,我有点惊讶地发现颜色没有映射到系统颜色。所以如果你改变你的整体系统配置,这些主题将不会改变以适应。为什么WPF主题不使用SystemColors?

是否有任何主题可以正确使用系统颜色,如果是这样,我该如何编写能够利用这些颜色的按钮样式?

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

<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> 

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

回答

2

我不知道第三方主题,但系统颜色通过SystemColors类在Xaml中可用。此类公开,可以在您的XAML可以使用两种方法中的一个资源的钥匙:具有相同背景

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

上述任一应该给你一个边界:

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

或作为系统的颜色ControlDarkBrush。我提供的文档链接提供了可用资源的完整列表。

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

+0

最好使用DynamicResource,以便应用程序也能够更改其颜色。 – DHN 2012-08-06 12:58:44

+0

只有在需要的时候 - 使用'DynamicResource'开销可能不值得。应用程序会在重新启动时始终选取当前值。除此之外,我不知道WPF是否会在运行时更新这些资源,如果用户更改其系统颜色(虽然很容易测试)。 – 2012-08-06 13:03:08

+0

为了保持一致性,我认为这是必需的。如果一个应用程序符合系统颜色设置,我希望它在颜色改变时改变。如果应用程序不以这种方式行事,那对我来说会很好奇。 – DHN 2012-08-06 14:33:15

相关问题