控件可以包含一幅图像、一段视频、一个动画,甚至一个文本框。此外还有风格、模板以及触发器等,这些功能进一步加强了控件的扩展能力。开发人员还可以修改已经存在的控件的外观,以增强它的可视化功能,而且还可以保留用户已经熟悉的控件预期行为,还可以根据特定数据输入和检查的需要,为应用程序定制自定义控件。提供的用于扩展和创建控件的基础类,为设计控件的可视化外观提供了巨大的灵活性。
一个新的控件需要先选择一个基类。可以基于许多基类来创建自定义控件,包括Control、UserControl等,当创建一个新控件时,可根据自定义控件的定制和灵活性来选择所要继承的基类,可能还需要考虑以下问题:
作用UserControl作为基类是创建一个新控件最简单的方法,自定义控件由一引起标准控件组合在一起,来完成一个特定的用户接口功能,自定义控件可以为单个元素应用样式,并使其处理一些特定的事件,或者为控件引发特定的自定义事件。
模板的方式与样式非常类似,也可作为资源,并通过Setter来定义模板的内容。要定义模板,需要设置Setter的Property为Template,并使用<Setter.Value>来定义ControlTemplate来指定模板的目标类型。
范例象棋棋子按钮
图
7-1
(
1
)打开
Microsoft Expression Blend
,新建项目中,选择“
Silverlight Application
”。
对应的主要
XAML
如下:
<Grid x:Name="LayoutRoot" Background="White" Margin="56,37">
<Grid Margin="126,96,0" HorizontalAlignment="Left" Width="108" Height="108" VerticalAlignment="Top">
<Ellipse stroke="Black" Margin="4,6,4,2" strokeThickness="0" Height="100" Width="100" Fill="#FFA
7A
1A
1"/>
<Ellipse stroke="Black" strokeThickness="0" Width="100" Height="100" VerticalAlignment="Top" Margin="2,0">
<Ellipse.Fill>
<LinearGradientBrush EndPoint="0.795,0.998" StartPoint="0.227,-0.092">
<GradientStop Color="#FF2CC017" Offset="0.032"/>
<GradientStop Color="#FFC6E
2C
3" Offset="1"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<TextBlock Margin="22,14,28,14" Text="马" textwrapping="Wrap" FontSize="66.667" FontWeight="Bold" Foreground="#FF
17181C
" FontFamily="Arial"/>
</Grid>
</Grid>
</UserControl>
图
7-4
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Style x:Key="ButtonStyle1" targettype="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate targettype="Button">
<Grid>
<visualstatemanager.VisualStateGroups>
<VisualStateGroup x:Name="Focusstates">
<VisualState x:Name="Focused"/>
<VisualState x:Name="Unfocused"/>
</VisualStateGroup>
<VisualStateGroup x:Name="CommonStates">
<VisualState x:Name="MouSEOver"/>
<VisualState x:Name="pressed"/>
<VisualState x:Name="disabled"/>
</VisualStateGroup>
</visualstatemanager.VisualStateGroups>
<Ellipse stroke="Black" Margin="4,2" strokeThickness="0" Height="100" Width="100" Fill="#FFA
7A
1A
1"/>
<Ellipse stroke="Black" strokeThickness="0" Width="100" Height="100" VerticalAlignment="Top" Margin="2,0">
<Ellipse.Fill>
<LinearGradientBrush EndPoint="0.795,-0.092">
<GradientStop Color="#FF2CC017" Offset="0.032"/>
<GradientStop Color="#FFC6E
2C
3" Offset="1"/>
</LinearGradientBrush>
</Ellipse.Fill>
</Ellipse>
<ContentPresenter Margin="22,14"/>
</Grid>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="FontFamily" Value="Arial"/>
<Setter Property="FontWeight" Value="Bold"/>
<Setter Property="FontSize" Value="66.667"/>
<Setter Property="Foreground" Value="#FF
17181C
"/>
</Style>
</ResourceDictionary>
<Grid x:Name="LayoutRoot" Background="White" Margin="56,37">
<Button Height="108" HorizontalAlignment="Left" Margin="126,0" Style="{StaticResource ButtonStyle1}" VerticalAlignment="Top" Width="108" Content="马"/>
</Grid>
</UserControl>
(
7
)继续编辑模板,使其具备鼠标单击的外观变换效果,双击字典文件,进入到模板编辑状态,也可从所创建的棋子控件,从级联菜单中按照顺序选择“编辑控件”、“编辑模板“、“编辑当前模板“进入,如图
7-6
。
如图
7-8
(
10
)继续编辑模板,选择
MouSEOver
状态,背景色设为绿色到红色的渐变,
(
11
)模板已修改完成,保存,可安
F5
运行试看点击的效果。打开对应资源文件,可看到对应的
XAML
代码:
<VisualState x:Name="MouSEOver">
<Storyboard>
<ColorAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="ellipse" Storyboard.TargetProperty="(Shape.Fill).(GradientBrush.GradientStops)[1].(GradientStop.Color)">
<EasingColorKeyFrame KeyTime="00:00:00" Value="#FFE
85C
26"/>
</ColorAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
<VisualState x:Name="pressed">
<Storyboard>
<PointAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="ellipse" Storyboard.TargetProperty="(Shape.Fill).(LinearGradientBrush.StartPoint)">
<EasingPointKeyFrame KeyTime="00:00:00" Value="0.88,0.944"/>
</PointAnimationUsingKeyFrames>
<PointAnimationUsingKeyFrames BeginTime="00:00:00" Duration="00:00:00.0010000" Storyboard.TargetName="ellipse" Storyboard.TargetProperty="(Shape.Fill).(LinearGradientBrush.EndPoint)">
<EasingPointKeyFrame KeyTime="00:00:00" Value="0.142,-0.038"/>
</PointAnimationUsingKeyFrames>
</Storyboard>
</VisualState>
(
12
)在设计画面中的
MainPage.xaml
中,拖放方式创建更多的
Button
控件,如图
7-10
。
(
12
)要将模板应用于
Button
控件,单击画面右上角的“资源”选项卡,然后找到资源文件中的模板,将模板拖放至应用的
Button
控件上,并且选择
Style
选项。这样一个个方形按钮变成了统一样式的棋子,并调整修改文字、大小等,如图
7-11
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。