【问题标题】:Animating controls in C#C# 中的动画控件
【发布时间】:2013-06-08 09:43:55
【问题描述】:

当我将光标移到该控件上时,我试图将控件向右滑动,并在光标移出时向后滑动。

由于表单包含许多具有相同动画的控件,我决定让这些控件在不同的线程上滑动。问题是,当我创建一个线程并使用Control.Invoke() 更改控件的位置时,主 UI 会冻结,直到动画完成。

我做错了什么?或者有什么办法可以解决?

编辑:也使用了Control.BeginInvoke()。结果是一样的。

【问题讨论】:

  • 试过 beginInvoke() 吗?
  • 是的。两者都会冻结主 UI。
  • 您过于频繁地调用 Begin/Invoke(),导致 UI 线程充斥着调用请求。这使它停止绘画,这是一个低优先级的任务。使用工作线程会使它变慢,而不是更好。支持 Windows 中对动画的内置支持,请查看 this answer。

标签: c# multithreading thread-safety


【解决方案1】:

当您尝试移动控件的速度超过 UI 线程可以处理的速度时,就会发生这种情况。下面的库是一个很好的例子,说明了如何为所有动画使用 SINGLE 全局 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);

这会将c_control 控件在 250 毫秒内向右移动 100 个像素。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    相关资源
    最近更新 更多