Windows Presentation Foundation (WPF) 提供了一组强大的图形和布局功能,通过应用这些功能,可以创建漂亮的用户界面和吸引人的文档。动画不仅可以使漂亮的用户界面更加引人注目,还可以使其更加便于使用。只需对背景色进行动画处理或应用动画 Transform,就可以创造出生动的屏幕过渡效果或提供有帮助的视觉提示。
本概述介绍了 WPF 动画和计时系统,并使用演示图板重点讨论 WPF 对象的动画。
本主题包括以下部分。
动画简介
动画是快速播放一系列图像(其中每个图像与下一个图像略微不同)给人造成的一种幻觉。大脑感觉这组图像是一个变化的场景。在电影中,摄像机每秒钟拍摄许多照片(帧),便可使人形成这种幻觉。用投影仪播放这些帧时,观众便可以看电影了。
计算机上的动画与此类似。例如,使一个矩形逐渐从视野中消失的程序可能按以下方式工作。
程序创建一个计时器。
程序按照设置的时间间隔检查计时器以查看经历了多长时间。
程序每次检查计时器时,它将根据经历的时间来计算矩形的当前不透明度值。
然后程序用新值更新矩形并重画此矩形。
在 WPF 出现之前,Microsoft Windows 开发人员必须创建和管理自己的计时系统或使用特殊的自定义库。WPF 包括一个通过托管代码和 可扩展应用程序标记语言 (XAML) 公开的高效计时系统,该系统紧密地集成到 WPF 框架中。通过使用 WPF 动画,可以轻松地对控件和其他图形对象进行动画处理。
WPF 可以高效地处理管理计时系统和重绘屏幕的所有后台事务。它提供了计时类,使用这些类,可以重点关注要创造的效果,而非实现这些效果的方法。另外,WPF 通过公开动画基类(您的类可以继承自这些类)让您可以轻松创建自己的动画,这样便可以制作自定义动画。这些自定义的动画获得了标准动画类的许多性能优点。
WPF 属性动画系统
如果了解关于计时系统的一些重要概念,则在使用 WPF 时可能会更加轻松一些。最重要的是,在 WPF 中,通过对对象的个别属性应用动画,可以对对象进行动画处理。例如,若要使框架元素增大,请对其 Width 和 Height 属性进行动画处理。若要使对象逐渐从视野中消失,可以对其 Opacity 属性进行动画处理。
要使属性具有动画功能,属性必须满足以下三个要求:
它必须是依赖项属性。
它必须属于继承自 DependencyObject 并实现 IAnimatable 接口的类。
必须存在可用的兼容动画类型.
WPF 包含许多具有动画属性的对象。诸如 Button、TabControl 和 Panel 控件以及 Shape 对象都继承自 DependencyObject。它们的大多数属性都是依赖项属性。
您几乎可以在任何地方使用动画,包括在样式和控件模板中使用。动画未必可见;对于不属于用户界面的对象,只要它们满足本节中所述的条件,便可以对其进行动画处理。
示例:使元素逐渐进入视野并从视野中逐渐消失
此示例演示如何使用 WPF 动画对依赖项属性的值进行动画处理。本示例使用 DoubleAnimation(一种生成 Double 值的动画类型)对 Rectangle 的 Opacity 属性进行动画处理。因此,Rectangle 将逐渐进入视野并逐渐从视野中消失。
示例的第一部分创建一个 Rectangle 元素,并将其显示在 Page 中。下面的步骤表明如何创建动画并将其应用于矩形的 Opacity 属性。
第 1 部分:创建 DoubleAnimation
使元素逐渐进入视野并逐渐从视野中消失的一种方法是对其 Opacity 属性进行动画处理。由于 Opacity 属性的类型是 Double,因此需要一个产生双精度值的动画。DoubleAnimation 就是这样的一个动画。DoubleAnimation 创建两个双精度值之间的过渡。若要指定其起始值,可设置其 From 属性。若要指定其终止值,可设置其 To 属性。
不透明度值 1.0 使对象完全不透明,不透明度值 0.0 使对象完全不可见。若要使动画的不透明度值从 1.0 过渡为 0.0,可以将其 From 属性设置为 1.0,将其 To 属性设置为 0.0。
[C#]
然后,必须指定 Duration。动画的 Duration 指定了从其起始值过渡为目标值所需的时间。在下面的示例中,为动画指定的持续时间为五秒钟。
上面的代码显示了不透明度值从 1.0 向 0.0 转换的动画,此转换使目标元素从完全不透明逐渐转变为完全不可见。若要使元素在消失后再逐渐回到视野中,请将动画的 AutoReverse 属性设置为 true。若要使动画无限期地重复,请将其 RepeatBehavior 属性设置为 Forever。
第 2 部分:创建演示图板
若要向对象应用动画,请创建 Storyboard 并使用 TargetName 和 TargetProperty 附加属性指定要进行动画处理的对象和属性。
创建 Storyboard 并将动画添加为其子项。
在代码中,将 Storyboard 声明为类成员。
然后初始化 Storyboard 并将动画添加为其子项。
必须知道要在哪里应用动画。使用 Storyboard..::.TargetName 附加属性指定要进行动画处理的对象。在下面的代码中,为 DoubleAnimation 指定了一个目标名称 MyRectangle,这是要进行动画处理的对象的名称。
说明:
在代码中创建演示图板时,必须执行两个附加步骤:创建名称范围以及注册要进行动画处理的对象的名称。本节开头的代码创建了页面和矩形,还声明了 NameScope 并注册了矩形的名称。如果还没有 NameScope,则可以使用 SetNameScope 方法创建一个。您可以使用 RegisterName 方法向为其创建了 NameScope 的元素注册目标对象的名称。否则,Storyboard 无法找到要进行动画处理的对象。
使用 TargetProperty 附加属性指定要进行动画处理的属性。在下面的代码中,