动画包括在一段时间内改变用户界面的某些可见的特征,如它的大小、位置或颜色。你可以做到这一 点,非常困难的通过创建一个timer并在每一个timer_tick句柄中修改用户界面的外观。当然,这是动画 在Win32或Windows Forms中典型的做法。幸运的是,WPF照顾到这些低级别的细节。动画,就像WPF中的其 他特征,简单的要求我们声明想要做的。系统会为我们照顾它的实现。
所有的WPF动画支持归结为,在一段时间内改变一个或多个属性。这意味着有很多限制在WPF动画系统 能为你做些什么上。例如,可视化树全部保持着同样的结构。一个动画不可能为你添加或移除元素(虽然 为动画设置属性使元素可见是可能的)。没有办法提供一个“before”和“after”的场景,或者使WPF在 这两者间添加新场景。这意味这没有一种自动的方法——做一个动画,从一种外观转换到另一种,其程度 足以使某个元素从起始位置滑动到终止位置。
了解什么动画可以或不可以实现的关键是,理解它的聚焦属性的天性。它只是改变了你通知的无论任 何属性。当决定任何给一个UI设计动画时,问一下自己你想要确切地看到什么——经由动画的中途,以及 计算出如何设置需要的属性——从而可以捕获中途的点。如果你把这应用到动画进程:从一个水平的 StackPanel转换为垂直的,这明显会有一个问题。你不能在StackPanel上设置一个属性,使得它在水平布 局和垂直布局的中途显示什么。如果你不能这么做,那么动画系统也不能!(如果你想达到这种类型的效 果,你可以使用Canvas,它允许在任意位置放置的元素。你可能需要手动的为每个元素设置动画中的位置 和大小。)
在我们详细看到动画的任意部分之前,让我们检查一个简单的例子。示例8-1显示了包含一个单独的红 色椭圆的窗体标记。这个椭圆元素的Height被设置为100,但是他没有直接声明一个Width属性。替代的, Width属性由一个动画决定。椭圆会在一段时间内改变它的宽度。
示例8-1
<Window Text="Simple Animation" Width="320" Height="150"
xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"
xmlns="http://schemas.microsoft.com/winfx/avalon/2005">
<Window.Storyboards>
<SetterTimeline TargetName="myEllipse" Path="(Ellipse.Width)">
<DoubleAnimation From="10" To="300" Duration="0:0:5"
RepeatBehavior="Forever" />
</SetterTimeline>
</Window.Storyboards>
<Ellipse x:Name="myEllipse" Fill="Red" Height="100" />
</Window>