如何在 WPF 中移动控件

本文关键字:移动控件 WPF | 更新日期: 2023-09-27 18:36:47

我在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);
}

在每一个刻度?

谢谢

如何在 WPF 中移动控件

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

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

如果您使用的是索引器"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;

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