且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

silverlight如何在运行时用代码动态控制(或创建)动画

更新时间:2022-08-20 13:27:18

silverlight做一些复杂动画时,不可能所有的动画都事先用Blend之类的设计工具"画"好(或者在设计期就在vs里编好),很多时候我们希望在运行时能动态控制动画,或者凭空动态创建一段动画.

sl3.0的官方sdk文档里有一节"以编程方式使用动画"讲的就是这个,今天研究了下整理分析于此:

对于事先"画"好(或者称之为在设计期准备好的动画),我们可以在运行时通过名字获取动画引用,进而改变某些属性:

1.示例1(代码来自sdk,以下同),运行时动态改变动画的To属性值,从而实现鼠标点击跟随效果

Xaml部分:

silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画Change.Xaml
silverlight如何在运行时用代码动态控制(或创建)动画<UserControl x:Class="AnimationControl.Change"
silverlight如何在运行时用代码动态控制(或创建)动画    xmlns
="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
silverlight如何在运行时用代码动态控制(或创建)动画    xmlns:x
="http://schemas.microsoft.com/winfx/2006/xaml"
silverlight如何在运行时用代码动态控制(或创建)动画    xmlns:d
="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
silverlight如何在运行时用代码动态控制(或创建)动画    mc:Ignorable
="d" >
silverlight如何在运行时用代码动态控制(或创建)动画    
<Canvas MouseLeftButtonDown="Handle_MouseDown" Background="DarkSeaGreen" Width="400" Height="300" Cursor="Hand">
silverlight如何在运行时用代码动态控制(或创建)动画        
<Canvas.Resources>
silverlight如何在运行时用代码动态控制(或创建)动画            
<Storyboard x:Name="myStoryboard">
silverlight如何在运行时用代码动态控制(或创建)动画                
<PointAnimation x:Name="myPointAnimation" Storyboard.TargetProperty="Center" Storyboard.TargetName="MyAnimatedEllipseGeometry" Duration="0:0:0.5"/>
silverlight如何在运行时用代码动态控制(或创建)动画            
</Storyboard>
silverlight如何在运行时用代码动态控制(或创建)动画        
</Canvas.Resources>
silverlight如何在运行时用代码动态控制(或创建)动画
silverlight如何在运行时用代码动态控制(或创建)动画        
<TextBlock Text="请在圆形之外的空白处点击"  Foreground="White" FontStretch="Normal" FontWeight="Bold" FontSize="18" TextAlignment="Center" Canvas.Left="100" Canvas.Top="130" Cursor="Hand" Opacity="0.5">
silverlight如何在运行时用代码动态控制(或创建)动画
silverlight如何在运行时用代码动态控制(或创建)动画        
</TextBlock>
silverlight如何在运行时用代码动态控制(或创建)动画        
silverlight如何在运行时用代码动态控制(或创建)动画        
<Path Fill="Blue">
silverlight如何在运行时用代码动态控制(或创建)动画            
<Path.Data>
silverlight如何在运行时用代码动态控制(或创建)动画                
<EllipseGeometry x:Name="MyAnimatedEllipseGeometry" Center="200,100" RadiusX="15" RadiusY="15" />
silverlight如何在运行时用代码动态控制(或创建)动画            
</Path.Data>
silverlight如何在运行时用代码动态控制(或创建)动画        
</Path>
silverlight如何在运行时用代码动态控制(或创建)动画
silverlight如何在运行时用代码动态控制(或创建)动画        
silverlight如何在运行时用代码动态控制(或创建)动画    
</Canvas>
silverlight如何在运行时用代码动态控制(或创建)动画
</UserControl>

布局很简单,一个Canvas上放了一个圆,并创建了一个动画myPointAnimation

CS部分:

silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画Change.Xaml.Cs
 1silverlight如何在运行时用代码动态控制(或创建)动画using System.Windows;
 2silverlight如何在运行时用代码动态控制(或创建)动画using System.Windows.Controls;
 3silverlight如何在运行时用代码动态控制(或创建)动画using System.Windows.Input;
 4silverlight如何在运行时用代码动态控制(或创建)动画
 5silverlight如何在运行时用代码动态控制(或创建)动画namespace AnimationControl
 6silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画{
 7silverlight如何在运行时用代码动态控制(或创建)动画    public partial class Change : UserControl
 8silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画    silverlight如何在运行时用代码动态控制(或创建)动画{
 9silverlight如何在运行时用代码动态控制(或创建)动画        public Change()
10silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画        silverlight如何在运行时用代码动态控制(或创建)动画{
11silverlight如何在运行时用代码动态控制(或创建)动画            InitializeComponent();
12silverlight如何在运行时用代码动态控制(或创建)动画        }

13silverlight如何在运行时用代码动态控制(或创建)动画
14silverlight如何在运行时用代码动态控制(或创建)动画        private void Handle_MouseDown(object sender, MouseButtonEventArgs e)
15silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画        silverlight如何在运行时用代码动态控制(或创建)动画{
16silverlight如何在运行时用代码动态控制(或创建)动画            //取得鼠标当前在Canvas中的点击坐标
17silverlight如何在运行时用代码动态控制(或创建)动画            double newX = e.GetPosition(sender as UIElement).X;
18silverlight如何在运行时用代码动态控制(或创建)动画            double newY = e.GetPosition(sender as UIElement).Y;
19silverlight如何在运行时用代码动态控制(或创建)动画            Point myPoint = new Point();
20silverlight如何在运行时用代码动态控制(或创建)动画            myPoint.X = newX;
21silverlight如何在运行时用代码动态控制(或创建)动画            myPoint.Y = newY;
22silverlight如何在运行时用代码动态控制(或创建)动画
23silverlight如何在运行时用代码动态控制(或创建)动画            //动态设置动画的To属性值
24silverlight如何在运行时用代码动态控制(或创建)动画            myPointAnimation.To = myPoint;
25silverlight如何在运行时用代码动态控制(或创建)动画
26silverlight如何在运行时用代码动态控制(或创建)动画            //播放
27silverlight如何在运行时用代码动态控制(或创建)动画            myStoryboard.Begin();
28silverlight如何在运行时用代码动态控制(或创建)动画        }

29silverlight如何在运行时用代码动态控制(或创建)动画
30silverlight如何在运行时用代码动态控制(或创建)动画    }

31silverlight如何在运行时用代码动态控制(或创建)动画}

32silverlight如何在运行时用代码动态控制(或创建)动画

代码不长,一看就明,获取鼠标的点击坐标后,赋值为动画myPointAnimation的To属性(即移动后的目标坐标值),然后播放

2.示例2,有时候很多对象可能会引用到同一效果的动画,每个对象都去创建一个动画太浪费,这时候我们可以把类似的动画通过改变TartgetName值得以重用

但有一点要注意:因为同一个动画同一时间只能有一个Target,所以如果给这个动画赋值了TartgetName,并且该动画正在播放的过程中,又用代码给动画的TargetName属性赋值另外一个对象,并要求播放,显示是会失效的。(实际测试中发现,虽然这样不会抛出任何异常)

为避免这种错误的发生,sdk中的示例代码提示我们可以这样做:
Xaml部分:

silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画Code
 1silverlight如何在运行时用代码动态控制(或创建)动画<UserControl x:Class="AnimationControl.Change2"
 2silverlight如何在运行时用代码动态控制(或创建)动画    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3silverlight如何在运行时用代码动态控制(或创建)动画    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4silverlight如何在运行时用代码动态控制(或创建)动画    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5silverlight如何在运行时用代码动态控制(或创建)动画    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6silverlight如何在运行时用代码动态控制(或创建)动画    mc:Ignorable="d"
 7silverlight如何在运行时用代码动态控制(或创建)动画   >
 8silverlight如何在运行时用代码动态控制(或创建)动画
 9silverlight如何在运行时用代码动态控制(或创建)动画    <StackPanel Orientation="Horizontal">
