如何设置Label的子控件的属性

How to set the properties of the child control of Label

我想更改 Border 控件的属性,它是默认 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 作为我正在尝试的基础,但它似乎对我不起作用。对我做错了什么有什么想法吗?

如果您拥有与我相同的默认 Label 模板,则 Border 具有通过属性设置的填充,由于 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" />

这适用于任何 属性,其中 BorderTemplateBindingLabel 的 属性。其他任何东西(如果 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"
                    >