样式<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
继承自FrameworkElement
and 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
,例如ComboBoxItems
a 内的文本ComboBox
在子控件中使用的ATextBlock
将应用TextBlock
from 的样式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>