在样式中覆盖样式

时间:2010-09-08 09:46:13

标签: wpf xaml

是否可以覆盖其他样式的样式。我最好的描述是一些非工作代码:

<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中使用相同的样式键,而不是基于另一个创建样式,例如SpecialFontBig基于SpecialFont。

编辑: 好的......另一种解释。

我想要这样的结果:

<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,并在其中使用FontXRed。是否有可能推翻这个前景,而不会制作很多FontXRed样式?例如:

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

3 个答案:

答案 0 :(得分:0)

样式可以基于其他样式 - &gt; 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>

答案 1 :(得分:0)

我创建了一个新的GroupBox,它可以解决我的问题:

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);
        }
    }
}

答案 2 :(得分: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>