ControlTemplate控件模板

1、WPF中的ControlTemplate
WPF包含数据模板和控件模板,其中控件模板又包括ControlTemplate和 ItemsPanelTemplate,这里讨论一下ControlTemplate。
其实WPF的每一个控件都有一个默认的模板,该模板描述了控件的外观(视觉树)以及 外观对外界刺激所做出的反应(触发器)。我们可以自定义一个模板来替换掉控件的 默认模板以便打造个性化的控件。
与Style不同,Style只能改变控件的已有属性值(比如颜色字体)来定制控件,但控件模板可以改变控件的内部结构(VisualTree,视觉树)来完成更为复杂的定制,比如我们可以定制这样的按钮:在它的左办部分显示一个小图标而它的右半部分显示文本。 要替换控件的模板,我们只需要声明一个ControlTemplate对象,并对该ControlTemplate对象做相应的配置,然后将该ControlTemplate对象赋值给控件的Template属性就可以了。
ControlTemplate包含两个重要的属性:
1, VisualTree,该模板的视觉树,其实我们就是使用这个属性来描述控件的外观的
2, Triggers,触发器列表,里面包含一些触发器Trigger,我们可以定制这个触发器列表来使控件对外界的刺激发生反应,比如鼠标经过时文本变成粗体等。
参考以下代码:
ControlTemplate控件模板

在上面的代码中,我们修改了Button的Template属性,我们定义了一个ControlTemplate,在…之间包含的是模板的视觉树,也就是如何显示控件的外观,我们这里使用了一个Ellipse(椭圆)和一个 TextBlock(文本块)来定义控件的外观。
很容易联想到一个问题:控件(Button)的一些属性,比如高度、宽度、文本等如何在新定义的外观中表现出来呢?
我们使用TemplateBinding将控件的属性与新外观中的元素的属性关联起来Width=" {TemplateBinding Button.Width}",这样我们就使得椭圆的宽度与按钮的宽度绑定在一起 而保持一致,同理我们使用Text="{TemplateBinding Button.Content}"将TextBlock的文本与按钮的Content属性绑定在一起。

2、触发器
除了定义控件的默认外观外,也许我们想还定义当外界刺激我们的控件时,控件外观做出相应的变化,这是我们需要触发器。参考以下代码:

ControlTemplate控件模板

在上面的代码中注意到<ControlTemplate.Triggers>…</ControlTemplate.Triggers>之间 的部分,我们定义了触发器,其表示当我们Button的IsMouseIOver属性变成True时,将使用设置器来将Button的Foreground属性设置为Red。这里有一个隐含的意思是:当Button的IsMouseIOver属性变成False时,设置器中设置的属性将回复原值。

接下来的一个问题是:如果我要重用我的模板,应该怎么办呢?这时候就需要将模板定义为资源了。
ControlTemplate控件模板

ControlTemplate控件模板

上面的代码将我们原来的模板定义为窗体范围内的资源,其中TargetType="Button"指示 我们的模板作用对象为Button,这样在整个窗体范围内的按钮都可以使用这个模板了, 模板的使用方法也很简单:
ControlTemplate控件模板

其中的ButtonTemplate是我们定义的模板的x:Key

3、动画
额外提一下的是,我们也可以在触发器中,调用一个故事板来达到对事件响应时的 动画效果
ControlTemplate控件模板

我们为模板定义了一个动画资源,此后在模板的触发器中我们就可以调用该资源来 实现一个动画效果了:
ControlTemplate控件模板

上一篇:mysql和pgsql时间相关操作


下一篇:linux下的PGSQL安装步骤