代码改变世界

WPF中的模板

2008-06-20 11:59  DQ  阅读(682)  评论(0编辑  收藏  举报
    也许有人会说模板和Style是一样的东西,它们似乎在功能上有一点重叠,但是仔细分析却发现它们的角色其实相当不同。Element或控件不具有默认的Style Property,因此element的Style Property通常是null。Style Property是用来定义“Property的设定”或者“消费者希望关联到此element的trigger”。但是WPF中的所有控件,只要有视觉外观,就会有Template property,且将此property的值设定为一个ControlTemplate对象。Button之所以看起来像Button就是因为受到了ControlTemplate对象的直接影响。ControlTemplate对象定义了控件的完整外观,且你可以替换此对象。
     你创建ControlTemplate类型的对象,设定到Control所定义的Template Property。这些ControlTemplate对象定义控件完整的视觉外观,包括触发事件对外观的改变。
     抽象的FrameworkTemplate类型只定义了三个property。只读的Boolean property用来标识此模板是否可以被修改。Resources property的类型是ResourceDictionary,让我们定义一些只能够在模板内部使用的资源。第三个property最重要,叫做visualTree,定义组成此控件外观的Element的layout。
     ControlTemplate类型多加了两个property定义:TargetType用来指明,哪个类型的控件,适合应用到该模板;Triggers是Trigger对象的collection。
     所有派生自ContentControl的类型都使用ContentPresenter类型的对象来显示它们的内容。ContentPresenter派生自FrameworkElement,你可以在模板的视觉树内包含一个ContentPresenter对象,用来盛放模板中要放置的内容。ContentPresenter element负责显示所有“派生自ContentControl”控件的内容。ContentPresenter将这个世界分成两类对象:UIElement的后代和非UIElement的后代,对于非UIElement的后代,ContentPresenter会调用对象的ToString方法,用文本来展示该对象。这个功能让“派生自ContentControl”的控件可以用来显示任何种类的内容。