首先一个简单动画的定义过程
//1.创建动画对象</span>
DoubleAnimation doubleAnimation = new DoubleAnimation();
doubleAnimation.From = 10;//设置开始值
doubleAnimation.To = 100;//设置结束值
doubleAnimation.Duration = new Duration(TimeSpan.FromSeconds(5));//动画运行时间
doubleAnimation.AutoReverse = true;//设置动画播放完后反向在播放
doubleAnimation.RepeatBehavior = RepeatBehavior.Forever;//设置为循环播放
doubleAnimation.FillBehavior = FillBehavior.HoldEnd;//在动画结束时保持大小
//doubleAnimation.FillBehavior = FillBehavior.Stop;//在动画结束时恢复原值
//2.创建故事板 并把动画对象加入到该故事板中
Storyboard storyboard = new Storyboard();
storyboard.Children.Add(doubleAnimation);
//3. 指定要执行该故事板的对象
Storyboard.SetTarget(doubleAnimation,name);//指定要执行动画的对象。
//4.指定要进行动画处理的属性
Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath("(Canvas.Top)"));
storyboard.Begin();//开始动画
Storyboard.SetTarget(doubleAnimation, name);设置doubleAniamtion的作用对象是名为name的对象,注意到传入的第二个参数是一个字符串name,那么我们的程序怎么知道name这个字符串就是指我们的动画呢,这里存在一个名称与对象的映射,即我们的name映射到具体对象,为了构造这个映射我们涉及到了NameScope(名字域)这个概念.NameScope.SetNameScope(this, new NameScope());
this.RegisterName(name, nameObject);上面的代码中,this设置了一个名字域,nameObject向这个名字域注册了自己的名字,这样我们的程序就可以通过this的名字域来查找到nameObject与name之间的映射关系了storyboard.Begin(this);属性链
为了构造PropertyChain,我们先定义一个DependencyProperty的数组,注意数组的元素是怎么来的,它按照属性链的"链条"关系依次书写,直到到达我们最终要修改的属性,(由于我们是通过将RenderTransformProperty设置为TranslateTransform类型,所以第二个元素是TranslateTransform.XProperty),简单地说就是(类型1.属性1,类型2.属性2,....类型n.属性n),其中类型i是属性i-1的类型或可以与之转换的类型.DependencyProperty[] propertyChain = new DependencyProperty[] { <span style="white-space:pre"> </span>Button.RenderTransformProperty, <span style="white-space:pre"> </span>TranslateTransform.XProperty }; Storyboard.SetTargetProperty(xAnimation, new PropertyPath("(0).(1)", propertyChain));