使用Silverlight开发的人总会碰到修改控件样式的问题,但是如果如题所述的几个重要概念不清楚,就会导致思路的混乱,以及无法实现自己的要求。呵呵,我就是这样啦,哈;因此我花费了一些时间总结了一下我的理解,如果有错误的地方也希望高手能指正一下吧。
以Button为例,从类的继承关系上看,它继承ButtonBase,而ButtonBase又继承了ContentControl类,这个类是比较重要的,ContentControl类用于包含单项内容的控件,呵呵,它有个类似的哥们ItemsControl类(用于显示多个项的控件)。说它们重要,是因为如果我们想重新定义一个控件外观和行为时,会使用到那个控件的Template属性,这个属性是Control类的属性,大部分控件都直接或间接继承它,也就是说大部分控件都会存在这个Template属性。看看它的返回类型,ControlTemplate类,和ContentTemplate属性很相似的,我开始就是被它们给骗了,呵呵。在这个Template里,你需要定义VisualStateGroups(状态组),VisualState(状态),复杂的还有VisualTransition(状态之间的过度),以及我们想设计的外观布局。
再来说说ContentTemplate属性,这个属性是ContentControl类的属性,其返回类型是DataTemplate类,它主要用于不改变控件行为的基础上,进行控件内容的修改,例如在Button控件里要加入一个CheckBox控件时,就要考虑使用Button的ContentTemplate属性了。ItemsControl类的ItemTemplate属性与它的作用很相似,只是显示形式不同。
<Button Width="94" Height="30">
<Button.ContentTemplate>
<DataTemplate>
<CheckBox Content="Hello" />
</DataTemplate>
</Button.ContentTemplate>
</Button>
Content属性也是ContentControl类的属性,其返回类型是Object类,开始我以为它可以放一些控件在里面,例如TextBlock,TextBox等,但是当我想加入上例的CheckBox时就不被允许了。因此从这个角度来看,Template属性的能力 > ContentTemplate/ItemTemplate属性的能力 > Content属性的能力。
最后看看ContentPresenter类和ItemsPresenter类,它们有点像创建控件时使用的占位符,例如我们想让这个控件的内容部分应该放置到哪里,由于创建控件时我们没法提前知道内容是什么,是文字还是一个集合控件,所以就需要它们来确认一下内容在创建控件中的位置,而不必考虑具体是什么内容以及形式了。
写得有点乱,呵呵,日后有时间上传些图片说明一下吧。