2010-09-08 162 views
2

是否有可能覆蓋其他風格的風格。我最好的說明將一些非工作代碼:風格覆蓋風格

<Style x:Key="SpecialFont" TargetType="Label"> 
    <Setter Property="Foreground" Value="Red" /> 
    <Setter Property="FontSize" Value="28" /> 
</Style> 

<Style TargetType="GroupBox"> 
    <Setter Property="GroupBox.Resources"> 
     <Setter.Value> 
      <Style x:Key="SpecialFont" TargetType="Label"> 
       <Setter Property="FontSize" Value="74" /> 
      </Style> 
     </Setter.Value> 
    </Setter> 
</Style> 

的想法是,我會定義一個樣式,以我的「特殊文本」,字體默認情況下是紅色和28的大小,但如果標籤放置在一個組框中,它的尺寸應該是74,但保持紅色。這怎麼可能?我希望在我的xaml中使用相同的樣式鍵,而不是基於另一種樣式創建樣式。基於SpecialFont的SpecialFontBig。

編輯: 好的......另一種解釋。

我想結果是這樣的:

<Style x:Key="BaseFont" TargetType="Label"> 
    <Setter Property="Foreground" Value="White" /> 
</Style> 

<Style x:Key="Font1" TargetType="Label" BasedOn="{StaticResource BaseFont}"> 
    <Setter Property="FontSize" Value="10" /> 
</Style> 

<Style x:Key="Font2" TargetType="Label" BasedOn="{StaticResource BaseFont}"> 
    <Setter Property="FontSize" Value="20" /> 
</Style> 

<Style x:Key="Font3" TargetType="Label" BasedOn="{StaticResource BaseFont}"> 
    <Setter Property="FontSize" Value="30" /> 
</Style> 

<Style x:Key="Font1Red" TargetType="Label" BasedOn="{StaticResource Font1}"> 
    <Setter Property="Foreground" Value="Red" /> 
</Style> 

<Style x:Key="Font2Red" TargetType="Label" BasedOn="{StaticResource Font2}"> 
    <Setter Property="Foreground" Value="Red" /> 
</Style> 

<Style x:Key="Font3Red" TargetType="Label" BasedOn="{StaticResource Font3}"> 
    <Setter Property="Foreground" Value="Red" /> 
</Style> 

凡FontX使用我的groupboxes外,並FontXRed使用在他們裏面。是否有可能推翻這個前景,而沒有製作大量的FontXRed風格?例如像:

<Style x:Key="BaseFont" TargetType="Label"> 
    # IF INSIDE A GROUPBOX 
    <Setter Property="Foreground" Value="Red" /> 
    # ELSE 
    <Setter Property="Foreground" Value="White" /> 
</Style> 

回答

0

樣式可以基於其他樣式 - >http://msdn.microsoft.com/en-us/library/system.windows.style.basedon.aspx

<Style x:Key="Style1"> 
    <Setter Property="Control.Background" Value="Yellow"/> 
</Style> 

<Style x:Key="Style2" BasedOn="{StaticResource Style1}"> 
    <Setter Property="Control.Foreground" Value="Blue"/> 
</Style> 
+0

Ups ... double post,但正如我上面寫的,我不想有兩種不同的樣式,但只是重寫樣式中的某些值,如果它用在groupbox中。 – kahr 2010-09-08 10:08:16

0

我創建了一個新的分組框,這沒關係解決我的問題:

class MyGroupBox : GroupBox 
{ 
    public MyGroupBox() 
    { 
     var newForegroundSetter = new Setter(ForegroundProperty, Brushes.Black); 

     var stylesToUpdate = new List<string> 
           { 
            "TextBlockShared", 
            "SmallFontTextBlock", 
            "MediumFontTextBlock", 
            "LargeFontTextBlock", 

            "FontControlShared", 
            "SmallFontControl", 
            "SmallFontHeaderControl", 
            "MediumFontControl", 
            "MediumFontHeaderControl", 
            "LargeFontControl", 
            "LargeFontHeaderControl", 

            "SmallButton", 
            "MediumButton", 
            "LargeButton", 
           }; 

     foreach (var styleKey in stylesToUpdate) 
     { 
      var existingStyle = FindResource(styleKey) as Style; 
      if (existingStyle == null) continue; 

      var newStyle = new Style(existingStyle.TargetType, existingStyle); 
      newStyle.Setters.Add(newForegroundSetter); 

      Resources.Add(styleKey, newStyle); 
     } 
    } 
} 
0

在如果有人絆倒在這,這是通常適用於我的訣竅。

基本上,我在另一個樣式資源中定義了一個樣式。我通常將內部樣式基於鍵引用樣式來在其他地方使用,但您也可以在其中放置簡單的樣式。

<Style x:Key="SpecialFont" TargetType="Label"> 
    <Setter Property="Foreground" Value="Red" /> 
    <Setter Property="FontSize" Value="28" /> 
</Style> 

<Style TargetType="GroupBox"> 
    <Style.Resources> 
    <Style TargetType="Label" 
      BasedOn="{StaticResource SpecialFont}" /> 
    </Style.Resources> 
</Style>