“深蓝色的右手”在他的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>
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();
}
}
}