应用默认的WPF样式

13

我有一个全局样式,设置了所有TextBox的样式,但在某些情况下,我只想将文本颜色还原为原始非自定义样式的颜色。我尝试在特定的TextBoxes内使用{TemplateBinding Foreground}来还原,但它并不是有效的XAML语法,而且我也不确定那是否正确的方法。

有什么好的主意吗?谢谢。

1个回答

17

有几种方法可以实现这个。如果您查看 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" />

1
在您的示例中,我不想指定“Blue”。我想要做类似于<Setter Property="Foreground" Value="{TemplateBinding Foreground}" />的事情。我希望默认设置为未明确说明Value="Black"。 - xanadont
啊,确实有点不同。我会编辑我的答案来处理那种情况。 - rmoore
事实证明,我的问题与我所描述的有些不同。它实际上是一个样式应用于 ListView 中的 TextBoxes 的问题。但是,我会接受这个答案,以便给你一些 SO(Stack Overflow)的声望,因为你解释得非常好。谢谢! - xanadont
谢谢,很高兴问题解决了。另外,我发现一种更好的方法来分配样式的BasedOn属性。如果使用BasedOn = "{StaticResource {x:Type TextBox}}",那么该样式将自动基于该类型的默认应用样式。我认为这比在我的第一个代码示例中创建两个样式要好得多。 - rmoore
非常感谢您添加关于 BasedOn="{StaticResource {x:Type TextBox}}" 的注释。我一直在寻找替代两种样式方法的方法(您实际的答案显示了这一点),并偶然发现了这里的问答。您上面的评论提供了我所需的提示!在我看来,您应该将该细节添加到答案本身中(也许同时保留两种样式方法作为示例,这可能有助于其他人更轻松地找到此答案)。 - Peter Duniho

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接