假设我在应用程序级别为TextBlock定义了一个样式,我还在应用程序级别为使用某些TextBlocks的'DataClass'定义了一个DataTemplate。现在,在应用程序的某个子部分中,我想重新定义TextBlock的外观,我可以重新定义TextBlock的样式。
这里的问题是:如果DataTemplate应用于应用程序的这个子部分,那么里面的所有TextBlocks仍将使用应用程序级TextBlock样式(而不是我重新定义的版本)。有谁知道如何重新定义DataTemplate的风格?
答案 0 :(得分:0)
<Application.Resources>
中的样式适用于整个应用程序,并不总是遵循默认样式查找规则。
通常,如果您不想要这种行为,请将样式放在<Window.Resources>
中,这样它们只会应用于窗口内的对象,并将使用正常的样式查找规则。
默认情况下,样式不会跨控件/模板边界应用,除了,用于继承自Control
的对象的样式,这些是大多数默认的WPF控件,例如{{1} }或Label
。
因此,您可以在对象的TextBox
中设置任何Control
对象的样式,以使其适用于所有子对象:
.Resources
但<UserControl.Resources>
<Style TargetType="{x:Type Label}">
<Setter Property="Foreground" Value="Red" />
</Style>
</UserControl.Resources>
继承自TextBlock
而非FrameworkElement
,因此Control
的样式不会跨模板边界应用。
如果您确实希望将样式保留在TextBlock
中,则必须在创建Application.Resources
之前在可视树下覆盖该样式的属性,例如
TextBlock
但是,此样式不会应用于<UserControl x:Class="MyNamespace.MyDataTypeView"... >
<UserControl.Resources>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="Foreground" Value="Black" />
</Style>
</UserControl.Resources>
<TextBlock Text="Test" />
</UserControl>
中其他控件内的对象,例如UserControl
ComboBoxItems
的文本
在子控件中使用的ComboBox
将应用来自TextBlock
的{{1}}样式,但不会应用TextBlock
,因为Application.Resources
中定义的TextBlock样式将会交叉控件/模板边界,而在任何其他<UserControl.Resources>
中定义的TextBlock样式不会。
在这些特定情况下,您可能需要跟踪用于设置Application.Resources
颜色的X.Resources
刷子键并覆盖x:Static
中的颜色,例如
(我这里可能有错误的SystemColors键)
TextBlock.Text