ControlTemplate

86 阅读2分钟

1.改写控件模板

read-normal-img

如图可以改写Button控件模板(相当于变成一个空的容器再往里添加其他控件,但保留原控件属性,原有属性任然可以设置)。图中原有控件的属性被遮挡,无法生效。若是想通过原控件属性来设置模板内控件属性可以通过templatebinding。

2.TemplateBinding

read-normal-img

如图通过TemplateBinding,让原控件属性与模板内控件属性形成绑定。

3.通过style复用

为了避免重复书写模板,一般都会将controltemplate放在style内进行复用。

read-normal-img

可以放在 Window.Resource 变成本地样式,也可以放到资源字典ResourceDictionary里。

4.绑定依赖属性(自定义控件)

TemplateBinding用法不仅可以用来绑定原有属性,最重要的用法是绑定自定义依赖属性。

如图

read-normal-img

Button控件没有Border的CornerRadius属性,所以没办法直接绑定。

做法:

先自定义MyButton类并继承Button类。然后写依赖属性(依赖属性为固定写法,直接输入propdp再按回车就有模板),然后根据需要填写类型。如图

read-normal-img

CornerRadius为自定义依赖属性的类型,需注意这成员和属性名不要混淆, DependencyProperty.Register倒数第二个参数为自定义控件类型,倒数第一个参数为默认值可以去掉(默认值类型为依赖属性的类型)。

重新生成项目就可以绑定上去了。

read-normal-img

5.ContentPresenter 呈现控件内容

有时候希望在每个控件使用同一个简单模板的时候,增加些内容。这时可以在模板里写ContentPresenter 元素。并在控件的Content内添加自己需要的内容。

如图

read-normal-img

由于Content 是object类型,所以基本上什么类型都可以添加。

read-normal-img

6.特殊写法与PART_XXX

有些控件模板需要特殊的写法如TextBox,

read-normal-img

必须要有ScrollViewer 并且一定要写Name 为PART_ContentHost。不然无法编辑。

至于什么控件模板需要搭配什么控件实现什么功能,Name必须要写什么PART_XXX。这微软文档并没有总结,需要写到什么控件模板的时候到微软文档里查相应的模板示例。