通过更改控件模板和添加子控件来修改控件之间的区别是什么

时间:2009-06-08 05:49:02

标签: wpf xaml controls wpf-controls

我是WPF的新手,我对修改控件有疑问。我开始知道可以通过更改控制模板来修改控件。即,

<Button>
  <Button.Template>
    <ControlTemplate>
      ...
    </ControlTemplate>
  </Button.Template>
</Button>

我们也可以使用内容模型编辑控件。即,

<Button>
  <Grid>
    <CheckBox>
    </CheckBox>
    <RadioButton>
    </RadioButton>
    ...
  </Grid>
</Button>

这两种技术有什么区别。哪一个是在WPF中自定义控件的正确方法。请帮助我更好地理解这一点。

3 个答案:

答案 0 :(得分:3)

这两件事之间的主要区别在于ControlTemplate定义了控件的外观。它实际上并没有将内容放在其中。在内容控件内的某个位置,应该有某种形式的ContentPresenter。内置控件具有这种能力,因为它们就是所谓的'lookless controls',并且创建的任何自定义控件也应该是无形的。如果控件没有以无形的方式模板化,而是具有静态布局,那么您可能会遇到混乱。

至于正确的做事方式,取决于你想要达到的目的。如果您尝试更改控件(例如外观或行为),那么using a ControlTemplate,(或DataTemplate,取决于您的模板),绝对是可行的方法。一个很好的例子是CheckBox,信不信由你,CheckBox实际上是一个ToggleButton(more or less),through templating显示子弹中的togleablity。 Here's另一个非常好的例子,说明如何使用模板做一些非常漂亮的事情。

ControlTemplates也应该是applied through Styles,而不是直接在元素上设置。

如果您实际上并不打算修改控件的行为或外观,那么使用内容模型是正确的方法。

WPF does this better then Silverlight,虽然我不知道SL3是否有改进。

答案 1 :(得分:1)

我的经验法则是,如果可以在不更改控件模板的情况下获得我想要的内容,那么就不应该更改控件​​模板。

控件模板是一种改变控件外观和感觉的方法,例如制作一个更改复选框复选标记图形的圆形按钮。

在控件内添加控件更简单,例如将图像放在按钮内。

还要记住,控件模板中有很多功能,包括填充,内容对齐,禁用外观等,如果更改控件模板,则必须添加对所有这些功能的支持。

答案 2 :(得分:0)

模板可以放入资源并重新用于另一个按钮。

直接更改内容不可重复使用,除非您使用UserControl。

您使用哪一个取决于具体任务和您的个人偏好。