【问题标题】:Apply default WPF style应用默认 WPF 样式
【发布时间】:2009-06-03 16:14:04
【问题描述】:

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

有什么想法吗?谢谢。

【问题讨论】:

    标签: wpf styles


    【解决方案1】:

    有几种方法可以做到这一点。如果您查看 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" />
    

    【讨论】:

    • 在您的示例中,我不想指定“蓝色”。我想做类似 的事情。我希望它的默认值没有明确表示 Value="Black"。
    • 啊,确实有点不同。我将编辑我的答案来处理这种情况。
    • 原来我的问题与我描述的有点不同。这实际上是在 ListView 中将样式应用于 TextBoxes 的问题。但我会接受这个答案给你一些果汁,因为你解释得很好。谢谢!
    • 谢谢,很高兴解决了。另外,我找到了一种更好的方法来分配样式的 BasedOn 属性。如果您使用 BasedOn="{StaticResource {x:Type TextBox}}" 那么样式将自动基于该类型的默认应用样式。我认为这比在我的第一个代码示例中创建两种样式要好得多。
    • 非常感谢您添加关于BasedOn="{StaticResource {x:Type TextBox}}" 的评论。我试图找到两种方法的替代方法(您的实际答案显示),并偶然发现了这里的问答。您上面的评论正是提供了我需要的提示!恕我直言,您应该将该详细信息添加到答案本身中(也许也可以将两种样式的方法作为示例,这可能会帮助其他人更容易地找到此答案)。
    猜你喜欢
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 2015-09-05
    • 2017-10-11
    • 2011-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多