本篇来学习WPF的动画。什么是动画?动画就是一系列帧。在WPF中,动画就是在一段时间内修改依赖属性值的行为,它是基于时间线Timeline的。有人会说,要动画干嘛,华而不实,而且添加了额外的资源消耗而影响性能。尽管如此,适当的使用动画却可以使你的程序富有更好的表现力和交互性。更加可喜的是,WPF提供了丰富的动画支持,大部分的动画都可以直接通过XAML来呈现而不用去写繁琐的cs代码。在System.Windows.Media.Animation命名空间中,我们发现了许多的类,大体可归类为这么三种:基于线性内插算法动画(简单动画)、基于KeyFrame动画和基于路径动画。下面来分别介绍这三种动画:
首先以图来说明类的继承层次:
这张粗糙的图只是以Double类型的动画为例,因为它是比较全的,全面提到的三种动画类它都具备。支持KeyFrame的类型最多,其次是线性内插,最后是路径,只有三种,除了Double外,还有Matrix和Point。
基于线性内插动画是在一个开始值到一个结束值之间以逐步增加的方式来改变属性值。有这么几个重要的属性:
From:开始值,当忽略该属性时,动画默认从其使用者属性值开始,所以其使用者属性在执行动画前要被赋值
To:结束值,当忽略该属性时,动画默认从其使用者属性值结束,所以其使用者属性在执行动画前要被赋值
By:递增值,和To一样和From搭配使用,当然可以用To来代替它
Duration:时间间隔,动画的执行时间,可以将一个TimeSpan值直接给它赋值,会自动隐式转换
AutoReverse:在到达结束值后,是否以相反的顺序回到From值
RepeatBehavior:重复行为,默认不重复,可设置其为Forever来重复动画,也可以通过构造器来设置次数和Timespan
FillBehavior:在活动周期结束后的行为方式,有HoldEnd(默认值)和Stop两个值,HoldEnd表示在动画结束后保持该属性值,而Stop则表示在动画结束后回到原来值(不是From值)
例子如下:
private void Button_Click(object sender, RoutedEventArgs e) { Button button = (Button)sender; DoubleAnimation widthAnimation = new DoubleAnimation(); widthAnimation.From = 200; widthAnimation.To = 100; //widthAnimation.AutoReverse = true; widthAnimation.Duration = TimeSpan.FromSeconds(5); widthAnimation.FillBehavior = FillBehavior.Stop; //RepeatBehavior = RepeatBehavior.Forever; widthAnimation.Completed += widthAnimation_Completed; button.BeginAnimation(Button.WidthProperty, widthAnimation); } void widthAnimation_Completed(object sender, EventArgs e) { //to do ... }