zoukankan      html  css  js  c++  java
  • silverlight中用代码动态控制Storyboard(动画)属性的三种方法

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

    作者:菩提树下的杨过
    出处:http://yjmyzz.cnblogs.com
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    CentOS 5.5和5.6 安装后的网络配置
    CentOS 5.5 系统安全配置
    printk: messages suppressed
    “找不到出路的”vb6.0
    用户控件的烦扰
    rman恢复
    oracle数据字典
    oracle自关联表的子删父变功能实现
    oracle自治事务
    oracle表空间更名
  • 原文地址:https://www.cnblogs.com/yjmyzz/p/1595393.html
Copyright © 2011-2022 走看看