Animate Canvas.Left属性

时间:2010-11-22 15:11:30

标签: silverlight animation

我正在尝试为画布中的图像的左侧属性设置动画。

当我在做的时候:

image.SetValue(Canvas.LeftProperty, destX[i]);
这是有效的。 但是当我在做的时候:

Animate(image, lastValue, destX[i], 500);

    private void Animate(Image image, double val1, double val2, double miliseconds)
    {
        DoubleAnimation myDoubleAnimation = new DoubleAnimation { From = val1, To = val2, Duration = new Duration(TimeSpan.FromMilliseconds(miliseconds)) };

        TranslateTransform ts = new TranslateTransform();
        image.RenderTransform = ts;
        Storyboard.SetTarget(myDoubleAnimation, ts);

        Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath(TranslateTransform.XProperty));
        Storyboard myMovementStoryboard = new Storyboard();
        myMovementStoryboard.Children.Add(myDoubleAnimation);
        myMovementStoryboard.Begin();
        myMovementStoryboard.Completed += (s, e) =>
            {
                image.SetValue(Canvas.LeftProperty, val2);
            };
    }

它不能正常工作

我的Animate功能有什么问题? 即使动画可能做得不好,完成的事件也应该将好的值重置为canvas.leftproperty。

但就我而言,出了点问题。

你将如何完成Animate功能?

提前感谢您提供任何帮助

2 个答案:

答案 0 :(得分:6)

我是这样做的,而且效果很好。

    DoubleAnimation myDoubleAnimation = new DoubleAnimation { From = val1, To = val2, Duration = new Duration(TimeSpan.FromMilliseconds(miliseconds)) };

    //set the target of the animation
    Storyboard.SetTarget(myDoubleAnimation, Image);
    //set the target property of the animation. Don't forget the ( ) around canvas.left
    Storyboard.SetTargetProperty(myDoubleAnimation, new PropertyPath("(Canvas.Left)"));
    //create the storyboard
    Storyboard myMovementStoryboard = new Storyboard();
    //add the animation to the storyboard
    myMovementStoryboard.Children.Add(myDoubleAnimation);
    //begin animation
    myMovementStoryboard.Begin();

答案 1 :(得分:0)

您正在设置Canvas.LeftProperty,但您正在为TranslateTransform.XProperty设置动画。这些是非常不同的属性,因为在布局传递之后应用了translate转换。因此,使用Canvas.Left在Canvas中布置对象,但是TranslateTransform会使其从原始原点移动。你应该做的是将TranslateTransform.XProperty设置回val2。

myMovementStoryboard.Completed += (s, e) =>
            {
                ts.X = val2;
            };

也就是说,动画不应该在中间失败,所以这个额外的保护措施不是必需的。