从技术的角度看,WPF动画只是暂时的,这意味着它们不能真正改变基本属性的值, 当动画处于活动状态时,只是覆盖了属性的值。
单向动画,在动画运行结束后会保持处于活动状态,这是因为动画需要将按钮的宽度保 持为新值,这会导致如下常见问题,如果尝试使用代码在动画完成后修改属性值,代码 将不会起作用,因为代码只是为属性指定了一个新的本地值,但仍会先试用动画之后的 属性值。
为了解决动画完成后能修改属性的值,有以下方法可解决。
(1)、设置AutoReverse属性,如果将该属性设置为true,将会反向运动,返回原始 的值(不适合动画完成后,再为属性设置最后的值,只是还原为动画之前的值)。
(2)、改变FillBehavior属性。通常,FillBehavior属性设置为HoldEnd,这意味着当动 画结束时,会继续为目标元素应用最后的值。如果将FillBehavior属性改为Stop,只要动 画结束,属性就会恢复为原来的值(适用于动画结束后,再次为其设置新值,一般不与 AutoReverse配合着使用,这两个用其中一个就行了)。
动漫的Completed事件:
使用Completed事件时,要将事件设置BeginAnimation()方法之前,否则不起作用。在 Completed中,可通过调用BeginAnimation()方法来渲染不活动的动画,为此,只需要 指定属性,并为动画对象传递null引用
AccelerationRatio和DeceleRation属性。 可以通过AcclerationRation和DecelerationRation属性压缩部分时间轴,使动画运行的更 快,并将拉伸其他时间进行补偿,使总时间保持不变。这两个属性都表示百分比值,例 如,将AcceleRation属性设置为0.3,表示希望使用动画持续时间中前30%的时间进行加 速。例如在1个10秒的动画中,前3秒会加速运行,而剩余的7秒会以恒定不变的速度运 行,如果将DeceleRation属性设置为0.3,那么最后3秒回减速运行。
使用RepeataBehavior属性可以控制如何重复运行动画,如果希望重复固定次数,应为 RepeatBehavior构造函数传递合适的次数。 还可设置RepeatBehavior为永久重复。
StoryBoard类间接地继承自TimeLineGroup类,所以StoryBoard类能包含多个动画,这些 动画可以作为一组进行管理,这意味着它们可以在同一时间开始。
到目前为止,已经在事件触发器中使用了一个动作,加载动画的BeginStoryboard动作, 然而,一旦创建故事版,就可以使用其他动作控制故事板,这些动作类都继承自 ControllableStoryboardAction类,控制故事版的主要类如
为成功地执行这些动作,必须在同一个Triggers集合中定义所有的触发器,如果将 BeginStoryboard动作的触发器和PauseStoryboard动作的触发器放置到不同的集合中, PauseStoryboard动作就无法工作。
在包含元素的Triggers集合中(在这里是Window.Triggers集合),使用 EventTrigger.SourceName属性关联这些事件触发器,只要SourceName属性和为按钮设 置的Name属性相匹配,触发器就会用到恰当的按钮上。还必须要问BeginStoryboard动 作指定名称,这样其他触发器BeginStoryboardName属性指定这个名称,连接到相同的 故事板,然后进行控制。