• 使用StoryBoard执行动画


      在WPF动画编程中,最常用的动画处理方式是DoubleAnimation动画,但是随着你的开发经验越来越多,你会发现,有时候使用这个动画类会很麻烦,因为这个动画是封闭动画,也就是说在动画的时间间隔内,你不能对它做对应依赖属性的赋值操作,这让你很多时候止步于很好的想法。

      因为我们要求某个时刻动画能停止,属性能赋值新的值。所以WPF中提供StoryBoard,这个和IOS中StoryBoard概念有点像,故事版嘛,就是一大堆事情放在同一块进行统一处理,例如你对某个对象坐了多个属性的动画,这些动画就可以用一个StoryBoard统一管理,极其方便。下面博主写了一个StoryBoard的动画,描述一个矩形位置移动,相信在你以后的开发当中会经常用到。

     1  public partial class Window1 : Window
     2     {
     3         public Window1()
     4         {
     5             InitializeComponent();
     6             Loaded += new RoutedEventHandler(Window1_Loaded);
     7         }
     8         Storyboard _sb = new Storyboard();
     9         Rectangle rect1 = new Rectangle();
    10 
    11         void Window1_Loaded(object sender, RoutedEventArgs e)
    12         {
    13             DoubleAnimation da = new DoubleAnimation()
    14             {
    15                 From = 0,
    16                 To = 300,
    17                 FillBehavior = FillBehavior.Stop,
    18                 //AutoReverse = true,
    19                 //RepeatBehavior = RepeatBehavior.Forever,
    20                 Duration = TimeSpan.FromSeconds(2)
    21             };
    22             DoubleAnimation da1 = new DoubleAnimation()
    23             {
    24                 From = 0,
    25                 FillBehavior = FillBehavior.Stop,
    26                 To = 300,
    27                 //RepeatBehavior = RepeatBehavior.Forever,
    28                 Duration = TimeSpan.FromSeconds(2)
    29             };
    30             Rectangle rect = new Rectangle();
    31 
    32             rect.Width = rect.Height = 100;
    33             rect.Fill = Brushes.Blue;
    34             _canvas.Children.Add(rect);
    35 
    36             rect1.Width = rect1.Height = 100;
    37             rect1.Fill = Brushes.Red;
    38             _canvas.Children.Add(rect1);
    39 
    40             _sb.Children.Add(da);
    41             Storyboard.SetTarget(da, rect);
    42             Storyboard.SetTargetProperty(da, new PropertyPath(Canvas.LeftProperty));
    43             _sb.Begin();
    44         }
    45         /// <summary>
    46         /// 开始动画
    47         /// </summary>
    48         /// <param name="sender"></param>
    49         /// <param name="e"></param>
    50         private void Button_Click(object sender, RoutedEventArgs e)
    51         {
    52             bsCopy = _sb.Clone();
    53             bsCopy.Children.Clear();
    54             foreach (var item in _sb.Children)
    55             {
    56 
    57                 bsCopy.Children.Add(item);
    58                 Storyboard.SetTarget(item, rect1);
    59                 Storyboard.SetTargetProperty(item, Storyboard.GetTargetProperty(item));
    60             }
    61             bsCopy.FillBehavior = FillBehavior.Stop;
    62             bsCopy.Completed += delegate
    63             {
    64                 int a = 3;
    65                 Canvas.SetLeft(rect1, 100);
    66             };
    67             bsCopy.Begin();
    68         }
    69         /// <summary>
    70         /// 停止动画
    71         /// </summary>
    72         Storyboard bsCopy;
    73         private void Button_Click_1(object sender, RoutedEventArgs e)
    74         {
    75             bsCopy.Stop();
    76             Canvas.SetLeft(rect1, 100);
    77         }
    78     }
    View Code
  • 相关阅读:
    火狐flash插件
    centos 安装php ide (eclipse + php 插件)
    编译器的工作过程
    php中调用mysql的存储过程和存储函数
    mysql 高性能
    存储过程/游标/mysql 函数
    php 生成二维码
    frameset,frame应用,常用于后台
    html5 meta头部设置
    CAReplicatorLayer复制Layer和动画, 实现神奇的效果
  • 原文地址:https://www.cnblogs.com/JimmyBright/p/4356072.html
Copyright © 2020-2023  润新知