【发布时间】:2009-06-03 16:14:04
【问题描述】:
我有一个全局样式来设置我所有的TextBox 样式,但在某些情况下,我想只是将前景色恢复为原始的非自定义样式颜色。我尝试在我想恢复的特定TextBoxes 中使用{TemplateBinding Foreground}。它最终不是有效的 XAML,我不确定这是不是正确的方式。
有什么想法吗?谢谢。
【问题讨论】:
我有一个全局样式来设置我所有的TextBox 样式,但在某些情况下,我想只是将前景色恢复为原始的非自定义样式颜色。我尝试在我想恢复的特定TextBoxes 中使用{TemplateBinding Foreground}。它最终不是有效的 XAML,我不确定这是不是正确的方式。
有什么想法吗?谢谢。
【问题讨论】:
有几种方法可以做到这一点。如果您查看 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},从而停止应用默认样式。或者我们可以给元素它自己的样式,而不是从基本样式继承,然后只重新应用我们需要的设置器:
<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" />
【讨论】:
BasedOn="{StaticResource {x:Type TextBox}}" 的评论。我试图找到两种方法的替代方法(您的实际答案显示),并偶然发现了这里的问答。您上面的评论正是提供了我需要的提示!恕我直言,您应该将该详细信息添加到答案本身中(也许也可以将两种样式的方法作为示例,这可能会帮助其他人更容易地找到此答案)。