<Application.Resources> 中的样式适用于整个应用程序,并不总是遵循默认样式查找规则。
通常,如果您不希望出现这种行为,请将样式放在 <Window.Resources> 中,这样它们将仅适用于您窗口内的对象,并且将使用正常的样式查找规则。
默认情况下,样式不会跨控件/模板边界应用,除了用于继承自 Control 的对象的样式,这是大多数默认 WPF 控件,例如 Label 或 @987654327 @。
因此,您可以在对象的.Resources 中设置任何Control 对象的样式,以使其应用于所有子对象:
<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 中另一个控件内的对象,例如 ComboBox 内的 ComboBoxItems 文本
在子控件中使用的TextBlock 将应用来自Application.Resources 的TextBlock 样式,但不会应用来自<UserControl.Resources> 的样式,因为Application.Resources 中定义的TextBlock 样式将跨越控件/模板边界,而定义的TextBlock 样式在任何其他X.Resources 不会。
在这些特定情况下,您可能需要追踪x:Static 刷子键用于设置TextBlock.Text 颜色并覆盖您的ComboBox.Resources,例如
(我可能在这里输入了错误的SystemColors 键)
<ComboBox.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.ControlTextBrushKey}" Color="Black" />
</ComboBox.Resources>