WPF-在子/内部控件上覆盖继承的样式

时间:2019-04-04 15:03:11

标签: c# wpf xaml

因此,这个特定答案似乎部分起作用: Reset inherited WPF style?

但是,似乎并没有覆盖“内部”元素的样式。例如,如果我在主App.xaml文件中将TextBlock前景设置为红色,它将更改所有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>

结果: Screenshot showing the Popup window button having red text

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

编辑:我应该注意,这里的真正潜在动机是我为企业应用程序构建插件。基本应用程序具有很多样式,这些样式都可以保留到我的插件中,并且我试图提供“重置所有样式”资源字典,但是当我拥有DataGrids之类的内容时,内容元素不会被重置-它们是从基本应用程序继承样式,而我正在尝试找到一种有效的重置样式的方法,而又不过分露骨。

1 个答案:

答案 0 :(得分:1)

我认为this article解释了您的经历,以及为什么样式继承的优先级与您期望的不同。

在这里您可以找到有关dependency property precedence的信息。

据我所知,保持这样的通用样式不影响子元素的唯一方法是显式地设置它们的样式。 (不是很好的方法)