如何设置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" />
这适用于任何 属性,其中 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"
>
我想更改 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" />
这适用于任何 属性,其中 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"
>