2012-08-06 63 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

相關問題