我使用以下资源创建了一个非常简单的WPF应用程序:
<Application x:Class="StyleTest.App"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml">
<Application.Resources>
<FontFamily x:Key="MainFontFamily">Calibri</FontFamily>
<Style TargetType="{x:Type TextBlock}">
<Setter Property="FontFamily" Value="{StaticResource MainFontFamily}" />
</Style>
<Style x:Key="HyperlinkLabel" TargetType="{x:Type Label}">
<Setter Property="Cursor" Value="Hand" />
<Setter Property="Foreground" Value="Yellow" />
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Foreground" Value="Red"/>
</Trigger>
</Style.Triggers>
</Style>
</Application.Resources>
TextBlock样式没有x:Key属性。我希望此属性适用于所有TextBlock。
用户界面简单:
<Window x:Class="StyleTest.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">
<Grid>
<Grid.RowDefinitions>
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Label Grid.Row="0" Grid.Column="0" Content="Test 123 Test 123" Style="{StaticResource HyperlinkLabel}" />
</Grid>
</Window>
当我运行应用程序时:
大。但如果我改变了第一种风格:
<Style TargetType="{x:Type TextBlock}">
<Setter Property="FontFamily" Value="{StaticResource MainFontFamily}" />
</Style>
到
<Style TargetType="{x:Type TextBlock}">
<Setter Property="FontFamily" Value="{StaticResource MainFontFamily}" />
<Setter Property="Foreground" Value="Blue" />
</Style>
然后,在运行应用程序时:
为什么TextBlock样式会搞乱Label样式?我好像Label继承自TextBlock。但即使是这种情况,也应该使用Label样式吗?
如何“强制”使用Label样式? Label样式如何覆盖TextBlock样式?
谢谢!
答案 0 :(得分:1)
应用于Application.Resources
等非控制项的TextBlock
中的隐式样式不尊重控制边界,并且无论存在何种其他定义,都将应用于整个应用程序。这可能是为了允许全局应用程序范围的样式,如字体,文本大小,颜色等。
解决此问题的两种解决方案:
将隐式样式更改为Label
,其继承自Control
。因为它是一个Control,所以它将尊重控制边界,而不是试图覆盖应用程序中每个文本元素的属性。
将样式移至Window.Resources
而不是Application.Resources
。这样,整个应用程序的样式不被认为是全局的,因此在决定如何呈现项目时不会这样对待。
我前面有同样的问题,这是我能给出的最好的描述。 Implicit styles in Application.Resources vs Window.Resources?:)