全局TextBlock样式混淆了命名的Label样式

时间:2016-05-26 15:50:17

标签: c# wpf xaml

我使用以下资源创建了一个非常简单的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>

当我运行应用程序时:

  1. “测试123测试123”以黄色显示。
  2. 当我将鼠标光标放在文本上时,鼠标光标图标会变为手指指针。
  3. 当我将鼠标光标放在文本上时,文本变为红色。
  4. 大。但如果我改变了第一种风格:

        <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>
    

    然后,在运行应用程序时:

    1. 文本显示为蓝色而不是黄色。这很糟糕。
    2. 当我将鼠标光标放在文本上时,鼠标光标图标会变为手指指针。没关系。
    3. 当我将鼠标光标放在文本上时,文本保持蓝色。这很糟糕。
    4. 为什么TextBlock样式会搞乱Label样式?我好像Label继承自TextBlock。但即使是这种情况,也应该使用Label样式吗?

      如何“强制”使用Label样式? Label样式如何覆盖TextBlock样式?

      谢谢!

1 个答案:

答案 0 :(得分:1)

应用于Application.Resources等非控制项的TextBlock中的隐式样式不尊重控制边界,并且无论存在何种其他定义,都将应用于整个应用程序。这可能是为了允许全局应用程序范围的样式,如字体,文本大小,颜色等。

解决此问题的两种解决方案:

  1. 将隐式样式更改为Label,其继承自Control。因为它是一个Control,所以它将尊重控制边界,而不是试图覆盖应用程序中每个文本元素的属性。

  2. 将样式移至Window.Resources而不是Application.Resources。这样,整个应用程序的样式不被认为是全局的,因此在决定如何呈现项目时不会这样对待。

  3. 我前面有同样的问题,这是我能给出的最好的描述。 Implicit styles in Application.Resources vs Window.Resources?:)