2011-05-26 46 views
46

您能告诉我样式和控制模板之间的主要区别是什么? 何时或为什么要使用其中一种?样式和控制模板之间的区别

对我而言,他们正是相同。因为我是初学者,我认为我错了,因此我的问题。

+1

相关:[ItemTemplate vs ControlTemplate](http://stackoverflow.com/questions/575389/itemtemplate-vs-controltemplate) – Helen 2012-03-12 13:36:55

+2

MSDN资源,样式和模板之间的区别:http://msdn.microsoft.com/ en-us/library/cc295273%28v = expression.40%29.aspx – 2014-06-19 20:13:09

回答

23

没有的确是你错了。 样式在控件上设置属性ControlTemplate是大多数控件共享的属性,这些控件指定了它们的呈现方式。

详细说明,您可以使用样式来为一组属性分组设置,以便您可以重复使用该样式来标准化您的控件。样式可以在控件上明确设置,也可以应用所有类型的样式。

控件模板可以通过样式设置,也可以通过在控件上显式设置来改变它的显示方式。所有的控件都有嵌入.net wpf程序集的默认模板(以及相关的样式)。看到这些并理解wpf开发人员如何实现所有控件的正常版本是非常有启发性的。如果安装了Expression混合,请查看其“SystemThemes”文件夹。

UPDATE:

要了解如何样式和CONTROLTEMPLATES可以在 “添加控件”。以某种方式,ControlTemplate是定义控件的唯一方法,控件由组成。但是,某些默认的.net控件允许您使用控件代替文本。

例如:

<GroupBox> 
    <GroupBox.Header> 
    <CheckBox/> 
    </GroupBox.Header> 
</GroupBox> 

这种“增加了”一个复选框组框不改变ControlTemplate,但这是因为GroupBox默认ControlTemplate允许任何作为标题。这是通过使用诸如ContentPresenter等特殊控件完成的。

但是,有时控件的默认ControlTemplate不允许您通过属性更改要更改的内容。然后,您必须更改ControlTemplate。

无论您直接或通过样式设置控件的属性(内容,标题,ControlTemplate,IsEnabled等)都无关紧要,样式只是一种方便。

希望这能更清楚地回答你的问题。

+1

好的,但在我工作的项目中,两者都用于将其他控件添加到某些控件...并且还设置属性...所以我没有看到他们使用的区别? ? ? – 2011-05-26 09:19:42

53

在您设置控件属性的样式中。

<Style x:Key="MyButtonStyle" TargetType="Button"> 
    <Setter Property="Background" Value="Red"/> 
</Style> 

<Button Style="{StaticResource MyButtonStyle}"/> 

所有使用此风格的按钮都将背景设置为红色。

在模板中,您可以定义控件的UI(结构)。

<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button"> 
    <Grid> 
     <Rectangle Fill="Green"/> 
     <ContentPresenter/> 
    </Grid> 
</ControlTemplate> 

<Button Template="{StaticResource MyButtonTemplate}"/> 

所有使用此模板的按钮都将具有无法更改的绿色背景。

设置在模板中的值只能替换为替换整个模板。 风格中的值可以通过在使用控件时明确设置值来替换。这就是为什么通过使用TemplateBinding而不是编码值来更好地使用控件的属性。

<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button"> 
    <Grid> 
     <Rectangle Fill="{TemplateBinding Background}"/> 
     <ContentPresenter/> 
    </Grid> 
</ControlTemplate> 

现在模板使用它应用到按钮的背景属性的值,因此它可定制:

<Button Template="{StaticResource MyButtonTemplate}" Background="Yellow"/> 

另一个有用的功能是控制可以拿起一个默认样式而没有分配给他们的特定风格。你不能用模板做到这一点。

只需删除样式的x:Key属性(再次:您不能使用模板执行此操作)。样式下的可视化树中的所有按钮都将应用此样式。

结合模板和样式是额外的强大:

<Style TargetType="Button"> 
    <Setter Property="Background" Value="Red"/> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <Grid> 
        <Rectangle Fill="{TemplateBinding Background"/> 
        <ContentPresenter/> 
       </Grid> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 
+3

所以,你的例子恰好符合我想知道的问题...控制模板和只能清除一个控制模板的样式之间有什么区别?始终用Styles封装controltemplate常见? – 2011-05-26 09:22:53

13

你能想到的一种风格,因为一组属性值适用于多于一个方便的方法:你可以在样式设置模板属性元件。您可以通过直接在每个TextBlock元素上设置属性(如FontSize和FontFamily)来更改默认外观。但是,如果您希望TextBlock元素共享某些属性,则可以在XAML文件的参考资料部分创建一个样式。

另一方面,ControlTemplate指定控件的视觉结构和视觉行为。您可以通过给它一个新的ControlTemplate来自定义控件的外观。当您创建ControlTemplate时,您将替换现有控件的外观而不更改其功能。例如,您可以将应用程序中的按钮替换为默认的方形,但按钮仍然会引发Click事件。

编号:http://msdn.microsoft.com/en-us/library/ms745683.aspx

0

OK,我有相同的问题,我在此线程中找到的答案,我指出了正确的方向,所以我分享,如果只有这样我能更好地理解它自己。

样式比ControlTemplate更灵活。

的Windows Presentation Foundation偷跑,亚当森和帮派(作家)的状态是:

  • “除了[使用样式的控件模板制定者与风格]任意属性模板相结合的方便设置,这样做有[设置一个风格的ControlTemplate二传手]重要的优点:

    1. 它给你的默认模板的效果。例如,当一个类型样式被应用到埃尔默认情况下,并且该样式包含自定义控件模板,则控件模板将在没有任何明确标记的情况下应用于这些元素。
    2. 它使您能够提供控制模板外观的默认但可覆盖的属性值。换句话说,它使您能够尊重模板父级的属性,但仍然提供您自己的默认值。“

换句话说,营造出风格允许样式的模板二传手覆盖值设置,即使他们没有使用(例如{TemplateBinding宽度})一个TemplateBinding的用户。如果你在样式中对宽度进行了硬编码,Style的用户仍然可以覆盖它,但是如果在模板中对该Width属性进行了硬编码,则用户会被卡住。

此外,(这有点令人困惑)使用带有TemplateBinding的ContentTemplate,用户可以使用该属性来设置该属性,否则它将使用TargetType的默认属性。如果使用样式,则可以覆盖默认属性通过使用该属性的setter,然后将TemplateBinding引用返回给该设置器,来创建TargetType。这本书更好的解释了它,338页(混合模板与样式)

2

我发现了一些有趣的差异在 The difference between styles and templates (msdn)

风格: 您可以设置只有预先存在中的样式属性。例如,您不能为属于您添加到模板的新零件的属性设置默认值。

模板: 当你修改模板,您可以访问控制当你修改样式比的更多部分。例如,您可以更改弹出列表在组合框中的显示方式,或者通过修改项目模板来更改触发组合框中弹出列表的按钮的外观。


风格: 可以使用样式指定控件的默认行为。例如,在按钮样式中,可以指定一个触发器,以便当用户将鼠标指针移动到按钮上时,背景颜色将会改变。这些属性更改是即时的(它们不能逐步动画)。

模板: 您可以通过使用触发器指定模板中任何新部件和现有部件的行为。例如,您可以指定一个触发器,以便当用户将鼠标指针移到某个按钮上时,其中一个部件的颜色将会改变。这些属性更改可以是瞬时的,或者逐渐动画以产生平滑过渡。

相关问题