如何使用动画移动WPF形状

时间:2015-03-01 02:13:10

标签: c# wpf animation

我想使用动画移动形状,目前正在使用以下代码。然而,这不会导致对象实际移动,它似乎只是改变了对象渲染的位置,这是预期的,因为我们正在设置crossHair.RenterTransform。

编辑: 澄清 - 我正在使用动画来模拟输入文件指令包含的内容,因此我认为在解析输入文件时我只能在代码中构建动画。我可能错了,但看不出如何在XAML中做到这一点。输入文件格式不在XAML中。

因为输入文件中包含许多连续移动,所以当前使用形状当前位置作为下一个动画的起点,但是这不起作用,因为看起来动画实际上并没有移动形状。

作为一种解决方法,我现在正在改变动画完成处理程序中的形状实际位置。这似乎有效。

所以问题仍然是我如何使用相同的变换来实际移动形状而不是简单地将其渲染到不同的位置?

private Storyboard MoveCrossHairToPoint(double x, double y)
        {
            // Adjust for crosshair size so its centered on the x
            double xPos = x;
            double yPos = y;

            double xStart = Canvas.GetLeft(crossHair)+crossHair.Width/2;
            double yStart = Canvas.GetTop(crossHair)+crossHair.Height/2;

            // Create a NameScope for the page so that 
            // we can use Storyboards.
            NameScope.SetNameScope(this, new NameScope());

            // Create a MatrixTransform. This transform 
            // will be used to move the crossHair.
            MatrixTransform crossHairMatrixTransform = new MatrixTransform();
            crossHair.RenderTransform = crossHairMatrixTransform;


            // Register the transform's name with the page 
            // so that it can be targeted by a Storyboard. 
            this.RegisterName("MoveCrossHairMatrixTransform", crossHairMatrixTransform);

            // Create the animation path.
            PathGeometry animationPath = new PathGeometry();
            PathFigure pFigure = new PathFigure();
            pFigure.StartPoint = new Point(xStart, yStart);
            LineSegment lineSegment = new LineSegment(new Point(x, y),true);


            pFigure.Segments.Add(lineSegment);
            animationPath.Figures.Add(pFigure);

            // Create a path to follow
            Path path = new Path();
            path.Data = animationPath;
            path.Stroke = System.Windows.Media.Brushes.Green;

            this.bedCanvas.Children.Add(path);

            // Freeze the PathGeometry for performance benefits.
            animationPath.Freeze();

            // Create a MatrixAnimationUsingPath to move the 
            // button along the path by animating 
            // its MatrixTransform.
            MatrixAnimationUsingPath matrixAnimation =
                new MatrixAnimationUsingPath();
            matrixAnimation.PathGeometry = animationPath;

            double time = GetTimeForVelocityOverPath(animationPath, this.velocityMove);

            matrixAnimation.Duration = TimeSpan.FromSeconds(time);
            //matrixAnimation.RepeatBehavior = RepeatBehavior.;

            // Set the animation's DoesRotateWithTangent property 
            // to true so that rotates the rectangle in addition 
            // to moving it.
            matrixAnimation.DoesRotateWithTangent = false;           

            // Set the animation to target the Matrix property 
            // of the MatrixTransform named "ButtonMatrixTransform".
            Storyboard.SetTargetName(matrixAnimation, "MoveCrossHairMatrixTransform");
            Storyboard.SetTargetProperty(matrixAnimation,
                new PropertyPath(MatrixTransform.MatrixProperty));

            // Create a Storyboard to contain and apply the animation.
            Storyboard pathAnimationStoryboard = new Storyboard();
            pathAnimationStoryboard.Children.Add(matrixAnimation);

            return pathAnimationStoryboard;

        }

0 个答案:

没有答案