1、使用样式关联触发器:
有三种基本类型的WPF触发器:属性触发器、数据触发器以及事件触发器。使用触发器关联动漫是最常用的方法,但是不是唯一选择。
2、同步的动漫:
StoryBoard类间接地继承自TimeLineGroup类,所以StoryBoard类能包含多个动画,这些 动画可以作为一组进行管理,这意味着它们可以在同一时间开始。
3、控制播放:
到目前为止,已经在事件触发器中使用了一个动作,加载动画的BeginStoryboard动作, 然而,一旦创建故事版,就可以使用其他动作控制故事板,这些动作类都继承自 ControllableStoryboardAction类,控制故事版的主要类如下:
PauseStoryboard:停止播放动画并且保持当前位置
ResumeStoryboard:恢复播放暂停的动画。
StopStoryboard:停止播放动画,并将动画时钟重新设置到开始位置
SeekStoryboard:跳到动画时间线中的特定位置,如果当前动画正在播 放,就继续从新位置播放。如果当前动画是暂停的,就 继续保持暂停
SetStoryboardSpeedRatio:改变整个故事板的SpeedRatio属性值
SkipStoryboardToFill:将故事板移动到时间线的终点。FillBehavior属性设置 为HoldEnd,动画继续保持最后的值。
RemoveStoryboard:移除故事板,停止所有正在运行的动画,并将属性返回 为原来的、最后一次设置的数值
为成功地执行这些动作,必须在同一个Triggers集合中定义所有的触发器,如果将 BeginStoryboard动作的触发器和PauseStoryboard动作的触发器放置到不同的集合中, PauseStoryboard动作就无法工作。
在包含元素的Triggers集合中(在这里是Window.Triggers集合),使用 EventTrigger.SourceName属性关联这些事件触发器,只要SourceName属性和为按钮设 置的Name属性相匹配,触发器就会用到恰当的按钮上。还必须要问BeginStoryboard动 作指定名称,这样其他触发器BeginStoryboardName属性指定这个名称,连接到相同的 故事板,然后进行控制。
4、故事板事件
Completed:动画已经到达终点
CurrentGlobalSpeedInvalidated:速度发生了变化,或者动画被暂停、重新开 始、停止或移到某个新的位置。
CurrentStateInvalidated:动画已经开始或结束
CurrentTimeInvalidated:动画时钟已经向前移动了一个步长,正在更改 动画。当动画开始、停止或结束时也会引发该 事件
RemoveRequested:动画正在被移除。
监视动漫进度:
如果要监视动画,要用到Storyboard的一些事件。在这里使用的是CurrentTimeInvalidated事件,每次向前移动动画时钟都会引发该事件。当引发CurrentTimeInvalidated事件时,发送者是Clock对象(Color类位于 System.Windows.Media.Animation名称空间中),可通过Clock对象检索当前时间。当前时间使用TimeSpan对象表示,并且可检索当前进度,当前进度使用0~1之间的数值表示。
在上面的例子中为故事板加一个CurrentTimeInvalidated事件,然后在界面中放一个label控件(用于显示时间)和ProgressBar(用于显示进度,最大值为1,最小值为0)控件。
5、动漫缓动:
线性动画有一个缺点,通常让人觉得机械和不够自然。改进动画并创建更趋自然的动画 的秘诀是改变变化速率。不是创建以固定不变的速率改变属性的动画,而是需要设计根 据某种方式加速或减速的动画,实现更趋自然的动画的最简单方法是使用预置的缓动函 数(EasingFunction)。EasyingFunction属性只能接受单个缓动函数对象,所以不能 为同一个动画结合不同的缓动函数。所有的缓动函数 类都继承自EasingFunctionBase类,并且继承了EasingMode属性,EasingMode有三种 值,分别是:EaseIn(在动画开始时应用缓动效果)、EaseOut(动画结束时应用缓动效 果)和EaseInOut(在开始和结束时应用缓动动画)。当应用缓动函数时不会改变动画的 持续时间。
BackEase:当使用EaseIn模式应用该缓动函数时,在动画开始之前拉回动画,当使用EaseOut模式应用该缓动函数时,允许动画稍微超越,然后拉回,Amplitude属性决定了拉回 和超越的量。默认值是1, 可减小该属性值(大于0的任 何值)以缩减效果,或增加 该属性值放大效果。
ElasticEase:当使用EaseOut模式应用该缓动函数时,使动画超越其最大值并前后摆动,逐渐减慢。当时用EaseIn模式 应用该缓动函数时,动画在其开始 值周围前后摆动,逐渐增加,Oscillations属性控制动画 前后摆动的次数
BounceEase :执行与Elastic缓东函数类似的效果,只是弹跳永远不会超越初始值或最终值,Bounces属性控制动画回调的次数(默认是2)
CircleEase:使用圆函数加速(使用EaseIn模式), 或减速(使用EaseOut模式)
CublicEase:使用基于时间立方的函数加速,其效果与Circle类似,但是加速效果更缓和。
QuadraticEase:使用基于时间平方的函数加速,效果与CublicEase类似,但加速过程更明显。
6、WPF动画性能和帧率:
通常,为用户界面应用动画,只不过是创建并配置正确的动画和故事版对象。但在其他情况下,特别是同时发生多个动画时,可能更加需要关注性能。WPF试图保持以60帧/秒的速度进行动画,可以确保从开始到结束得到平滑流畅的动画。帧速率越低,会发生抖动现象。帧速率越高,占用的CPU也就越高。通过TimeLine.DesiredFrameRate属性进行调整。
7、自定义缓动函数:
创建自定义缓动函数一般需要以下几个步骤:
新建一个类,让其继承自EasingFunctionBase类。
重写EaseInCore()方法和CreateInstanceCore()方法。
定义依赖属性。
引用。