我是WPF的新手,我对修改控件有疑问。我开始知道可以通过更改控制模板来修改控件。即,
<Button>
<Button.Template>
<ControlTemplate>
...
</ControlTemplate>
</Button.Template>
</Button>
我们也可以使用内容模型编辑控件。即,
<Button>
<Grid>
<CheckBox>
</CheckBox>
<RadioButton>
</RadioButton>
...
</Grid>
</Button>
这两种技术有什么区别。哪一个是在WPF中自定义控件的正确方法。请帮助我更好地理解这一点。
答案 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。
您使用哪一个取决于具体任务和您的个人偏好。