为什么在xaml,WPF中的样式中定义模板?

时间:2011-02-02 09:11:54

标签: wpf templates xaml styles

自从我开始使用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>

然后直接调用模板而不是通过样式属性?

我有没有看到做这样事情的隐藏原因?或者它只是一种做事方式,就是这样吗?

(注意:不要告诉我这是因为水平和垂直对齐设置器!我们都知道这些是标签的默认值,如果保留这些值,这基本上没用)

1 个答案:

答案 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