wpf中的样式仅针对文本块时,也会自动将相同的样式应用于按钮内容

时间:2013-07-02 03:17:33

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

enter image description here我真的想知道为什么下面的代码使得WPF中的颜色或按钮内容也是橙色的,因为它明确地仅针对Textblock。当我将目标更改为按钮时,它工作正常,仅适用于按钮内容而不是文本块。为什么这种奇怪的行为?

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

1 个答案:

答案 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文字将变为橙色。