自从我开始使用MS的控件模板示例作为构建自定义控件的基础以来,我一直在想这个。
以Label示例为例:http://msdn.microsoft.com/en-us/library/ms752327.aspx
为什么它的定义如下:
<Style x:Key="{x:Type Label}" TargetType="Label">
<Setter Property="HorizontalContentAlignment" Value="Left" />
<Setter Property="VerticalContentAlignment" Value="Top" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Label">
<Border>
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
RecognizesAccessKey="True" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground">
<Setter.Value>
<SolidColorBrush Color="{DynamicResource DisabledForegroundColor}" />
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
并不直接这样:
<ControlTemplate x:Key="{x:Type Label}" TargetType="Label">
<Border>
<ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
RecognizesAccessKey="True" />
</Border>
<ControlTemplate.Triggers>
<Trigger Property="IsEnabled" Value="false">
<Setter Property="Foreground">
<Setter.Value>
<SolidColorBrush Color="{DynamicResource DisabledForegroundColor}" />
</Setter.Value>
</Setter>
</Trigger>
</ControlTemplate.Triggers>
</ControlTemplate>
然后直接调用模板而不是通过样式属性?
我有没有看到做这样事情的隐藏原因?或者它只是一种做事方式,就是这样吗?
(注意:不要告诉我这是因为水平和垂直对齐设置器!我们都知道这些是标签的默认值,如果保留这些值,这基本上没用)
答案 0 :(得分:8)
如果不使用 Style ,则无法自动将模板分配给特定控件类型的所有实例。为控件模板设置x:Key="{x:Type Label}"
不会自动将此模板应用于 Label 类型的所有控件。
通过将TargetType
设置为Button
,您可以将样式应用于可视树中声明下方的所有按钮,但如果不这样做,则不能对模板执行相同操作将其包装在 Style 中,该 Style 包含模板的 Setter 。
另请注意,在您的示例中,您可以交换
<Style x:Key="{x:Type Label}" TargetType="Label">
使用
<Style TargetType="Label">
如果省略x:Key
定义,TargetType
设置为x:Key
。