silverlight中用代码动态控制Storyboard(动画)属性的三种方法

时间:2022-01-28 05:53:07

先准备一个基本的xaml页面

silverlight中用代码动态控制Storyboard(动画)属性的三种方法silverlight中用代码动态控制Storyboard(动画)属性的三种方法Code

结构不复杂,里面就放了一张图片,同时预置了一个动画storyTest,里面把几种常见的动画形式都列在里面了,下面就来看看如何动态改变storyTest动画的属性(比如改变旋转的起始角度之类)

1.直接加x:Name,然后引用赋值

1 silverlight中用代码动态控制Storyboard(动画)属性的三种方法< DoubleAnimationUsingKeyFrames  BeginTime ="00:00:00"  Storyboard.TargetName ="img"  Storyboard.TargetProperty ="(UIElement.Projection).(PlaneProjection.RotationY)" >
2 silverlight中用代码动态控制Storyboard(动画)属性的三种方法     < EasingDoubleKeyFrame  KeyTime ="00:00:01"  Value ="360"   x:Name ="yFrom" />
3 silverlight中用代码动态控制Storyboard(动画)属性的三种方法     < EasingDoubleKeyFrame  KeyTime ="00:00:02"  Value ="720"   x:Name ="yTo" />
4 silverlight中用代码动态控制Storyboard(动画)属性的三种方法 </ DoubleAnimationUsingKeyFrames >
5 silverlight中用代码动态控制Storyboard(动画)属性的三种方法

注意高亮部分,然后象这样引用

System.Windows.Media.Animation.EasingDoubleKeyFrame yFrom  =   this .FindName( " yFrom " as  System.Windows.Media.Animation.EasingDoubleKeyFrame;

yFrom.Value 
=   20 ;

这样我们就把00:00:01秒时角度由360改为20度了

2.利用StoryBoard的Children属性

 DoubleAnimationUsingKeyFrames _rotate  =  storyTest.Children[ 0 as  DoubleAnimationUsingKeyFrames;
 _rotate.KeyFrames[
0 ].Value  =   90 ; // 修改旋转角度的值
 _rotate.KeyFrames[ 1 ].Value  =   180 ;

 storyTest.RepeatBehavior 
=  RepeatBehavior.Forever; // 指定为一直播放
 
// this.storyTest.RepeatBehavior = new RepeatBehavior(2); // 播放2次

这样我们就把旋转的角度值从360,720改为90,180了

说明:StoryBoard的Children属性得到的是一个Timeline的集合,而DoubleAnimationUsingKeyFrames等这些基本的关键帧类型都是继承自Timeline,因此可以用as安全的把Timeline向下转化为DoubleAnimationUsingKeyFrames

3.动态添加/删除关键帧

当xaml中预定义的关键帧不满足要求时,这种方法就几乎成了唯一选择

storyTest.Children.Clear(); // 清除原来的动画设定,仅保留一个空壳           

DoubleAnimationUsingKeyFrames _new_rotate 
=   new  DoubleAnimationUsingKeyFrames();

EasingDoubleKeyFrame _frame1 
=   new  EasingDoubleKeyFrame();
_frame1.Value 
=   180 ;
_frame1.KeyTime 
=   new  TimeSpan( 0 0 0 1 );

EasingDoubleKeyFrame _frame2 
=   new  EasingDoubleKeyFrame();
_frame2.Value 
=   0 ;
_frame2.KeyTime 
=   new  TimeSpan( 0 0 0 2 );


EasingDoubleKeyFrame _frame3 
=   new  EasingDoubleKeyFrame();
_frame3.Value 
=   90 ;
_frame3.KeyTime 
=   new  TimeSpan( 0 0 0 5 );

_new_rotate.KeyFrames.Add(_frame1);
_new_rotate.KeyFrames.Add(_frame2);
_new_rotate.KeyFrames.Add(_frame3);

storyTest.Children.Add(_new_rotate);

Storyboard.SetTarget(_new_rotate, 
this .img);
Storyboard.SetTargetProperty(_new_rotate, 
new  PropertyPath( " (UIElement.Projection).(PlaneProjection.RotationY) " ));

storyTest.AutoReverse 
=   false ;

// storyTest.FillBehavior = FillBehavior.Stop; // 加入这一行后,不管AutoReverse设置为何值,都会回复原状            

storyTest.Begin();

在这里我们把原来storyTest中的动画设定全部清空 了,同时增加了一个三帧的动画

欢迎转载,但请注明来自菩提树下的杨过(http://yjmyzz.cnblogs.com/)