覆盖应用程序范围的样式
Overriding application wide style
我想在应用程序中为文本块定义全局样式,但我也希望能够覆盖此默认样式。我一直认为样式的局部覆盖比全局样式的优先级更高,但似乎并非如此?
在下面的示例中,内容为 "Test" 的 Button 将具有 "Red" 前景,而我希望它是 "Aqua"。如果我删除 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>
App.xaml
中定义的隐式 TextBlock
不会被其他 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
样式。改为为每个 Control
定义一个默认值 Style
。
您的问题在于为 TextBlock
而不是 Button
定义应用程序级资源。大多数 WPF 控件使用 TextBlocks
作为显示文本内容的默认方式,因此通过尝试覆盖您的 Button
Foreground
,您正在这样做,但随后它再次被 [=11 覆盖=] 默认样式。
将您的 App.xaml 更改为此,您将获得想要的结果:
<Application.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property="Foreground" Value="Red" />
</Style>
</Application.Resources>
我想在应用程序中为文本块定义全局样式,但我也希望能够覆盖此默认样式。我一直认为样式的局部覆盖比全局样式的优先级更高,但似乎并非如此?
在下面的示例中,内容为 "Test" 的 Button 将具有 "Red" 前景,而我希望它是 "Aqua"。如果我删除 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>
App.xaml
中定义的隐式 TextBlock
不会被其他 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
样式。改为为每个 Control
定义一个默认值 Style
。
您的问题在于为 TextBlock
而不是 Button
定义应用程序级资源。大多数 WPF 控件使用 TextBlocks
作为显示文本内容的默认方式,因此通过尝试覆盖您的 Button
Foreground
,您正在这样做,但随后它再次被 [=11 覆盖=] 默认样式。
将您的 App.xaml 更改为此,您将获得想要的结果:
<Application.Resources>
<Style TargetType="{x:Type Button}">
<Setter Property="Foreground" Value="Red" />
</Style>
</Application.Resources>