【问题标题】:WPF Cannot override Button conent foregroundWPF 无法覆盖按钮内容前景
【发布时间】:2013-07-01 21:30:46
【问题描述】:

我无法让 MVVM 视图的按钮前景覆盖我在 App.xaml 中为 TextBlock 设置的默认样式。

我在 App.xaml 中设置了 TextBlock 样式,该样式将 TextBlock 的前景默认设置为 Gainsboro,如下所示:

--在App.xaml中

<!-- Default TextBlock Style-->
<Style TargetType="TextBlock">
    <Setter Property="Foreground" Value="Gainsboro" />
</Style>

我希望所有按钮的前景都不同于默认的 TextBlock。我的 MVVM 视图中的按钮布局类似于以下内容:

-- 在 myView.xaml 中

<Button Content="Scan" HorizontalAlignment="Left"  VerticalAlignment="Bottom"
        Margin="10,0,0,10" Width="85" Foreground="Black" />

遗憾的是,我的按钮不支持我明确设置的颜色,它仍然使用默认的 TextBlock 前景色。关于如何让它正常运行的任何想法?我什至尝试在按钮上设置 TextBlock.Foreground,但仍然没有乐趣。

顺便说一句,是否有在应用程序范围内设置前景色的最佳做法?我假设我的方法是可以接受的。

【问题讨论】:

    标签: wpf button resources styles


    【解决方案1】:

    这一切都回到DependencyProperty Value Precedence。不幸的是,由于ButtonTextBlock 是由ContentPresenter 生成的,因此它没有明确设置Foreground 属性。它是遗传的。列表中的方式。好消息是您可以通过将TextBlock 显式设置为Content 轻松做到这一点:

    <Button HorizontalAlignment="Left" VerticalAlignment="Bottom"
            Margin="9,0,0,9" Width="85">
        <TextBlock Foreground="Black" Text="Scan" />
    </Button>
    

    要应用全局Text 样式,您有几个选择。如果您不创建自己的主题,那么您所做的几乎是您唯一的选择。但是,如果您要重新设置控件的样式,则可以使用默认前景添加 Setter。将其设置为默认的 Window Style 也很重要,这样TextBlock 之类的东西就可以继承该值。

    在很多情况下,设置Window.Foreground 可以满足您的大部分需求。但是,一些Controls 明确地将其Foreground 设置为默认样式,因此它们不会继承您的前景。

    【讨论】:

    • 甜,成功了。知道它有一些做 DP 依赖。只是没有想。我应该想到的。谢谢!!!
    • 哦,至于我的另一个问题,在全局资源字典中全面设置默认字体属性是标准做法吗?
    • @KyleLib 我已经更新了答案以提供一些提示。
    • 谢谢,我最终计划实现主题,但我正在寻找描述使用它们的体面资源。
    猜你喜欢
    • 2013-08-20
    • 1970-01-01
    • 2011-05-24
    • 2023-03-14
    • 1970-01-01
    • 2019-07-04
    • 2014-10-14
    • 1970-01-01
    • 2017-09-20
    相关资源
    最近更新 更多