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

Dav*_*vid 8 wpf xaml templates 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>
Run Code Online (Sandbox Code Playgroud)

而不是直接这样:

<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>
Run Code Online (Sandbox Code Playgroud)

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

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

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

Øyv*_*hen 8

如果不使用样式,则无法自动将模板分配给特定控件类型的所有实例.x:Key="{x:Type Label}"控件模板的设置不会自动将此模板应用于Label类型的所有控件.

您可以通过设置TargetTypeto来将样式应用于可视化树中声明下方的所有按钮Button,但如果不将其包含在具有模板SetterStyle中, 则不能对模板执行相同操作.

另请注意,在您的示例中,您可以进行交换

<Style x:Key="{x:Type Label}" TargetType="Label">
Run Code Online (Sandbox Code Playgroud)

<Style TargetType="Label">
Run Code Online (Sandbox Code Playgroud)

由于x:Key被设定为TargetType如果x:Key省略定义.