对silverlight中DoubleAnimation的思考

来源:互联网 发布:三星一体机扫描软件 编辑:程序博客网 时间:2024/05/30 04:30

“深蓝色的右手”在他的C#开发WPF/Silverlight动画及游戏系列教程第一课中举了一个让方块动起来的例子,但是好多人反映DoubleAnimation通不过,这是因为作者的开发环境是WPF,这样DoubleAnimation可以带三个参数,但是在silverlight中,DoubleAnimation只有不带参数的构造函数,参考http://msdn.microsoft.com/en-us/library/system.windows.media.animation.doubleanimation(v=VS.95).aspx

这时,就要如下实现了,

xaml部分:

 

<UserControl x:Class="SilverlightAnimation2.MainPage"

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"

    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"

    mc:Ignorable="d"

    d:DesignHeight="8600" d:DesignWidth="800">

 

    <Canvas x:Name="Carrier" Width="800" Height="600" Background="Silver" MouseLeftButtonDown="Carrier_MouseLeftButtonDown">

 

    </Canvas>

</UserControl>

cs部分:

using System;

using System.Collections.Generic;

using System.Linq;

using System.Net;

using System.Windows;

using System.Windows.Controls;

using System.Windows.Documents;

using System.Windows.Input;

using System.Windows.Media;

using System.Windows.Media.Animation;

using System.Windows.Shapes;

 

namespace SilverlightAnimation2

{

    public partial class MainPage : UserControl

    {

        Rectangle rect;

        public MainPage()

        {

            InitializeComponent();

 

            InitializeComponent();

 

            rect = new Rectangle();

 

            rect.Fill = new SolidColorBrush(Colors.Red);

 

            rect.Width = 50;

 

            rect.Height = 50;

 

            rect.RadiusX = 5;

 

            rect.RadiusY = 5;

 

            Carrier.Children.Add(rect);

 

            Canvas.SetLeft(rect, 0);

 

            Canvas.SetTop(rect, 0);

 

 

        }

 

        private void Carrier_MouseLeftButtonDown(object sender, MouseButtonEventArgs e)

        {

 

            //创建移动动画

 

            Point p = e.GetPosition(Carrier);

 

            Storyboard storyboard = new Storyboard();

 

            //创建X轴方向动画

 

            //DoubleAnimation doubleAnimation = new DoubleAnimation(){

 

            //  Canvas.GetLeft(rect),

 

            //  p.X,

 

            //  new Duration(TimeSpan.FromMilliseconds(500))

 

            //};

            DoubleAnimation doubleAnimation = new DoubleAnimation();

            doubleAnimation.From = Canvas.GetLeft(rect);

            doubleAnimation.To = p.X;

            doubleAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(500));

 

            Storyboard.SetTarget(doubleAnimation, rect);

 

            Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath("(Canvas.Left)"));

 

            storyboard.Children.Add(doubleAnimation);

 

            //创建Y轴方向动画

 

            //doubleAnimation = new DoubleAnimation(Canvas.GetTop(rect), p.Y, new Duration(TimeSpan.FromMilliseconds(500)));

            doubleAnimation = new DoubleAnimation();

            doubleAnimation.From = Canvas.GetTop(rect);

            doubleAnimation.To = p.Y;

            doubleAnimation.Duration = new Duration(TimeSpan.FromMilliseconds(500));

 

            Storyboard.SetTarget(doubleAnimation, rect);

 

            Storyboard.SetTargetProperty(doubleAnimation, new PropertyPath("(Canvas.Top)"));

 

            storyboard.Children.Add(doubleAnimation);

 

            //将动画动态加载进资源内

 

            if (!Resources.Contains("rectAnimation"))

            {

 

                Resources.Add("rectAnimation", storyboard);

 

            }

 

            //动画播放

 

            storyboard.Begin();

 

        }

 

 

    }

}