样式和ControlTemplate之间的区别

你能告诉我Style和ControlTemplate之间的主要区别是什么? 何时或为什么要使用其中一个?

在我看来,他们是完全一样的 。 因为我是初学者,我认为我错了,所以我的问题。

在一个样式中,你设置了一个控件的属性。

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

所有使用这种风格的button将背景设置为红色。

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

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

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

模板中设置的值只能replace整个模板。 使用控件时,可以通过显式设置值来replace样式中的值。 这就是为什么通过使用TemplateBinding而不是编码值来更好地使用控件的属性。

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

现在模板使用它所应用的button的Background属性的值,所以可以自定义:

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

另一个有用的function是控件可以select一个默认的样式,而不需要指定一个特定的样式。 你不能用模板做到这一点。

只要删除样式的x:Key属性(再次:你不能用模板做到这一点)。 样式下的可视化树中的所有button都将应用此样式。

组合模板和样式是非常强大的:您可以在样式中设置模板属性:

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

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

详细说明一下,你可以使用一个样式来对一组属性进行分组,以便重新使用它来标准化你的控件。 样式可以在控件上明确设置,也可以全部应用于某种types。

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

更新:

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

例如:

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

这会在不改变ControlTemplate情况下将checkbox“添加”到组框中,但这是因为GroupBox的默认ControlTemplate允许任何内容作为标题 。 这是通过使用诸如ContentPresenter特殊控件完成的。

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

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

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

您可以将Style视为将一组属性值应用于多个元素的便捷方式。 您可以通过直接在每个TextBlock元素上设置属性(如FontSize和FontFamily)来更改默认外观。 但是,如果您希望TextBlock元素共享某些属性,则可以在XAML文件的“资源”部分中创build一个“样式”。

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

参考: http : //msdn.microsoft.com/en-us/library/ms745683.aspx

我发现一些有趣的区别样式和模板(msdn)

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

模板:当您修改模板时, 您可以访问控件的更多部分,而不是修改样式。 例如,您可以更改popup列表在combobox中的显示方式,也可以通过修改项目模板来更改触发combobox中popup列表的button的外观。


样式:您可以使用样式来指定控件的默认行为。 例如,在button样式中,可以指定一个触发器,以便当用户将鼠标指针移到button上时,背景颜色将会改变。 这些属性变化是瞬时的(他们不能逐渐地animation )。

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

好吧,我有完全相同的问题,我在这个线程中find的答案指出我正确的方向,所以我分享,如果只是这样,我可以更好地理解它自己。

样式比ControlTemplate更加灵活。

亚当·纳丹(Adam Nathan)和黑帮(作家)从Windows Presentation Foundation释放出来

  • “除了使用任意属性设置将模板(使用Style的ControlTemplate设置器的样式)与任意属性设置相结合的便利之外,还有这样做的重要优点(将ControlTemplate设置器设置为样式):

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

换句话说,创build样式允许样式的模板设置器的用户覆盖所设置的值,即使它们没有使用TemplateBinding(例如{TemplateBinding Width})。 如果在样式中对宽度进行了硬编码,则样式的用户仍然可以覆盖该样式,但是如果在模板中硬编码该宽度属性,用户就会被卡住。

另外,(这是一种令人困惑的),当与TemplateBinding使用ContentTemplate负责是在用户设置该属性,否则将使用TargetType的默认属性。 如果使用样式,则可以通过使用该属性的setter来覆盖TargetType的默认属性,然后将TemplateBinding引用回该设置器。 这本书更好地解释了它,第338页(与样式混合模板)