C# 在c中完成双动画后如何正确控制平移变换位置#

C# 在c中完成双动画后如何正确控制平移变换位置#,c#,wpf,animation,C#,Wpf,Animation,我在画布的中间有一个椭圆,使用以下代码: var FixedCircle = new Ellipse { Width = 25, Height = 25, Stroke = color, Fill = color, StrokeThickness = 3 }; var centerX = ActualWidth / 2; var centerY = ActualHeight / 2; FixedCircle.Margin = new Thickness(c

我在画布的中间有一个椭圆,使用以下代码:

var FixedCircle = new Ellipse
{
    Width = 25,
    Height = 25,
    Stroke = color,
    Fill = color,
    StrokeThickness = 3
};
var centerX = ActualWidth / 2;
var centerY = ActualHeight / 2;
FixedCircle.Margin = new Thickness(centerX, centerY, 1, 1);
Children.Add(FixedCircle);
InvalidateVisual();
我想为椭圆设置动画,使其从左往回移动到中心(中间点)

我正在设置坐标
(centerX,centerY)
(0,centerY)
作为起点和终点,并且我正在使用直线

Point oldPoint = FixedCircle.TransformToAncestor(this).Transform(new Point(centerX,centerY));
Point newPoint = FixedCircle.TransformToAncestor(this).Transform(new Point(0,centerY));
为了表明转换必须设置为起始点G,我尝试删除它,但移动变得更糟,从botton开始,或者坐标
(0,0)
被视为中间,而不是
(实际宽度/2,实际高度/2)
,这是我不想要的

TranslateTransform trans = new TranslateTransform();
FixedCircle.RenderTransform = trans;
Point oldPoint = FixedCircle.TransformToAncestor(this).Transform(new Point(centerX,centerY));
Point newPoint = FixedCircle.TransformToAncestor(this).Transform(new Point(0,centerY));
var EndX = FixedCircle.Width / 2 + newPoint.X - oldPoint.X - (FixedCircle.Width);
var EndY = FixedCircle.Height / 2 + newPoint.Y - oldPoint.Y - (FixedCircle.Height);
var a1X = new DoubleAnimation(0, EndX, TimeSpan.FromSeconds(3));

a1X.Completed += (s, e) =>
{
    oldPoint = FixedCircle.TransformToAncestor(this).Transform(new Point(0, centerY));
    newPoint = FixedCircle.TransformToAncestor(this).Transform(new Point(centerX, centerY));
    EndX = FixedCircle.Width / 2 + newPoint.X - oldPoint.X - (FixedCircle.Width);
    EndY = FixedCircle.Height / 2 + newPoint.Y - oldPoint.Y - (FixedCircle.Height);
    var a2X = new DoubleAnimation(0, EndX, TimeSpan.FromSeconds(3));
    trans.BeginAnimation(TranslateTransform.XProperty, a2X);
};
trans.BeginAnimation(TranslateTransform.XProperty, a1X);
我得到的效果是椭圆正确地从中间向左移动

那么,我的<强>问题< /强>,<强>从中间开始,到右边,当我需要椭圆从“强>左到中间,不是中到右< /强>:


我缺少什么?

下面的代码从中间到左边和后面重复运行动画。它使用带有椭圆等高线的路径,因为该路径居中(而不是像椭圆一样上/左对齐)。它也不绘制笔划,只是将笔划厚度添加到椭圆的半径中

var transform = new TranslateTransform(canvas.ActualWidth / 2, canvas.ActualHeight / 2);

var radius = 14;

var circle = new Path
{
    Data = new EllipseGeometry(new Point(), radius, radius),
    Fill = Brushes.White,
    RenderTransform = transform
};

canvas.Children.Add(circle);

var animation = new DoubleAnimation
{
    To = radius,
    Duration = TimeSpan.FromSeconds(3),
    AutoReverse = true,
    RepeatBehavior = RepeatBehavior.Forever
};

transform.BeginAnimation(TranslateTransform.XProperty, animation);
对于从中心点开始的从右到左和从后的重复动画,请使用负起始时间:

var transform = new TranslateTransform(
    canvas.ActualWidth - radius, canvas.ActualHeight / 2);

var animation = new DoubleAnimation
{
    To = radius,
    Duration = TimeSpan.FromSeconds(6),
    AutoReverse = true,
    RepeatBehavior = RepeatBehavior.Forever,
    BeginTime = TimeSpan.FromSeconds(-3)
};

如果不通读所有代码,有一点是清楚的。不应设置椭圆的边距。要么为Canvas.Left和Canvas.Top属性设置动画,并从适当的初始值开始,要么为TranslateTransform设置动画,并使用适当的初始RenderTransform。Elipse应该如何移动?它是一个连续的动画,或者应该被多次触发,从当前位置移动到新的位置?想要成为一个连续的动画,从中间到左边,然后从左边到中间等等,所以,我删除了设置边距代码,我如何初始化屏幕中心的椭圆,制作动画的过程是什么?to=radius,在做什么?但是,我不知道你怎么告诉我向左走,我的意思是,我得到了自动翻转部分,但是你怎么能改变你的代码使椭圆向右移动,例如,它是圆中心X值的最左边的值。否则if将在左边框处消失一半。向右移动
to=canvas.ActualWidth-radius
您可能还希望为动画添加一个测量功能,以实现变速移动。