如何设置Label

时间:2017-06-14 15:14:32

标签: wpf wpf-style

我想更改作为默认Label控件的子控件的Border控件的属性。我有以下样式,除了边框控件的更改之外的所有内容都显示在UI

<Style x:Key="StandardLabel" TargetType="{x:Type Label}" BasedOn="{StaticResource {x:Type Label}}">
    <Setter Property="HorizontalAlignment" Value="Center" />
    <Setter Property="ContentStringFormat" Value="{}{0:0.000}"/>
    <Setter Property="Height" Value="25"/>
    <Setter Property="Margin" Value="0"/>
    <Style.Resources>
        <Style TargetType="{x:Type Border}" >
            <Setter Property="Padding" Value="3"/>
        </Style>
    </Style.Resources>
</Style>

我用这个answer作为我尝试的基础,但它似乎对我不起作用。对我做错了什么的想法?

1 个答案:

答案 0 :(得分:1)

如果您拥有与我相同的默认Label模板,则边框会通过属性设置填充,由于dependency property value precedence,该属性将覆盖样式中的任何内容。

<ControlTemplate TargetType="{x:Type Label}">
    <Border 
        BorderBrush="{TemplateBinding BorderBrush}" 
        BorderThickness="{TemplateBinding BorderThickness}"
        Background="{TemplateBinding Background}" 
        Padding="{TemplateBinding Padding}" 
        SnapsToDevicePixels="true"
        >

但是,请查看该属性使用的值:Padding="{TemplateBinding Padding}"

所以它会使用其模板化父级所拥有的Padding。这是Label。所以这应该做你想要的:

<Style x:Key="StandardLabel" TargetType="{x:Type Label}" BasedOn="{StaticResource {x:Type Label}}">
    <Setter Property="Padding" Value="3" />

这适用于Border TemplateBinding属性为Label的任何属性。其他任何事情(如果Border有任何有用的属性尚未考虑),您可以使用本地隐式样式方法;我使用默认样式的副本对其进行了测试,并从模板中的Border中删除了Background属性:

<Style x:Key="LabelStyle1" TargetType="{x:Type Label}" BasedOn="{StaticResource {x:Type Label}}">
    <Style.Resources>
        <Style TargetType="Border">
            <Setter Property="Background" Value="LightSkyBlue" />
        </Style>
    </Style.Resources>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type Label}">
                <Border 
                    BorderBrush="{TemplateBinding BorderBrush}" 
                    BorderThickness="{TemplateBinding BorderThickness}" 
                    Padding="{TemplateBinding Padding}" 
                    SnapsToDevicePixels="true"
                    >