Style和ControlTemplate之间的区别

Ste*_*and 62 .net c# wpf xaml

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

在我看来,它们完全一样.因为我是初学者,我认为我错了,因此我的问题.

Ern*_*rno 73

在样式中,您可以设置控件的属性.

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

<Button Style="{StaticResource MyButtonStyle}"/>
Run Code Online (Sandbox Code Playgroud)

使用此样式的所有按钮都将其背景设置为红色.

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

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

<Button Template="{StaticResource MyButtonTemplate}"/>
Run Code Online (Sandbox Code Playgroud)

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

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

<ControlTemplate x:Key="MyButtonTemplate" TargetType="Button">
    <Grid>
        <Rectangle Fill="{TemplateBinding Background}"/>
        <ContentPresenter/>
    </Grid>
</ControlTemplate>
Run Code Online (Sandbox Code Playgroud)

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

<Button Template="{StaticResource MyButtonTemplate}" Background="Yellow"/>
Run Code Online (Sandbox Code Playgroud)

另一个有用的功能是控件可以选择默认样式而不必为其分配特定样式.你不能用模板做到这一点.

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

结合模板和样式功能非常强大:您可以在样式中设置Template属性:

<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>
Run Code Online (Sandbox Code Playgroud)

  • 所以你的例子完全适合我想知道的问题......控制模板和只能消除一个控制模板的风格有什么区别?总是通过样式封装controltemplate是很常见的吗? (3认同)

And*_*uus 23

你的确错了. 样式设置控件的属性.ControlTemplate是大多数控件共享的属性,用于指定它们的呈现方式.

详细说明,您可以使用样式对一组属性的设置进行分组,以便您可以重复使用它来标准化控件.样式可以在控件上显式设置,也可以应用于某种类型.

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

更新:

要了解Styles和ControlTemplates如何"添加控件".在某种程度上,ControlTemplate是定义控件组成的控件的唯一方法.但是,一些默认的.net控件允许您使用控件代替文本.

例如:

<GroupBox>
  <GroupBox.Header>
    <CheckBox/>
  </GroupBox.Header>
</GroupBox>
Run Code Online (Sandbox Code Playgroud)

这种"增加"一个复选框组框不改变ControlTemplate,但这是因为默认ControlTemplateGroupBox允许任何作为标题.这是通过使用特殊控件来完成的ContentPresenter.

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

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

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


Teo*_*gul 14

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

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

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