当我将光标移到该控件上时,我试图将控件向右滑动,并在光标移出时向后滑动。
由于表单包含许多具有相同动画的控件,因此我决定让这些控件在不同的线程上滑动。问题是,当我创建一个线程并使用它Control.Invoke()
来更改控件的位置时,主 UI 会冻结,直到动画完成。
我究竟做错了什么?或者有什么办法可以解决吗?
编辑:也使用Control.BeginInvoke()
. 结果是一样的。
当我将光标移到该控件上时,我试图将控件向右滑动,并在光标移出时向后滑动。
由于表单包含许多具有相同动画的控件,因此我决定让这些控件在不同的线程上滑动。问题是,当我创建一个线程并使用它Control.Invoke()
来更改控件的位置时,主 UI 会冻结,直到动画完成。
我究竟做错了什么?或者有什么办法可以解决吗?
编辑:也使用Control.BeginInvoke()
. 结果是一样的。
当您尝试以比 UI 线程可以处理的速度更快的速度移动控件时,就会发生这种情况。下面的库是一个很好的例子,说明了如何为所有动画使用一个全局 FRAME-LIMITED 计时器来制作动画。
WinForm 动画库 [.Net3.5+]
一个简单的库,用于在 .Net WinForm(.Net 3.5 及更高版本)中为控件/值设置动画。基于关键帧(路径)且完全可定制。
https://falahati.github.io/WinFormAnimation/
new Animator2D(
new Path2D(c_control.Location.X, c_control.Location.Y, c_control.Location.X + 100, c_control.Location.Y, 250))
.Play(c_control, Animator2D.KnownProperties.Location);
这会在 250 毫秒内将c_control
控件向右移动 100 个像素。