应用默认WPF样式

时间:2009-06-03 16:14:04

标签: wpf styles

我有一个全局样式设置我的所有TextBox样式,但在某些情况下,我想将只是前景颜色还原为原始的非自定义样式颜色。我尝试在我想要恢复的特定{TemplateBinding Foreground}中使用TextBoxes。它最终不是有效的XAML,我不确定这是否正确。

有什么想法吗?感谢。

1 个答案:

答案 0 :(得分:11)

有几种方法可以做到这一点。如果您查看MSDN上的Precedence List 然后您可以看到以1-8方式设置的Forground将覆盖默认样式的Foreground。最简单的方法是在TextBox中设置本地值。

<TextBox Foreground="Red" />

您可以做的另一件事是使用样式的'BasedOn'属性来覆盖其他版本。这确实需要为您的默认样式提供一个键值,但是这可以用于应用默认样式,如下例所示:

    <Style TargetType="{x:Type TextBox}"
           x:Key="myTextBoxStyle">
        <Setter Property="Foreground"
                Value="Red" />
        <Setter Property="FontWeight"
                Value="Bold" />
    </Style>
    <!-- Style applies to all TextBoxes -->
    <Style TargetType="{x:Type TextBox}"
           BasedOn="{StaticResource myTextBoxStyle}" />


<TextBox Text="Hello">
    <TextBox.Style>
        <Style BasedOn="{StaticResource myTextBoxStyle}" TargetType="{x:Type TextBox}">
            <Setter Property="Foreground"
                    Value="Blue" />
        </Style>
    </TextBox.Style>
</TextBox>


修改
在默认样式应用值并且您希望将其还原为基值的情况下,我可以通过几种方式来考虑这种行为。我知道,您不能以通用方式绑定回默认主题值。

然而,我们可以做一些其他事情。如果我们需要样式不应用某些属性,我们可以将样式设置为{x:Null},从而停止应用默认样式。或者我们可以为元素提供不依赖于基本样式的自己的样式,然后仅重新应用我们需要的setter:

        <TextBox Text="Hello" Style="{x:Null}" />
        <TextBox Text="Hello">
            <TextBox.Style>
                <Style TargetType="{x:Type TextBox}">
                    <Setter Property="FontWeight"
                            Value="Bold" />
                </Style>
            </TextBox.Style>
        </TextBox>

我们可以修改默认样式,以便只在某些条件下设置Foreground,例如Tag是某个值。

    <Style TargetType="{x:Type TextBox}"
           x:Key="myTextBoxStyle">
        <Setter Property="FontWeight"
                Value="Bold" />
        <Style.Triggers>
            <Trigger Property="Tag"
                     Value="ApplyForeground">
                <Setter Property="Foreground"
                        Value="Red" />
            </Trigger>
        </Style.Triggers>
    </Style>

   <TextBox Text="Hello" />
    <TextBox Text="Hello" Tag="ApplyForeground" />