上篇,介绍了控件样式(Style)和模板(Template)的基础概念,并且演示了使用Blend设计控件样式。本篇将继续介绍使用Blend设计自定义控件模板 - ControlTemplate。ControlTemplate可以称为控件模板,简单的理解为控件结构和行为的集合。在项目设计中,经常会使用ControlTemplate创建新的控件模板或者修改现成的控件模板,使用项目的UI具有独特性。如何使用Blend创建和修改ControlTemplate是本文即将讨论的话题。
概述
对于ControlTemplate没有一个特定的概念,为了避免过于抽象,可以简单的理解ControlTemplate是通过改变Style改变控件视觉效果的类。ControlTemplate可以被定义在控件的Xaml代码中,为了提高复用性,ControlTemplate也会被定义到资源文件中。
实例
学习ControlTemplate最好的方法还是实践,下面,我将使用实例演示使用Blend创建新的控件ControlTemplate。
首先,在Blend中创建新的项目ControlTemplateDemo,上周Silverlight 4发布,我已经升级开发环境到Silverlight 4,VS2010和Blend 4 RC, 所以,以后所有项目演示将是基于.Net Framework 4的。
大家会发现Blend 4创建新项目和Blend 3没有太大区别。
我们计划创建一个简单的按钮ControlTemplate,
然后修改矩形背景和边框颜色,这里大家可以按照自己的喜好和需求自行设置背景色和边框颜色。
然后在主设计窗口选中该矩形控件,点击鼠标右键,选中“Make Into Control..."选项,
这个选项是将当前控件转换到指定控件模板中,在以下弹出窗口中,可以选择需要转换的控件类型,从以下窗口可以看出,矩形控件可以转换到所有控件模板中,下面Name是模板样式名称,Define in是创建该资源模板到指定位置。这些和前文教程内容相同,不再赘述。
这里,我们使用默认的name,将模板信息放在本地文档资源中,因为我们演示创建按钮controltemplate,所以在点击OK前,必须从上面的窗口中选择“Button”,点击OK后主设计窗口将显示按钮样式。
到这里一个简单的ControlTemplate已经创建完了。我们打开Objects and Timeline看看当前控件模板组成信息,从下图我们可以看到,该Button模板,是由一个矩形控件和ContentPresenter组成的。
再看看该按钮模板代码,从以下代码中可以看出,在资源中,定义了一个新的ControlTemplate,该控件模板目标控件类型是Button(
<
ControlTemplate
targettype
="Button"
>),ControlTemplate内部由Rectangle和ContentPresenter组成。
1
<
UserControl.Resources
>
2 < Style x:Key ="ButtonStyle1" targettype ="Button" >
3 < Setter Property ="Template" >
4 < Setter.Value >
5 < ControlTemplate targettype ="Button" >
6 < Grid >
7 < Rectangle RadiusY ="20" RadiusX ="20" stroke ="White" strokeThickness ="8" >
8 < Rectangle.Fill >
9 < LinearGradientBrush EndPoint ="0.5,1" StartPoint ="0.5,0" >
10 < GradientStop Color ="#FFF0F5FD" Offset ="0" />
11 < GradientStop Color ="#FF009CFF" Offset ="1" />
12 </ LinearGradientBrush >
13 </ Rectangle.Fill >
14 </ Rectangle >
15 < ContentPresenter HorizontalAlignment =" {TemplateBinding HorizontalContentAlignment} " VerticalAlignment =" {TemplateBinding VerticalContentAlignment} " />
16 </ Grid >
17 </ ControlTemplate >
18 </ Setter.Value >
19 </ Setter >
20 </ Style >
21 </ UserControl.Resources >
2 < Style x:Key ="ButtonStyle1" targettype ="Button" >
3 < Setter Property ="Template" >
4 < Setter.Value >
5 < ControlTemplate targettype ="Button" >
6 < Grid >
7 < Rectangle RadiusY ="20" RadiusX ="20" stroke ="White" strokeThickness ="8" >
8 < Rectangle.Fill >
9 < LinearGradientBrush EndPoint ="0.5,1" StartPoint ="0.5,0" >
10 < GradientStop Color ="#FFF0F5FD" Offset ="0" />
11 < GradientStop Color ="#FF009CFF" Offset ="1" />
12 </ LinearGradientBrush >
13 </ Rectangle.Fill >
14 </ Rectangle >
15 < ContentPresenter HorizontalAlignment =" {TemplateBinding HorizontalContentAlignment} " VerticalAlignment =" {TemplateBinding VerticalContentAlignment} " />
16 </ Grid >
17 </ ControlTemplate >
18 </ Setter.Value >
19 </ Setter >
20 </ Style >
21 </ UserControl.Resources >
但是该Button没有任何的视觉效果和Button事件。也就是说,在这个新的控件模板中,缺少VSM状态信息。根据上一篇Blend控制VSM中可以得知,在Blend中的States菜单栏中,可以轻松的控制控件的VSM状态,下面,我们添加一些简单的状态效果。
在States中,选中MouSEOver,然后在主设计窗口选中Button控件,
这样,鼠标覆盖到Button控件时,颜色会改变,再点击F5运行,可以将鼠标放在控件上,这时会发现VSM会切换视觉状态。
disabled:
在运行F5后,测试会发现VSM状态切换已经实现,但是缺乏体验效果,当鼠标放在Button时,我们希望看到渐变效果,当鼠标点击Button后,也希望看到渐变效果,这里我们需要添加Transition过渡效果到各个状态。
这里我们可以选择Easing效果,关于Easing的介绍,已经在过去的教程中详解,这里不再赘述。
按照以上的方法,依次类推,
再次运行项目,Button控件会在各种状态下出现不同的过渡动画效果。
这时再次查看模板代码,会发现在ControlTemplate中,出现了visualstatemanager选项。
1
<
UserControl.Resources
>
2 < Style x:Key ="ButtonStyle1" targettype ="Button" >
3 < Setter Property ="Template" >
4 < Setter.Value >
5 < ControlTemplate targettype ="Button" >
6 < Grid >
7 < visualstatemanager.VisualStateGroups >
8 < VisualStateGroup x:Name ="CommonStates" >
9 < VisualStateGroup.Transitions >
10 < VisualTransition From ="normal" GeneratedDuration ="0:0:0.3" To ="MouSEOver" />
11 < VisualTransition From ="MouSEOver" GeneratedDuration ="0:0:0.3" To ="normal" />
12 < VisualTransition From ="pressed" GeneratedDuration ="0:0:0.3" To ="MouSEOver" />
13 </ VisualStateGroup.Transitions >
14 < VisualState x:Name ="disabled" >
15 < Storyboard >
16 < DoubleAnimation Duration ="0" To ="0.5" Storyboard.TargetProperty ="(UIElement.Opacity)" Storyboard.TargetName ="rectangle" d:IsOptimized ="True" />
17 < ColorAnimation Duration ="0" To ="#FF7BC4F3" Storyboard.TargetProperty ="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName ="rectangle" d:IsOptimized ="True" />
18 </ Storyboard >
19 </ VisualState >
20 < VisualState x:Name ="normal" />
21 < VisualState x:Name ="MouSEOver" >
22 < Storyboard >
23 < DoubleAnimation Duration ="0" To ="1" Storyboard.TargetProperty ="(UIElement.Opacity)" Storyboard.TargetName ="rectangle" d:IsOptimized ="True" />
24 < ColorAnimation Duration ="0" To ="White" Storyboard.TargetProperty ="(Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Color)" Storyboard.TargetName ="rectangle" d:IsOptimized ="True" />
25 < ColorAnimation Duration ="0" To ="#FF2377AD" Storyboard.TargetProperty ="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName ="rectangle" d:IsOptimized ="True" />
26 </ Storyboard >
27 </ VisualState >
28 < VisualState x:Name ="pressed" >
29 < Storyboard >
30 < ColorAnimation Duration ="0" To ="#FF09283B" Storyboard.TargetProperty ="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName ="rectangle" d:IsOptimized ="True" />
31 </ Storyboard >
32 </ VisualState >
33 </ VisualStateGroup >
34 </ visualstatemanager.VisualStateGroups >
35 < Rectangle x:Name ="rectangle" RadiusY ="20" RadiusX ="20" stroke ="White" strokeThickness ="8" >
36 < Rectangle.Fill >
37 < LinearGradientBrush EndPoint ="0.5,1" StartPoint ="0.5,0" >
38 < GradientStop Color ="#FFF0F5FD" Offset ="0" />
39 < GradientStop Color ="#FF009CFF" Offset ="1" />
40 </ LinearGradientBrush >
41 </ Rectangle.Fill >
42 </ Rectangle >
43 < ContentPresenter HorizontalAlignment =" {TemplateBinding HorizontalContentAlignment} " VerticalAlignment =" {TemplateBinding VerticalContentAlignment} " />
44 </ Grid >
45 </ ControlTemplate >
46 </ Setter.Value >
47 </ Setter >
48 </ Style >
49 </ UserControl.Resources >
2 < Style x:Key ="ButtonStyle1" targettype ="Button" >
3 < Setter Property ="Template" >
4 < Setter.Value >
5 < ControlTemplate targettype ="Button" >
6 < Grid >
7 < visualstatemanager.VisualStateGroups >
8 < VisualStateGroup x:Name ="CommonStates" >
9 < VisualStateGroup.Transitions >
10 < VisualTransition From ="normal" GeneratedDuration ="0:0:0.3" To ="MouSEOver" />
11 < VisualTransition From ="MouSEOver" GeneratedDuration ="0:0:0.3" To ="normal" />
12 < VisualTransition From ="pressed" GeneratedDuration ="0:0:0.3" To ="MouSEOver" />
13 </ VisualStateGroup.Transitions >
14 < VisualState x:Name ="disabled" >
15 < Storyboard >
16 < DoubleAnimation Duration ="0" To ="0.5" Storyboard.TargetProperty ="(UIElement.Opacity)" Storyboard.TargetName ="rectangle" d:IsOptimized ="True" />
17 < ColorAnimation Duration ="0" To ="#FF7BC4F3" Storyboard.TargetProperty ="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName ="rectangle" d:IsOptimized ="True" />
18 </ Storyboard >
19 </ VisualState >
20 < VisualState x:Name ="normal" />
21 < VisualState x:Name ="MouSEOver" >
22 < Storyboard >
23 < DoubleAnimation Duration ="0" To ="1" Storyboard.TargetProperty ="(UIElement.Opacity)" Storyboard.TargetName ="rectangle" d:IsOptimized ="True" />
24 < ColorAnimation Duration ="0" To ="White" Storyboard.TargetProperty ="(Shape.Fill).(GradientBrush.GradientStops)[0].(GradientStop.Color)" Storyboard.TargetName ="rectangle" d:IsOptimized ="True" />
25 < ColorAnimation Duration ="0" To ="#FF2377AD" Storyboard.TargetProperty ="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName ="rectangle" d:IsOptimized ="True" />
26 </ Storyboard >
27 </ VisualState >
28 < VisualState x:Name ="pressed" >
29 < Storyboard >
30 < ColorAnimation Duration ="0" To ="#FF09283B" Storyboard.TargetProperty ="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)" Storyboard.TargetName ="rectangle" d:IsOptimized ="True" />
31 </ Storyboard >
32 </ VisualState >
33 </ VisualStateGroup >
34 </ visualstatemanager.VisualStateGroups >
35 < Rectangle x:Name ="rectangle" RadiusY ="20" RadiusX ="20" stroke ="White" strokeThickness ="8" >
36 < Rectangle.Fill >
37 < LinearGradientBrush EndPoint ="0.5,1" StartPoint ="0.5,0" >
38 < GradientStop Color ="#FFF0F5FD" Offset ="0" />
39 < GradientStop Color ="#FF009CFF" Offset ="1" />
40 </ LinearGradientBrush >
41 </ Rectangle.Fill >
42 </ Rectangle >
43 < ContentPresenter HorizontalAlignment =" {TemplateBinding HorizontalContentAlignment} " VerticalAlignment =" {TemplateBinding VerticalContentAlignment} " />
44 </ Grid >
45 </ ControlTemplate >
46 </ Setter.Value >
47 </ Setter >
48 </ Style >
49 </ UserControl.Resources >
选中Button控件,在右边Properties属性栏上面,点击Events
如果您在开发设计过程中遇到问题,欢迎留言给我。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。