为什么我不能覆盖默认的BasedOn样式? WPF

时间:2017-09-05 14:56:15

标签: c# wpf xaml

我有一个默认的标签样式

<Style x:Key="LabelStyle" TargetType="{x:Type Label}">
<Setter Property="FontFamily" Value="Segoe UI" />
<Setter Property="FontSize" Value="13.333" />
<Setter Property="Foreground" Value="{StaticResource ForegroundBrush}" />
<Setter Property="IsTabStop" Value="False" />
<Setter Property="HorizontalContentAlignment" Value="Left" />
</Style>

<Style BasedOn="{StaticResource LabelStyle}" TargetType="{x:Type Label}" />

然后我尝试为单个标签使用不同的样式

    <Style x:Key="HeaderLabelStyle" TargetType="{x:Type Label}">
    <Setter Property="FontFamily" Value="Segoe UI" />
    <Setter Property="FontSize" Value="16" />
    <Setter Property="Foreground" Value="{StaticResource HeaderForegroundBrush}" />
    <Setter Property="IsTabStop" Value="False" />
    <Setter Property="HorizontalContentAlignment" Value="Left" />
    </Style>

<Label  Content="Text here"  Name="someName" Style="{StaticResource HeaderLabelStyle}"/>

但由于某种原因,标签总是获得默认样式。为什么?这可以被覆盖吗?

由于

1 个答案:

答案 0 :(得分:0)

所以我意识到Label的默认(字符串)模板是一个缩进的TextBlock(样式是继承的)

因为我也在为TextBlock定义一个全局样式

<Style x:Key="TextBlockStyle" TargetType="TextBlock">
<Setter Property="Foreground" Value="{StaticResource ForegroundBrush}" />
<Setter Property="FontSize" Value="13.333" />
<Setter Property="FontFamily" Value="Segoe UI" />
<Style BasedOn="{StaticResource TextBlockStyle}" TargetType="{x:Type TextBlock}" />

无论我使用多少种类型的标签,我总是必须使用TextBlock的模板

所以解决方案是定义一个虚拟的TextBlock类

namespace Theme
{
    public class HeaderTextBlock : TextBlock
    {
    }
}

然后为其指定自己的全局样式

xmlns:this="clr-namespace:Theme"
 <Style x:Key="HeaderTextBlockStyle" TargetType="this:HeaderTextBlock">
    <Setter Property="Foreground" Value="{StaticResource HeaderForegroundBrush}" />
    <Setter Property="FontSize" Value="13.333" />
    <Setter Property="FontFamily" Value="Segoe UI" />
</Style>
<Style BasedOn="{StaticResource HeaderTextBlockStyle}" TargetType="{x:Type this:HeaderTextBlock}" />

并使用TextBlocks而不是Labels(从来没有想过如何实现Label子项(Label:TextBlock)= false

xmlns:theme="clr-namespace:Theme;assembly=Theme"
<theme:HeaderTextBlock Text="Some text"  Name="titleLabel" Style="{StaticResource HeaderTextBlockStyle}"/>