2011-02-02 56 views
6

自从我开始使用MS的控件模板示例作为构建自定义控件的基础之后,我一直在想这一点。为什么在xaml,WPF中的样式中定义模板?

采取标签例子如: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> 

然后叫作为模板直接,而不是通过样式属性?

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

(NB!不要告诉我这是由于水平和垂直对齐制定者,我们都知道这些都是一个标签的默认值,这是基本没用,如果你让那些值)

回答

8

无使用样式无法自动将模板分配给特定控件类型的所有实例。为控制模板设置x:Key="{x:Type Label}"确实不是将此模板自动应用于类型为的所有控件标签

,您可以拨打风格通过设置TargetTypeButton适用于在视觉树下面声明​​的所有按钮,但你不能做同样的模板,如果你不把它包装一个风格内该模板具有Setter

另外请注意,在你的例子仿佛省略x:Key定义x:Key设置为TargetType可以交换

<Style x:Key="{x:Type Label}" TargetType="Label"> 

随着

<Style TargetType="Label"> 

+0

oy,虽然它对模板和样式的工作方式相同。我会尽我所能去亲眼看到它(我无法相信这两种行为会有所不同......)至于你答案的第二部分,我不得不不同意(你在这个问题上看到了我的另一个问题) 。仍然没有找到一个有效的解释,我得到的行为,但删除x:键并不总是工作,因为它应该(至少对我来说)... – David 2011-02-02 09:22:32

相关问题