样式与控制模板的区别

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

在我看来,他们就是 一样。作为一个初学者,我认为我错了,因此我的问题是。

37551 次浏览

不,你真的大错特错了。 样式设置控件的属性

为了详细说明,可以使用样式对一组属性的设置进行分组,以便可以重用该样式来标准化控件。样式可以在控件上显式设置,也可以在特定类型的所有控件上应用。

控件模板可以通过样式设置,也可以在控件上显式设置,以更改控件的显示方式。所有控件都具有嵌入在。净净功率因数组件。看到这些并理解 wpf 开发人员如何实现所有控件的普通版本是非常有启发性的。如果安装了 Expression 混合,请查看其“ SystemThemes”文件夹。

更新:

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

例如:

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

这在不改变 ControlTemplate的情况下为群组框“添加”了一个复选框,但这是因为 ABC2的默认 ControlTemplate允许任何内容作为 Header。这是通过使用诸如 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 设置器] :

    1. 它提供了默认模板的效果。例如,当默认情况下类型化样式应用于元素,并且该样式包含自定义控件模板时,将应用控件模板,而不在这些元素上显式标记。
    2. 它使您能够提供控制模板外观的默认但可重写的属性值。换句话说,它使您能够尊重模板父类的属性,但仍然提供自己的默认值。”

换句话说,创建样式允许 Style 的 Template 设置器的用户覆盖值集,即使他们没有使用 TemplateBinding (例如{ TemplateBinding Width })。如果您在样式中硬编码了 Width,Style 的用户仍然可以覆盖它,但是如果您在 Template 中硬编码了 Width 属性,用户就只能使用它了。

此外,(这有点令人困惑)当使用带 TemplateBinding 的 ContentTemplate 时,设置该属性的责任在于用户,否则它将使用 TargetType 的默认属性。如果使用样式,则可以通过使用属性的 setter 并将 TemplateBinding 引用应用回该 setter 来重写 TargetType 的默认属性。这本书更好地解释了它,第338页(混合模板与样式)

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

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

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


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

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