重新定义datatemplate样式

时间:2013-01-07 15:40:17

标签: wpf styles datatemplate

假设我在应用程序级别为TextBlock定义了一个样式,我还在应用程序级别为使用某些TextBlocks的'DataClass'定义了一个DataTemplate。现在,在应用程序的某个子部分中,我想重新定义TextBlock的外观,我可以重新定义TextBlock的样式。

这里的问题是:如果DataTemplate应用于应用程序的这个子部分,那么里面的所有TextBlocks仍将使用应用程序级TextBlock样式(而不是我重新定义的版本)。有谁知道如何重新定义DataTemplate的风格?

1 个答案:

答案 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