先准备一个基本的xaml页面
Code
结构不复杂,里面就放了一张图片,同时预置了一个动画storyTest,里面把几种常见的动画形式都列在里面了,下面就来看看如何动态改变storyTest动画的属性(比如改变旋转的起始角度之类)
1.直接加x:Name,然后引用赋值
1
<
DoubleAnimationUsingKeyFrames
BeginTime
="00:00:00"
Storyboard.TargetName
="img"
Storyboard.TargetProperty
="(UIElement.Projection).(PlaneProjection.RotationY)"
>
2 < EasingDoubleKeyFrame KeyTime ="00:00:01" Value ="360" x:Name ="yFrom" />
3 < EasingDoubleKeyFrame KeyTime ="00:00:02" Value ="720" x:Name ="yTo" />
4 </ DoubleAnimationUsingKeyFrames >
5
2 < EasingDoubleKeyFrame KeyTime ="00:00:01" Value ="360" x:Name ="yFrom" />
3 < EasingDoubleKeyFrame KeyTime ="00:00:02" Value ="720" x:Name ="yTo" />
4 </ DoubleAnimationUsingKeyFrames >
5
注意高亮部分,然后象这样引用
System.Windows.Media.Animation.EasingDoubleKeyFrame yFrom
=
this
.FindName(
"
yFrom
"
)
as
System.Windows.Media.Animation.EasingDoubleKeyFrame;
yFrom.Value = 20 ;
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次
_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();
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/)