你能告诉我样式和控制模板的主要区别是什么吗? 何时或为何使用其中一种?
在我看来,他们就是 一样。作为一个初学者,我认为我错了,因此我的问题是。
不,你真的大错特错了。 样式设置控件的属性 。
为了详细说明,可以使用样式对一组属性的设置进行分组,以便可以重用该样式来标准化控件。样式可以在控件上显式设置,也可以在特定类型的所有控件上应用。
控件模板可以通过样式设置,也可以在控件上显式设置,以更改控件的显示方式。所有控件都具有嵌入在。净净功率因数组件。看到这些并理解 wpf 开发人员如何实现所有控件的普通版本是非常有启发性的。如果安装了 Expression 混合,请查看其“ SystemThemes”文件夹。
更新:
了解样式和 ControlTemplate 如何“添加控件”。以某种方式,ControlTemplate 是定义组成控件的控件的唯一方法。但是,一些违约。Net 控件允许您使用控件代替文本。
例如:
<GroupBox> <GroupBox.Header> <CheckBox/> </GroupBox.Header> </GroupBox>
这在不改变 ControlTemplate的情况下为群组框“添加”了一个复选框,但这是因为 ABC2的默认 ControlTemplate允许任何内容作为 Header。这是通过使用诸如 ContentPresenter之类的特殊控件来完成的。
ControlTemplate
ContentPresenter
但是,有时控件的默认 ControlTemplate 不允许您通过属性更改要更改的内容。然后必须更改 ControlTemplate。
无论是直接设置控件的属性(Content、 Header、 ControlTemplate、 IsEnable 等)还是通过样式设置,样式都只是一种方便。
希望这能更清楚地回答你的问题。
在样式中设置控件的属性。
<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>
您可以将 Style 视为将一组属性值应用于多个元素的方便方法。可以通过直接在每个 TextBlock 元素上设置属性(如 FontSize 和 FontFamily)来更改默认外观。但是,如果希望 TextBlock 元素共享某些属性,可以在 XAML 文件的参考资料部分中创建 Style。
另一方面,ControlTemplate 指定控件的可视化结构和可视化行为。可以通过为控件提供新的 ControlTemplate 来自定义控件的外观。创建 ControlTemplate 时,可以替换现有控件的外观,而不更改其功能。例如,您可以使应用程序中的按钮圆形而不是默认的方形,但是按钮仍然会引发 Click 事件。
档号: http://msdn.microsoft.com/en-us/library/ms745683.aspx
好吧,我有一个完全相同的问题,我在这个帖子中找到的答案为我指明了正确的方向,所以我分享了,只要这样我自己能更好地理解它。
样式比 ControlTemplate 更灵活。
在 释放 Windows 演示文稿基础节目中,Adam Nathan 和他的团队(作家)声明:
“除了将模板[使用 Style 的 ControlTemplate 设置器的样式]与任意属性设置相结合的方便之外,这样做还有一些重要的好处[在样式上设置 ControlTemplate 设置器] :
换句话说,创建样式允许 Style 的 Template 设置器的用户覆盖值集,即使他们没有使用 TemplateBinding (例如{ TemplateBinding Width })。如果您在样式中硬编码了 Width,Style 的用户仍然可以覆盖它,但是如果您在 Template 中硬编码了 Width 属性,用户就只能使用它了。
此外,(这有点令人困惑)当使用带 TemplateBinding 的 ContentTemplate 时,设置该属性的责任在于用户,否则它将使用 TargetType 的默认属性。如果使用样式,则可以通过使用属性的 setter 并将 TemplateBinding 引用应用回该 setter 来重写 TargetType 的默认属性。这本书更好地解释了它,第338页(混合模板与样式)
我发现了一些有趣的区别 样式和模板之间的区别(msdn)
风格: 您可以在样式中设置 只是预先存在属性。例如,不能为属于已添加到模板中的新部件的属性设置默认值。
模板: 修改模板时,您可以访问控件的更多部分比修改样式时要大。例如,您可以更改弹出列表在组合框中的显示方式,或者通过修改项模板来更改触发组合框中弹出列表的按钮的外观。
风格: 可以使用样式指定控件的默认行为。例如,在按钮样式中,可以指定触发器,以便当用户将鼠标指针移动到按钮上时,背景颜色将发生变化。这些属性变化是即时的(它们是 不能逐渐被激活)。
模板: 可以使用触发器指定模板中任何新部件和现有部件的行为。例如,可以指定一个触发器,以便当用户将鼠标指针移动到按钮上时,其中一个部件的颜色将发生变化。这些属性的变化可以是瞬时的,也可以是 逐渐活跃起来产生平滑的过渡。