0

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

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

4

1 回答 1

0

样式<Application.Resources>适用于整个应用程序,并不总是遵循默认样式查找规则。

通常,如果您不想要这种行为,请<Window.Resources>改为使用样式,这样它们将仅适用于窗口内的对象,并且将使用正常的样式查找规则。

默认情况下,样式不会跨控件/模板边界应用,但继承自 的对象的样式除外Control,后者是大多数默认 WPF 控件,例如LabelTextBox

因此,您可以设置Control对象中任何对象的样式,.Resources使其应用​​于所有子对象:

<UserControl.Resources>
    <Style TargetType="{x:Type Label}">
        <Setter Property="Foreground" Value="Red" />
    </Style>
</UserControl.Resources>

但是TextBlock继承自FrameworkElementand not Control,因此 a 的样式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,例如ComboBoxItemsa 内的文本ComboBox

在子控件中使用的ATextBlock将应用TextBlockfrom 的样式Application.Resources,但不会应用 from,<UserControl.Resources>因为在中定义的 TextBlock 样式Application.Resources将跨越控件/模板边界,而在任何其他中定义的 TextBlock 样式X.Resources则不会。

在这些特定情况下,您可能需要追踪x:Static用于设置TextBlock.Text颜色的画笔键并覆盖您的ComboBox.Resources.

(我在这里可能有错误的SystemColors键)

<ComboBox.Resources>
    <SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black" />
</ComboBox.Resources>
于 2013-01-07T16:07:36.660 回答