使用代码创建动画
WPF使用它所需要的步长以确保在当前配置的帧速率下得到平滑的动画,标准的帧速率60帧/秒,换句话说,每隔1/60秒WPF就会计算所有应用了动画的数值,并更新相应的属性。
实例化一个动画类
然后使用希望修改的元素BeginAnimation()方法 (所有WPF元素,从UIElement基类开始,都继承了BeginAnimation()方法,该方法是IAnimatable接口的一部分)其他实现了IAnimatable接口的类包括ContentElement(文档流内容的基类)和Visual3D(3D可视对象的基类)
比如增加一个按钮的宽度的动画,当单击按钮时候,WPF平滑的扩展按钮的两个侧边直到充满窗口,为了创建这中效果,使用一个动画修改按钮的Width属性,当单击按钮时,下面的代码创建并启动了这个动画
DoubleAnimation widthAnimation=new DoubleAnimation();
widthAnimation.Form=160;
widthAnimation.To=this.Width-30;
widthAnimation.Duration=TimeSpan,FromSeconds(5);
cmdGrow.BeginAnimation(Button.WidthProperty , widthAnimation);
任何使用线性插值的动画最少需要是三个细节:开始值(From),结束值(To)和整个动画执行的时间(Duration)
故事板
故事板是增强的时间线,可以使用它分组多个动画,并且它还具有控制动画播放的能力,暂停,停止以及改变播放的位置。
Storyboard类提供的最基本的功能是它能够使用TargetProperty和TargetName属性指向一个特定的属性和特定的元素,换句话说,故事板在动画和希望应用动画的属性之间架起了一座桥梁
TargetProperty和TargetName属性都是附加属性,这意味着可以直接将它们用于动画
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="cmdGrow" Storyboard.TargetProperty="Width"
From="160" To="300" Duration="0:0:5"></DoubleAnimation>
</Storyboard>
定义故事板是创建动画的第一步,为了让故事板实际运行起来,还需要一个事件触发器
事件触发器
可以在如下4个位置定义事件触发器
在样式(Style.Triggers集合)
在数据模版中(DataTemplate.Triggers集合)
在控件模版中(ControlTemplate.Triggers集合)
直接在一个元素中定义事件触发器(FrameworkElement.Triggers集合)
当创建事件触发器时候,需要指定开始触发器的路由事件和由触发器执行的一个或多个动作,对于动画,最常用的动作是BeginStoryboard,该动作相当于调用BeginAnimation()方法
下面的示例是使用按钮的triggers集合为Click事件关联一个动画,当单击动画时候,该动画增长按钮
<Button Padding="10" Name="cmdGrow" Height="40" Width="160" HorizontalAlignment="Center" VerTicalAlignment="Center">
<Button.Triggers>
<EventTrigger RoutedEvent="Button.Click">
<EventTrigger.Actions>
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Width" To="300" Duration="0:0:5"></DoubleAnimation>
</Storyboard>
...
<Button.Triggers>
<Button.Content>Click and Make Me Grow
</Button.Content>
<Button>
Storyboard.TargetProperty属性指定了希望改变的属性,如果没有指定,故事板使用父元素,在此使用的是希望扩展的按钮,如果设置一个附加属性(如Canvas.Left或Canvas.Top)需要在括号中包装整个属性,如下所示
<DoubleAnimation storyboard.TargetProperty="(Canvas.Left)"..../>
使用样式关联触发器
FrameworkElement.Triggers集合有点奇怪,它支持事件触发器,其他触发器集合(Style.Triggers DataTemplate.Triggers与ControlTemplate.Triggers)的功能更加强大,它们支持三种基本类型的WPF触发器“属性触发器,数据触发器以及事件触发器