样式<Application.Resources>适用于整个应用程序,并不总是遵循默认样式查找规则。
通常,如果您不想要这种行为,请<Window.Resources>改为使用样式,这样它们将仅适用于窗口内的对象,并且将使用正常的样式查找规则。
默认情况下,样式不会跨控件/模板边界应用,但继承自 的对象的样式除外Control,后者是大多数默认 WPF 控件,例如Label或TextBox。
因此,您可以设置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>