10silverlight如何在运行时用代码动态控制(或创建)动画        <StackPanel.Resources>
11silverlight如何在运行时用代码动态控制(或创建)动画            <Storyboard x:Name="myStoryboard1" Completed="Storyboard_Completed">
12silverlight如何在运行时用代码动态控制(或创建)动画                <DoubleAnimation x:Name="myDoubleAnimation1" Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:2" AutoReverse="True" />
13silverlight如何在运行时用代码动态控制(或创建)动画            </Storyboard>
14silverlight如何在运行时用代码动态控制(或创建)动画            <Storyboard x:Name="myStoryboard2" Completed="Storyboard_Completed">
15silverlight如何在运行时用代码动态控制(或创建)动画                <DoubleAnimation x:Name="myDoubleAnimation2" Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:2" AutoReverse="True" />
16silverlight如何在运行时用代码动态控制(或创建)动画            </Storyboard>
17silverlight如何在运行时用代码动态控制(或创建)动画            <Storyboard x:Name="myStoryboard3" Completed="Storyboard_Completed">
18silverlight如何在运行时用代码动态控制(或创建)动画                <DoubleAnimation x:Name="myDoubleAnimation3" Storyboard.TargetProperty="Opacity" From="1.0" To="0.0" Duration="0:0:2" AutoReverse="True" />
19silverlight如何在运行时用代码动态控制(或创建)动画            </Storyboard>
20silverlight如何在运行时用代码动态控制(或创建)动画        </StackPanel.Resources>
21silverlight如何在运行时用代码动态控制(或创建)动画        <Rectangle x:Name="MyAnimatedRectangle1" Margin="3" Width="90" Height="100" Fill="Blue" MouseLeftButtonDown="Start_Animation" Cursor="Hand" />
22silverlight如何在运行时用代码动态控制(或创建)动画        <Rectangle x:Name="MyAnimatedRectangle2" Margin="3" Width="90" Height="100" Fill="Blue" MouseLeftButtonDown="Start_Animation" Cursor="Hand" />
23silverlight如何在运行时用代码动态控制(或创建)动画        <Rectangle x:Name="MyAnimatedRectangle3" Margin="3" Width="90" Height="100" Fill="Blue" MouseLeftButtonDown="Start_Animation" Cursor="Hand" />
24silverlight如何在运行时用代码动态控制(或创建)动画        <Rectangle x:Name="MyAnimatedRectangle4" Margin="3" Width="90" Height="100" Fill="Blue" MouseLeftButtonDown="Start_Animation" Cursor="Hand" />
25silverlight如何在运行时用代码动态控制(或创建)动画    </StackPanel>
26silverlight如何在运行时用代码动态控制(或创建)动画    
27silverlight如何在运行时用代码动态控制(或创建)动画</UserControl>
28silverlight如何在运行时用代码动态控制(或创建)动画

StackPanel中横向放了4个矩形,同时放置了三个完全相同的double型动画(用来让对象的透明度从1变到0,即渐渐淡去),实现目的:4个矩形,3个动画,显示按照一一对应的默认原则,总会有一个矩形无法分配到动画,如何实现重用呢?看下面的

cs部分:

silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画Code
 1silverlight如何在运行时用代码动态控制(或创建)动画using System;
 2silverlight如何在运行时用代码动态控制(或创建)动画using System.Windows.Controls;
 3silverlight如何在运行时用代码动态控制(或创建)动画using System.Windows.Input;
 4silverlight如何在运行时用代码动态控制(或创建)动画using System.Windows.Media.Animation;
 5silverlight如何在运行时用代码动态控制(或创建)动画using System.Windows.Shapes;
 6silverlight如何在运行时用代码动态控制(或创建)动画
 7silverlight如何在运行时用代码动态控制(或创建)动画namespace AnimationControl
 8silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画{
 9silverlight如何在运行时用代码动态控制(或创建)动画    public partial class Change2 : UserControl
10silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画    silverlight如何在运行时用代码动态控制(或创建)动画{
11silverlight如何在运行时用代码动态控制(或创建)动画        public Change2()
12silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画        silverlight如何在运行时用代码动态控制(或创建)动画{
13silverlight如何在运行时用代码动态控制(或创建)动画            InitializeComponent();
14silverlight如何在运行时用代码动态控制(或创建)动画        }

15silverlight如何在运行时用代码动态控制(或创建)动画
16silverlight如何在运行时用代码动态控制(或创建)动画        bool storyboard1Active = false;
17silverlight如何在运行时用代码动态控制(或创建)动画        bool storyboard2Active = false;
18silverlight如何在运行时用代码动态控制(或创建)动画        bool storyboard3Active = false;
19silverlight如何在运行时用代码动态控制(或创建)动画            
20silverlight如何在运行时用代码动态控制(或创建)动画        private void Start_Animation(object sender, MouseEventArgs e)
21silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画        silverlight如何在运行时用代码动态控制(或创建)动画{
22silverlight如何在运行时用代码动态控制(或创建)动画            //得到被点击的矩形对象引用
23silverlight如何在运行时用代码动态控制(或创建)动画            Rectangle myRect = (Rectangle)sender;
24silverlight如何在运行时用代码动态控制(或创建)动画
25silverlight如何在运行时用代码动态控制(或创建)动画            if (!storyboard1Active)
26silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画            silverlight如何在运行时用代码动态控制(或创建)动画{
27silverlight如何在运行时用代码动态控制(或创建)动画                myStoryboard1.Stop();
28silverlight如何在运行时用代码动态控制(或创建)动画                myDoubleAnimation1.SetValue(Storyboard.TargetNameProperty, myRect.Name);
29silverlight如何在运行时用代码动态控制(或创建)动画                myStoryboard1.Begin();
30silverlight如何在运行时用代码动态控制(或创建)动画                storyboard1Active = true;
31silverlight如何在运行时用代码动态控制(或创建)动画            }

32silverlight如何在运行时用代码动态控制(或创建)动画            else if (!storyboard2Active)
33silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画            silverlight如何在运行时用代码动态控制(或创建)动画{
34silverlight如何在运行时用代码动态控制(或创建)动画                myStoryboard2.Stop();
35silverlight如何在运行时用代码动态控制(或创建)动画                myDoubleAnimation2.SetValue(Storyboard.TargetNameProperty, myRect.Name);
36silverlight如何在运行时用代码动态控制(或创建)动画                myStoryboard2.Begin();
37silverlight如何在运行时用代码动态控制(或创建)动画                storyboard2Active = true;
38silverlight如何在运行时用代码动态控制(或创建)动画            }

39silverlight如何在运行时用代码动态控制(或创建)动画            else if (!storyboard3Active)
40silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画            silverlight如何在运行时用代码动态控制(或创建)动画{
41silverlight如何在运行时用代码动态控制(或创建)动画                myStoryboard3.Stop();
42silverlight如何在运行时用代码动态控制(或创建)动画                myDoubleAnimation3.SetValue(Storyboard.TargetNameProperty, myRect.Name);
43silverlight如何在运行时用代码动态控制(或创建)动画                myStoryboard3.Begin();
44silverlight如何在运行时用代码动态控制(或创建)动画                storyboard3Active = true;
45silverlight如何在运行时用代码动态控制(或创建)动画            }

46silverlight如何在运行时用代码动态控制(或创建)动画        }

47silverlight如何在运行时用代码动态控制(或创建)动画
48silverlight如何在运行时用代码动态控制(或创建)动画        private void Storyboard_Completed(object sender, EventArgs e)
49silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画        silverlight如何在运行时用代码动态控制(或创建)动画{
50silverlight如何在运行时用代码动态控制(或创建)动画            Storyboard myStoryboard = sender as Storyboard;
51silverlight如何在运行时用代码动态控制(或创建)动画            switch (myStoryboard.GetValue(NameProperty).ToString())
52silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画            silverlight如何在运行时用代码动态控制(或创建)动画{
53silverlight如何在运行时用代码动态控制(或创建)动画                case "myStoryboard1": storyboard1Active = falsebreak;
54silverlight如何在运行时用代码动态控制(或创建)动画                case "myStoryboard2": storyboard2Active = falsebreak;
55silverlight如何在运行时用代码动态控制(或创建)动画                case "myStoryboard3": storyboard3Active = falsebreak;
56silverlight如何在运行时用代码动态控制(或创建)动画            }

57silverlight如何在运行时用代码动态控制(或创建)动画        }

58silverlight如何在运行时用代码动态控制(或创建)动画
59silverlight如何在运行时用代码动态控制(或创建)动画    }

60silverlight如何在运行时用代码动态控制(或创建)动画}

