动画概述 一,创建一个简单的属性动画
动画简介
动画是通过快速播放一系列图像,每个略有不同的上一次创建这样的错觉。 人脑将作为一个变化的场景的映像组。 在电影中,使用记录许多照片或帧,每秒的照相机创建这种错觉。 当播放帧的投影仪时,观众看到的是运动的图片。
在计算机上的动画与此类似。 例如,可使矩形淡出视野之外的绘图程序可能会起作用,如下所示。
-
该程序创建一个计时器。
-
以设定间隔,以查看已用多少时间,则程序会检查计时器。
-
每次程序检查计时器,它计算当前的不透明度值根据经过多长时间的矩形。
-
程序然后使用新值更新该矩形,并重新绘制它。
之前WPF,Microsoft Windows开发人员必须创建并管理其自己的计时系统或使用特殊的自定义库。 WPF包括通过托管代码公开一个高效计时系统和可扩展应用程序标记语言 (XAML)深入地集成到WPF框架。 WPF动画,可以轻松地对控件和其他图形对象进行动画处理。
WPF处理管理计时系统和高效地重绘屏幕的所有后台工作。 它提供使您能够专注于你想要创建,而不是实现这些效果的机制的效果的计时类。 WPF此外可以轻松通过公开动画基类,这些类您的类可以从该基类继承来创建您自己的动画,以制作自定义的动画。 这些自定义动画获得很多标准的动画类的性能优势。
属性动画
在WPF,通过将动画应用于其各个属性动态显示对象。 例如,若要使框架元素增大,您设置动画效果其宽度和高度属性。 若要使淡出视图的对象,您设置动画效果其不透明度属性。
为属性具有动画功能,它必须满足以下三个要求︰
-
它必须是依赖项属性。
-
它必须属于类,该类继承DependencyObject并实现IAnimatable接口。
-
必须有兼容的动画类型。 (如果WPF未提供,您可以创建您自己。 请参阅自定义动画概述。)
WPF包含多个对象具有IAnimatable属性。 控件如按钮和TabControl,以及面板和形状对象继承自DependencyObject。 它们的大多数属性是依赖项属性。
您可以使用动画几乎任意位置,其中包括样式和控件模板中。 动画不需要将 visual;您可以对不是用户界面的一部分,它们是否符合此部分所述的条件的对象进行动画处理。
示例︰ 使元素淡入淡出和移出视图
此示例演示如何使用WPF动画依赖项属性的值进行动画处理。 它使用DoubleAnimation,这是一种类型的生成的动画Double值进行动画处理不透明度属性矩形。 因此,矩形淡入淡出视图。
该示例的第一部分创建矩形元素。 所执行的步骤演示如何创建动画,并将其应用于矩形的不透明度属性。
以下示例显示如何创建矩形中的元素StackPanel在 XAML 中。
<StackPanel Margin="10">
<Rectangle
Name="MyRectangle"
Width="100"
Height="100"
Fill="Blue">
</Rectangle>
</StackPanel>
第 1 部分︰ 创建 DoubleAnimation
要使淡入和移出视图元素的一种方法是进行动画处理其不透明度属性。 因为不透明度属性的类型为Double,您需要生成双精度值的动画。 一个DoubleAnimation是这样的一个动画。 一个DoubleAnimation创建两个双精度值之间的过渡效果。 若要指定其起始值,将设置其从属性。 若要指定其结束的值,将设置其到属性。
-
不透明度值
1.0
使对象完全不透明,并且不透明度值0.0
变得完全不可见。 To make the animation transition from1.0
to0.0
you set its From property to1.0
and its To property to0.0
. 以下示例显示如何创建DoubleAnimation在 XAML 中。 <DoubleAnimation From="1.0" To="0.0" /> DoubleAnimation myDoubleAnimation = new DoubleAnimation(); myDoubleAnimation.From = 1.0; myDoubleAnimation.To = 0.0; -
接下来,您必须指定持续时间。 持续时间动画的指定要从其起始值转到其目标值花多长时间。 以下示例显示如何设置持续时间为在 XAML 中的五秒。<DoubleAnimation From="1.0" To="0.0" Duration="0:0:5" /> myDoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(5));
-
前面的代码显示了动画从托管代码转换
1.0
到0.0
,这将导致目标元素从完全不透明逐渐转变为完全不可见。 若要使元素逐渐回到视野消失后,将设置AutoReverse到动画的属性true
。 若要使动画无限期地重复,将设置其RepeatBehavior属性设置为永远。以下示例显示如何设置AutoReverse和RepeatBehaviorXAML 中的属性。 <DoubleAnimation From="1.0" To="0.0" Duration="0:0:5" AutoReverse="True" RepeatBehavior="Forever"/> myDoubleAnimation.AutoReverse = true;
myDoubleAnimation.RepeatBehavior = RepeatBehavior.Forever;
第 2 部分︰ 创建一个情节提要
若要向对象应用动画,您创建情节提要并用TargetName和TargetProperty附加属性来指定的对象和属性进行动画处理。
-
<Storyboard>
<DoubleAnimation
From="1.0" To="0.0" Duration="0:0:1" AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard> -
public partial class MainWindow : Window
{
private Storyboard myStoryboard; -
情节提要必须知道在何处应用动画。 使用Storyboard.TargetName附加属性来指定的对象进行动画处理。 以下示例显示如何设置的目标名称DoubleAnimation到
MyRectangle
在 XAML 中。 -
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="MyRectangle" From="1.0" To="0.0" Duration="0:0:1"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard> -
Storyboard.SetTargetName(myDoubleAnimation, myRectangle.Name);
-
使用TargetProperty附加属性指定的属性进行动画处理。 下面的示例演示如何配置动画目标不透明度属性矩形在 XAML 中。
-
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="MyRectangle" Storyboard.TargetProperty="Opacity"
From="1.0" To="0.0" Duration="0:0:5"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard> -
Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath(Rectangle.OpacityProperty));
第 3 (XAML) 部分︰ 关联与某个触发器情节提要
应用并启动的最简单办法情节提要中XAML是使用一个事件触发器。 本部分说明如何将相关联情节提要与 XAML 中的触发器。
-
创建BeginStoryboard对象,并将你的情节提要与它相关联。 一个BeginStoryboard是一种TriggerAction应用和启动情节提要。
-
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="MyRectangle"
Storyboard.TargetProperty="Opacity"
From="1.0" To="0.0" Duration="0:0:5"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard> -
创建EventTrigger并添加BeginStoryboard到其操作集合。 设置RoutedEvent属性EventTrigger到想要启动的路由事件情节提要。 (有关路由事件的详细信息,请参阅路由事件概述。)
-
<!-- Animates the rectangle's opacity. -->
<EventTrigger RoutedEvent="Rectangle.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="MyRectangle"
Storyboard.TargetProperty="Opacity"
From="1.0" To="0.0" Duration="0:0:5"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger> -
添加EventTrigger到触发器的矩形的集合。
-
<Rectangle
Name="MyRectangle"
Width="100"
Height="100"
Fill="Blue">
<Rectangle.Triggers>
<!-- Animates the rectangle's opacity. -->
<EventTrigger RoutedEvent="Rectangle.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="MyRectangle"
Storyboard.TargetProperty="Opacity"
From="1.0" To="0.0" Duration="0:0:5"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
第 3 (代码) 部分︰ 关联演示图板与事件处理程序
应用并启动的最简单办法情节提要在代码中是使用一个事件处理程序。 本部分说明如何将相关联情节提要与在代码中的事件处理程序。
-
注册以进行Loaded的矩形的事件。 myRectangle.Loaded += new RoutedEventHandler(myRectangleLoaded);
-
声明事件处理程序。 在事件处理程序中,使用开始方法应用情节提要。
-
private void myRectangleLoaded(object sender, RoutedEventArgs e)
{
myStoryboard.Begin(this);
} -
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525">
<Grid>
<StackPanel Margin="10">
<Rectangle
Name="MyRectangle"
Width="100"
Height="100"
Fill="Blue">
<Rectangle.Triggers>
<!-- Animates the rectangle's opacity. -->
<EventTrigger RoutedEvent="Rectangle.Loaded">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation
Storyboard.TargetName="MyRectangle"
Storyboard.TargetProperty="Opacity"
From="1.0" To="0.0" Duration="0:0:5"
AutoReverse="True" RepeatBehavior="Forever" />
</Storyboard>
</BeginStoryboard>
</EventTrigger>
</Rectangle.Triggers>
</Rectangle>
</StackPanel>
</Grid>
</Window> -
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Media.Animation;
namespace WpfApplication1
{
public partial
class MainWindow : Window {
private Storyboard myStoryboard;
public MainWindow()
{
InitializeComponent();
StackPanel myPanel = new StackPanel();
myPanel.Margin = new Thickness(10);
Rectangle myRectangle = new Rectangle();
myRectangle.Name = "myRectangle";
this.RegisterName(myRectangle.Name, myRectangle);
myRectangle.Width = 100;
myRectangle.Height = 100;
myRectangle.Fill = Brushes.Blue;
DoubleAnimation myDoubleAnimation = new DoubleAnimation();
myDoubleAnimation.From = 1.0;
myDoubleAnimation.To = 0.0;
myDoubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(5));
myDoubleAnimation.AutoReverse = true;
myDoubleAnimation.RepeatBehavior = RepeatBehavior.Forever;
myStoryboard = new Storyboard();
myStoryboard.Children.Add(myDoubleAnimation);
Storyboard.SetTargetName(myDoubleAnimation, myRectangle.Name);
Storyboard.SetTargetProperty(myDoubleAnimation,
new PropertyPath(Rectangle.OpacityProperty));
// Use the Loaded event to start the Storyboard.
myRectangle.Loaded += new RoutedEventHandler(myRectangleLoaded);
myPanel.Children.Add(myRectangle);
this.Content = myPanel;
}
private void myRectangleLoaded(object sender, RoutedEventArgs e)
{
myStoryboard.Begin(this);
}
}
}
上一篇: RichTextBox文件格式错误