首页 > 解决方案 > WPF - 覆盖子/内部控件上的继承样式

问题描述

所以这个特定的答案似乎部分有效: 重置继承的 WPF 样式?

但是,它似乎并没有覆盖“内部”元素的样式。例如,如果我在主 App.xaml 文件中将 TextBlock Foreground 设置为红色,它将更改所有 TextBlock 元素,但它也会影响具有内部/模板化控件的控件,例如 Button 元素的文本。

当我稍后尝试覆盖样式时,它只会影响直接的 TextBlock 元素。按钮似乎仍然使用 App.xaml 中的红色文本样式。

在 App.xaml 中:

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

MainWindow.xaml 内容(两个控件都显示红色文本):

<StackPanel>
    <TextBlock>Hello World! I should be red!</TextBlock>
    <Button Click="Button_Click" Content="I'm red, too. Click me to open a new Popup!" />
</StackPanel>

Button_Click 事件:

private void Button_Click(object sender, RoutedEventArgs e)
{
    var x = new Popup();
    x.Show();
}

和 Popup.xaml:

<Window.Resources>
    <Style TargetType="{x:Type TextBlock}">
        <Setter Property="Foreground" Value="Blue" />
    </Style>
</Window.Resources>
<StackPanel>
    <TextBlock>Hello World, I'm blue!</TextBlock>
    <Button Content="Oh no! I should be blue, too, but I'm red!" />
</StackPanel>

结果: 显示带有红色文本的弹出窗口按钮的屏幕截图

如何使 Popup.xaml 中的样式与 App.xaml 中的相同样式具有相同程度的影响?

编辑:我应该注意到,这里真正的潜在动机是我为企业应用程序构建插件。基本应用程序有很多样式可以继承到我的插件中,我正在尝试想出一个“重置所有样式”资源字典,但是当我有像 DataGrids 这样的东西时,内容元素不会被重置 -它们从基本应用程序继承样式,我正在尝试找到一种有效的方法来重置它们而不会过于明确。

标签: c#wpfxaml

解决方案


我认为这篇文章解释了您正在经历的事情,以及为什么样式继承的优先级与您预期的不同。

在这里您可以找到有关依赖属性优先级的信息。

据我所知,保持这样的一般样式不影响子元素的唯一方法是明确设置它们的样式。(不是一个好方法)


推荐阅读