【问题标题】:style in wpf when targeted only on textblock, also applies same style to button contents automaticallywpf 中的样式仅针对文本块时,也会自动将相同的样式应用于按钮内容
【发布时间】:2013-07-02 03:17:33
【问题描述】:

我真的很想知道为什么下面的代码在 WPF 中使颜色或按钮内容也变成橙色,而它显然只针对 Textblock。当我将目标更改为按钮时,它工作正常并且仅应用于按钮内容而不应用于文本块。为什么会出现这种奇怪的行为?

<Style TargetType="{x:Type TextBlock}">
            <Setter Property="Foreground" Value="orange" />
</Style>

【问题讨论】:

  • 您好像忘记添加代码了 :)
  • @nakiya: 否 :( 抱歉,我不知道 Stackoverflow 的技术问题是什么。我确实添加了代码,但它没有显示。即使我现在编辑了,它也会显示在编辑位置,但现在一旦我提交。对你来说,代码是:
  • 因为Button 包含TextBlock。您可能希望将您的样式(或至少您样式的大部分方面)定位在比TextBlock 更高的级别,例如Label
  • @Divine:这不是 stackoverflow 问题。代码缩进 4 个空格。
  • 抱歉,我现在可以看到该行为。

标签: c# .net wpf c#-4.0 mvvm


【解决方案1】:

基本上,您在 WPF Window 中看到的大部分文本最终都会转换为 TextBlock。如果你指定&lt;Button Content="ABC"/&gt; WPF 实际上会做的是在ContentPresenter 创建可视化树时将&lt;TextBlock Text="ABC"/&gt; 放入Button.Content。因此,您的隐式样式不适用于 Button,但适用于 TextBlock,这是其内容的一部分。

在 WPF 中,控件具有其默认模板,该模板是从其他控件构建的,该模板可以从其他控件构建,直到最终每个文本都以TextBlock 结尾,这就是为什么Microsoft 设置保护的原因,并且通常隐式Style 在模板中仅应用于从System.Windows.Controls.Control 继承的元素,以保护大多数基本元素,如TextBlock,直接从@ 继承987654323@,因为在不知不觉中应用了可能导致不良行为、性能问题或错误的复杂样式。因此,您是在Window.Resources 中指定隐式TextBlock 样式,还是在其子项之一中指定,它不会在模板中自动应用,并且您的Button 将保持默认颜色,除非您将其移至Application.Resources那么它也将应用于模板,您的 Button 文本将变为橙色。

【讨论】:

  • 嗨,DK,这是一个非常令人信服的答案,我能理解。非常感谢你用简单的英语向我解释,我可以咀嚼。现在,如果有人问我这种行为或问题,我可以解释一下。正如你所提到的,我会尝试将它保存在 Windows.Resources 中,看看我是否得到了默认的东西。但是作为初学者,我不知道该怎么做,我会阅读一些博客。再次感谢,感谢您非常谦虚的回复。干杯
  • DK,有没有办法让我看到每个控件或类的可视化树?我是新手,我不知道如何在 VS 中查看可视化树,尤其是对于这些 WPF 控件。请在您方便的时候指导我。谢谢
  • @Divine,例如在 Click 事件上放置一个断点,在调试器中悬停 sender 变量并单击放大镜图标,它应该会显示当前的可视化树。您也可以从即时窗口进行操作
  • 嗨 Dkozl,谢谢你的帮助,我已经粘贴了上面的图片,你能告诉我我是否在 Visual tree (Encircled) 的 Button 下找到了正确的文本块吗?你说的是这个吗?
  • 是的,这是由ContentPresenter 创建的TextBlock,它是默认模板的一部分,用于容纳您的文本
猜你喜欢
  • 1970-01-01
  • 2017-12-30
  • 1970-01-01
  • 2019-10-17
  • 1970-01-01
  • 2012-06-06
  • 1970-01-01
  • 2012-08-23
  • 2011-04-13
相关资源
最近更新 更多