我有一个全局样式设置我的所有TextBox
样式,但在某些情况下,我想将只是前景颜色还原为原始的非自定义样式颜色。我尝试在我想要恢复的特定{TemplateBinding Foreground}
中使用TextBoxes
。它最终不是有效的XAML,我不确定这是否正确。
有什么想法吗?感谢。
答案 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" />