c# - WPF中的样式仅当针对文本 block 时,也会自动将相同样式应用于按钮内容

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

我真的想知道为什么下面的代码将WPF中的颜色或按钮内容也明确地仅指定为Textblock时,却将其变成橙色。当我将目标更改为按钮时,它可以正常工作,并且仅适用于按钮内容而不适用于文本块。为什么会有这种奇怪的行为?

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

最佳答案

基本上,您在WPF中看到的大多数文本Window最终都会转换为TextBlock。如果指定<Button Content="ABC"/>,则WPF实际执行的操作是在<TextBlock Text="ABC"/>创建可视树时将Button.Content放入ContentPresenter中。因此,您的隐式样式不适用于Button,而是适用于TextBlock,它是其内容的一部分。在WPF控件中,其默认模板是从其他控件构建的,而其他控件可以从其他控件构建,直到最终每个文本最终都变成TextBlock,这就是Microsoft的原因设置保护,通常隐式Style仅在模板中应用到从 System.Windows.Controls.Control 继承的元素上,以保护大多数基本元素(例如 TextBlock )(直接从 System.Windows.FrameworkElement 继承),避免在不知不觉中应用可能导致不必要的行为,性能问题或错误的复杂样式。因此,如果您在TextBlock或其子项之一中指定隐式Window.Resources样式,则该样式将不会自动应用于模板中,并且Button将保持默认颜色,除非将其移动到Application.Resources中,然后它也将应用于模板和您的Button文本将变为橙色。

关于c# - WPF中的样式仅当针对文本 block 时,也会自动将相同样式应用于按钮内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17416873/

相关文章:

c# - NET 5 是否有用于存储地理定位数据的类?

c# - 如何只从网站上删除 <body> 标签

C#,如何在读取 Ace.OleDB 时更改数据类型

c# - 是否可以从另一个类中引用 MainWindow.cs?

c# - 动态添加点击事件

C# IDictionary.Keys 和 IDictionary.Values : what is the most optimal implementation?

javascript - 正则表达式帮助 : add 24-hour to expression

wpf - 如何关闭由ViewModel命令产生的线程的窗口? [复制]

c# - 将数据从一个数据库复制到另一个数据库 - 内存不足异常

c# - ASP.NET Core Identity 中的两个身份验证 cookie