覆盖应用程序的广泛风格

时间:2017-09-15 13:26:11

标签: wpf xaml app.xaml

我想在应用程序中为textblock定义一个全局样式,但我也希望能够覆盖这个默认样式。我一直认为风格的局部覆盖比全局风格更优先,但似乎并非如此?

在下面的示例中,当我希望它为“Aqua”时,内容为“Test”的Button将具有“Red”前景。如果我删除Application.Resources中的全局样式,那么它将起作用。我错过了什么吗?

的App.xaml

<Application x:Class="ContextMenuTest.App"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         StartupUri="MainWindow.xaml">
<Application.Resources>
    <Style TargetType="{x:Type TextBlock}">
        <Setter Property="Foreground" Value="Red" />
    </Style>
</Application.Resources>

MainWindow.xaml

<Window x:Class="ContextMenuTest.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="MainWindow" Height="350" Width="525">
<Window.Resources>
    <Style TargetType="{x:Type MenuItem}" x:Key="DefaultMenuItemStyle">
        <Setter Property="Foreground" Value="DarkGreen" />
    </Style>

    <Style TargetType="{x:Type Button}" x:Key="DefaultButtonStyle">
        <Setter Property="Foreground" Value="DarkGreen" />
    </Style>
</Window.Resources>

<Grid Background="Black">
    <Grid.ContextMenu>
        <ContextMenu>
            <MenuItem Header="Menu 1" Style="{StaticResource DefaultMenuItemStyle}" />
            <MenuItem Header="Menu 2" Style="{StaticResource DefaultMenuItemStyle}" />
            <MenuItem Header="Menu 3" Style="{StaticResource DefaultMenuItemStyle}" />
            <MenuItem Header="Menu 4" Style="{StaticResource DefaultMenuItemStyle}" />
            <MenuItem Header="Menu 5" Style="{StaticResource DefaultMenuItemStyle}" />
        </ContextMenu>
    </Grid.ContextMenu>

    <Button Content="Test" Style="{StaticResource DefaultButtonStyle}" Foreground="Aqua" />
</Grid>

2 个答案:

答案 0 :(得分:1)

TextBlock中定义的隐式App.xaml不会被其他TextBlock样式覆盖。因此,建议您将默认的TextBlock样式移至例如<Window.Resources>

有关此内容的详情,请参阅以下链接。

Implicit styles in Application.Resources vs Window.Resources?

覆盖App.xaml中的“属性”设置: https://social.msdn.microsoft.com/Forums/vstudio/en-US/f6822a5e-09c7-489b-b85d-833f1f9356dc/over-ride-the-property-setting-in-appxaml?forum=wpf

或者只是不定义任何隐式TextBlock样式。相反,为每个Style定义默认Control

答案 1 :(得分:0)

您的问题在于为TextBlock而不是Button定义应用级资源。大多数WPF控件都使用TextBlocks作为显示文本内容的默认方式,因此尝试覆盖Button Foreground时,您正在执行此操作,但随后它会被{{1默认样式。

将您的App.xaml更改为此,您将获得想要实现的结果:

TextBlock