我真的想知道为什么下面的代码使得WPF中的颜色或按钮内容也是橙色的,因为它明确地仅针对Textblock。当我将目标更改为按钮时,它工作正常,仅适用于按钮内容而不是文本块。为什么这种奇怪的行为?
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="orange" />
</Style>
答案 0 :(得分:1)
基本上,您在WPF Window
中看到的大部分文字最终都会转换为TextBlock
。如果您指定<Button Content="ABC"/>
,当<TextBlock Text="ABC"/>
创建可视树时,WPF实际执行的操作会将Button.Content
放入ContentPresenter
。因此,您的隐式样式不适用于Button
,而是适用于TextBlock
,这是其内容的一部分。
在WPF控件中,其默认模板是由其他控件构建的从其他控件构建,直到最终每个文本都以TextBlock
结束,这就是Microsoft将保护放在适当位置的原因,通常隐式Style
仅在模板中应用于从System.Windows.Controls.Control
继承的元素以保护最基本的直接从TextBlock
继承的System.Windows.FrameworkElement
等元素,在不知不觉中应用了可能导致不良行为,性能问题或错误的复杂样式。因此,您是在TextBlock
或其中一个子项中指定隐式Window.Resources
样式,它不会自动应用于模板中,而Button
将保留默认颜色,除非您将其移至Application.Resources
,然后它也会应用于模板中,您的Button
文字将变为橙色。