如何在 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);
}
在每一个刻度?
谢谢
非常接近。 但是没有必要在计时器中调用它。 让动画完成工作;这就是它的用途。 只需将动画设置为在所需速度的时间跨度内从起点到目的地。 如果需要提前结束动画,您可以随时中断动画。
其他人已经发布了最好的方法,即使用动画,所以这里有一种不同的方式,不太"好",但可能工作正常。
如果您使用的是索引器"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;
最后,你可以陶醉于你刚刚做的可怕事情,或者其他什么。切勿大量执行此操作。有些人会说永远不要这样做。但有时你必须完成工作,这是另一种方法。