61silverlight如何在运行时用代码动态控制(或创建)动画

这里注意:定义了三个标识变量,用于标识每个动画是否正在播放中,如果播放完成后该变量为false,否则为true(即正在播放),这个每个矩形上点击请求播放动画时,总是优先找到空闲(即处于播放状态)的动画,然后为该动画赋值TargetName属性并播放,同时播放途中把对应的标识变量改成true,以防止播放过程中被人修改TargetName值

也许有人会问了:如果没找到空闲的动画,不是没效果了?Yes,你猜对了,如果快速依次点击4个矩形,会发现最后一次点击没什么变化。这种情况就要用到下面提到的代码动态创建动画了

3。示例3 代码动态创建动画
理解起来很简单,代码创建动画对象,并让其播放。
xaml部分:

silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画Code
 1silverlight如何在运行时用代码动态控制(或创建)动画<UserControl x:Class="AnimationControl.Create"
 2silverlight如何在运行时用代码动态控制(或创建)动画    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3silverlight如何在运行时用代码动态控制(或创建)动画    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4silverlight如何在运行时用代码动态控制(或创建)动画    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
 5silverlight如何在运行时用代码动态控制(或创建)动画    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
 6silverlight如何在运行时用代码动态控制(或创建)动画    mc:Ignorable="d"
 7silverlight如何在运行时用代码动态控制(或创建)动画   >
 8silverlight如何在运行时用代码动态控制(或创建)动画
 9silverlight如何在运行时用代码动态控制(或创建)动画    <Canvas Name="LayoutRoot" Background="DarkOliveGreen" Width="400" Height="300">
10silverlight如何在运行时用代码动态控制(或创建)动画        <TextBlock Text="点击我将动态创建一段动画" MouseLeftButtonDown="TextBlock_MouseLeftButtonDown" Foreground="White" FontStretch="Normal" FontWeight="Bold" FontSize="18" TextAlignment="Center" Canvas.Left="100" Canvas.Top="130" Cursor="Hand" Opacity="0.5">
11silverlight如何在运行时用代码动态控制(或创建)动画            
12silverlight如何在运行时用代码动态控制(或创建)动画        </TextBlock>
13silverlight如何在运行时用代码动态控制(或创建)动画    </Canvas>
14silverlight如何在运行时用代码动态控制(或创建)动画</UserControl>
15silverlight如何在运行时用代码动态控制(或创建)动画

一个几乎是空的Canvas,没啥特别的
再来看cs部分:

silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画Code
 1silverlight如何在运行时用代码动态控制(或创建)动画using System;
 2silverlight如何在运行时用代码动态控制(或创建)动画using System.Windows;
 3silverlight如何在运行时用代码动态控制(或创建)动画using System.Windows.Controls;
 4silverlight如何在运行时用代码动态控制(或创建)动画using System.Windows.Media;
 5silverlight如何在运行时用代码动态控制(或创建)动画using System.Windows.Media.Animation;
 6silverlight如何在运行时用代码动态控制(或创建)动画using System.Windows.Shapes;
 7silverlight如何在运行时用代码动态控制(或创建)动画
 8silverlight如何在运行时用代码动态控制(或创建)动画namespace AnimationControl
 9silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画{
10silverlight如何在运行时用代码动态控制(或创建)动画    public partial class Create : UserControl
11silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画    silverlight如何在运行时用代码动态控制(或创建)动画{
12silverlight如何在运行时用代码动态控制(或创建)动画        public Create()
13silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画        silverlight如何在运行时用代码动态控制(或创建)动画{
14silverlight如何在运行时用代码动态控制(或创建)动画            
15silverlight如何在运行时用代码动态控制(或创建)动画            InitializeComponent();
16silverlight如何在运行时用代码动态控制(或创建)动画           
17silverlight如何在运行时用代码动态控制(或创建)动画        }

18silverlight如何在运行时用代码动态控制(或创建)动画
19silverlight如何在运行时用代码动态控制(或创建)动画        public void CreateAnimation()
20silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画        silverlight如何在运行时用代码动态控制(或创建)动画{
21silverlight如何在运行时用代码动态控制(或创建)动画            //创建一个矩形
22silverlight如何在运行时用代码动态控制(或创建)动画            Rectangle myRectangle = new Rectangle();
23silverlight如何在运行时用代码动态控制(或创建)动画            myRectangle.Width = 50;
24silverlight如何在运行时用代码动态控制(或创建)动画            myRectangle.Height = 50;           
25silverlight如何在运行时用代码动态控制(或创建)动画            myRectangle.Fill = new SolidColorBrush(Color.FromArgb(25525500));
26silverlight如何在运行时用代码动态控制(或创建)动画
27silverlight如何在运行时用代码动态控制(或创建)动画            //把矩形加入到Canvas中
28silverlight如何在运行时用代码动态控制(或创建)动画            LayoutRoot.Children.Add(myRectangle);
29silverlight如何在运行时用代码动态控制(或创建)动画
30silverlight如何在运行时用代码动态控制(或创建)动画            //创建二个double型的动画,并设定播放时间为2秒
31silverlight如何在运行时用代码动态控制(或创建)动画            Duration duration = new Duration(TimeSpan.FromSeconds(2));            
32silverlight如何在运行时用代码动态控制(或创建)动画            DoubleAnimation myDoubleAnimation1 = new DoubleAnimation();
33silverlight如何在运行时用代码动态控制(或创建)动画            DoubleAnimation myDoubleAnimation2 = new DoubleAnimation();
34silverlight如何在运行时用代码动态控制(或创建)动画
35silverlight如何在运行时用代码动态控制(或创建)动画            myDoubleAnimation1.Duration = duration;
36silverlight如何在运行时用代码动态控制(或创建)动画            myDoubleAnimation2.Duration = duration;
37silverlight如何在运行时用代码动态控制(或创建)动画
38silverlight如何在运行时用代码动态控制(或创建)动画            //创建故事版,并加入上面的二个double型动画
39silverlight如何在运行时用代码动态控制(或创建)动画            Storyboard sb = new Storyboard();
40silverlight如何在运行时用代码动态控制(或创建)动画            sb.Duration = duration;
41silverlight如何在运行时用代码动态控制(或创建)动画
42silverlight如何在运行时用代码动态控制(或创建)动画            sb.Children.Add(myDoubleAnimation1);
43silverlight如何在运行时用代码动态控制(或创建)动画            sb.Children.Add(myDoubleAnimation2);
44silverlight如何在运行时用代码动态控制(或创建)动画
45silverlight如何在运行时用代码动态控制(或创建)动画            //设置动画的Target目标值
46silverlight如何在运行时用代码动态控制(或创建)动画            Storyboard.SetTarget(myDoubleAnimation1, myRectangle);
47silverlight如何在运行时用代码动态控制(或创建)动画            Storyboard.SetTarget(myDoubleAnimation2, myRectangle);
48silverlight如何在运行时用代码动态控制(或创建)动画
49silverlight如何在运行时用代码动态控制(或创建)动画            //设置动画的变化属性
50silverlight如何在运行时用代码动态控制(或创建)动画            Storyboard.SetTargetProperty(myDoubleAnimation1, new PropertyPath("(Canvas.Left)"));
51silverlight如何在运行时用代码动态控制(或创建)动画            Storyboard.SetTargetProperty(myDoubleAnimation2, new PropertyPath("(Canvas.Top)"));
52silverlight如何在运行时用代码动态控制(或创建)动画
53silverlight如何在运行时用代码动态控制(或创建)动画            myDoubleAnimation1.To = 200;
54silverlight如何在运行时用代码动态控制(或创建)动画            myDoubleAnimation2.To = 200;
55silverlight如何在运行时用代码动态控制(或创建)动画
56silverlight如何在运行时用代码动态控制(或创建)动画            if (!LayoutRoot.Resources.Contains("unique_id"))
57silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画            silverlight如何在运行时用代码动态控制(或创建)动画{
58silverlight如何在运行时用代码动态控制(或创建)动画                //将动画版加入Canvas资源,注意:这里的unique_id必须是资源中没有的唯一键
59silverlight如何在运行时用代码动态控制(或创建)动画                LayoutRoot.Resources.Add("unique_id", sb);
60silverlight如何在运行时用代码动态控制(或创建)动画                sb.Completed += new EventHandler(sb_Completed);
61silverlight如何在运行时用代码动态控制(或创建)动画
62silverlight如何在运行时用代码动态控制(或创建)动画                //播放
63silverlight如何在运行时用代码动态控制(或创建)动画                sb.Begin();
64silverlight如何在运行时用代码动态控制(或创建)动画            }

65silverlight如何在运行时用代码动态控制(或创建)动画            else
66silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画            silverlight如何在运行时用代码动态控制(或创建)动画{
67silverlight如何在运行时用代码动态控制(或创建)动画                sb = null;
68silverlight如何在运行时用代码动态控制(或创建)动画                LayoutRoot.Children.Remove(myRectangle);
69silverlight如何在运行时用代码动态控制(或创建)动画            }

70silverlight如何在运行时用代码动态控制(或创建)动画
71silverlight如何在运行时用代码动态控制(或创建)动画            
72silverlight如何在运行时用代码动态控制(或创建)动画
73silverlight如何在运行时用代码动态控制(或创建)动画        }

74silverlight如何在运行时用代码动态控制(或创建)动画
75silverlight如何在运行时用代码动态控制(或创建)动画        void sb_Completed(object sender, EventArgs e)
76silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画        silverlight如何在运行时用代码动态控制(或创建)动画{
77silverlight如何在运行时用代码动态控制(或创建)动画            LayoutRoot.Resources.Remove("unique_id");//播放完成后,移除资源,否则再次点击时将报错
78silverlight如何在运行时用代码动态控制(或创建)动画        }

79silverlight如何在运行时用代码动态控制(或创建)动画
80silverlight如何在运行时用代码动态控制(或创建)动画        private void TextBlock_MouseLeftButtonDown(object sender, System.Windows.Input.MouseButtonEventArgs e)
81silverlight如何在运行时用代码动态控制(或创建)动画silverlight如何在运行时用代码动态控制(或创建)动画        silverlight如何在运行时用代码动态控制(或创建)动画{
82silverlight如何在运行时用代码动态控制(或创建)动画            CreateAnimation();
83silverlight如何在运行时用代码动态控制(或创建)动画        }

84silverlight如何在运行时用代码动态控制(或创建)动画    }

85silverlight如何在运行时用代码动态控制(或创建)动画}

86silverlight如何在运行时用代码动态控制(或创建)动画

几乎所有关键的地方,都加了注释了应该能容易看明白

这里有一点要注意:创建动画的代码,必须放在构造函数中的InitializeComponent()之后调用,原因很简单,如果组件尚未初始化完毕,这时向根容器加入一些动态创建的元件当然会报错。