1.改写控件模板
如图可以改写Button控件模板(相当于变成一个空的容器再往里添加其他控件,但保留原控件属性,原有属性任然可以设置)。图中原有控件的属性被遮挡,无法生效。若是想通过原控件属性来设置模板内控件属性可以通过templatebinding。
2.TemplateBinding
如图通过TemplateBinding,让原控件属性与模板内控件属性形成绑定。
3.通过style复用
为了避免重复书写模板,一般都会将controltemplate放在style内进行复用。
可以放在 Window.Resource 变成本地样式,也可以放到资源字典ResourceDictionary里。
4.绑定依赖属性(自定义控件)
TemplateBinding用法不仅可以用来绑定原有属性,最重要的用法是绑定自定义依赖属性。
如图
Button控件没有Border的CornerRadius属性,所以没办法直接绑定。
做法:
先自定义MyButton类并继承Button类。然后写依赖属性(依赖属性为固定写法,直接输入propdp再按回车就有模板),然后根据需要填写类型。如图
CornerRadius为自定义依赖属性的类型,需注意这成员和属性名不要混淆, DependencyProperty.Register倒数第二个参数为自定义控件类型,倒数第一个参数为默认值可以去掉(默认值类型为依赖属性的类型)。
重新生成项目就可以绑定上去了。
5.ContentPresenter 呈现控件内容
有时候希望在每个控件使用同一个简单模板的时候,增加些内容。这时可以在模板里写ContentPresenter 元素。并在控件的Content内添加自己需要的内容。
如图
由于Content 是object类型,所以基本上什么类型都可以添加。
6.特殊写法与PART_XXX
有些控件模板需要特殊的写法如TextBox,
必须要有ScrollViewer 并且一定要写Name 为PART_ContentHost。不然无法编辑。
至于什么控件模板需要搭配什么控件实现什么功能,Name必须要写什么PART_XXX。这微软文档并没有总结,需要写到什么控件模板的时候到微软文档里查相应的模板示例。