1

我在 WPF 中有一个控件(这是一个包含圆圈的自定义控件)。

我需要每 60 毫秒移动一次。

我有一个“位置”数组(具有 2 个属性的类:X 和 Y),我这样做是为了移动它:

timer_tick()
{
  myControl.Margin = new Thickness { Left = MyArray[i].X, Top = MyArray[i].Y};
  i++;
}

带有一个全局变量。

但我能以更好的方式做到这一点吗?使用类似的东西:

public static void MoveTo(this Image target, double newX, double newY)
{
    var top = Canvas.GetTop(target);
    var left = Canvas.GetLeft(target);
    TranslateTransform trans = new TranslateTransform();
    target.RenderTransform = trans;
    DoubleAnimation anim1 = new DoubleAnimation(top, newY - top, TimeSpan.FromMilliseconds(60));
    DoubleAnimation anim2 = new DoubleAnimation(left, newX - left, TimeSpan.FromMilliseconds(60));
    trans.BeginAnimation(TranslateTransform.XProperty,anim1);
    trans.BeginAnimation(TranslateTransform.YProperty,anim2);
}

在每个滴答声中?

谢谢

4

2 回答 2

3

很接近。但是没有必要在计时器中调用它。让动画完成工作;这就是它的用途。只需将动画设置为在所需速度的时间跨度内从起点到终点。如果您需要提前结束动画,您可以随时中断动画。

于 2013-10-23T18:58:05.613 回答
0

其他人已经发布了最好的方法,即使用动画,所以这是一种不太“好”但可能工作正常的不同方法。

如果您使用的是索引器“i”之类的变量(注意将其称为全局变量——具体说明其范围),那么为什么不制作另一个变量呢?

在类级别,创建一个变量...

Thickness awful_marg_variable;

在您的初始化程序中,对其进行初始化并将引用分配给控件的 Margin:

awful_marg_variable = new Thickness { Left = MyArray[0].X, Top = MyArray[0].Y};
myControl.Margin = awful_marg_variable;

然后在你的计时器滴答过程中,你可以操纵那个变量......

awful_marg_variable.Left = MyArray[i].X;
awful_marg_variable.Top = MyArray[i].Y;

最后,你可以陶醉于你刚刚做过的可怕的事情,或者其他什么。切勿大量这样做。有些人会说永远不要这样做。但有时你只需要完成工作,这是另一种方法。

于 2013-10-23T19:19:59.443 回答