现在的位置: 首页 > 综合 > 正文

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

2011年04月13日 ⁄ 综合 ⁄ 共 5448字 ⁄ 字号 评论关闭

先准备一个基本的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

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

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[0as 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(0001);

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

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

_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/)

抱歉!评论已关闭.