我有一个全局样式,设置了所有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,例如标记为某个值。 <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}}"
的注释。我一直在寻找替代两种样式方法的方法(您实际的答案显示了这一点),并偶然发现了这里的问答。您上面的评论提供了我所需的提示!在我看来,您应该将该细节添加到答案本身中(也许同时保留两种样式方法作为示例,这可能有助于其他人更轻松地找到此答案)。 - Peter Duniho