想象一下,您想为 WinForm 上的某个对象设置动画。您设置一个计时器来更新状态或模型,并覆盖 Form 的绘制事件。但是从那里开始,为动画不断重新绘制表单的最佳方法是什么?
- 完成绘图后立即使表格无效?
- 设置第二个计时器并定期使表单无效?
- 也许这件事有一个共同的模式?
- 是否有任何有用的 .NET 类可以提供帮助?
每次我需要这样做时,我都会发现一种具有新缺点的新方法。SO 社区的经验和建议是什么?
我创建了一个可能对此有所帮助的库。它被称为过渡,可以在这里找到:https ://github.com/UweKeim/dot-net-transitions 。在 nuget 上作为dot-net-transitions 包提供
它使用在后台线程上运行的计时器来为对象设置动画。该库是开源的,所以如果它对您有用,您可以查看代码以了解它在做什么。
在某些情况下,不使用绘制事件进行绘制,而是从控件/表单获取 Graphics 对象并“在”其上绘制会更快、更方便。这可能会给不透明度/抗锯齿/文本等带来一些麻烦,但就不必重新绘制整个沙邦而言,这可能是值得的。类似于以下内容:
private void AnimationTimer_Tick(object sender, EventArgs args)
{
// First paint background, like Clear(Control.Background), or by
// painting an image you have previously buffered that was the background.
animationControl.CreateGraphics().DrawImage(0, 0, animationImages[animationTick++]));
}
我自己在一些控件中使用它,并在感兴趣的对象移动或需要移除时缓冲图像以“清除”背景。
您正在做的是我在 WinForms 中使用过的唯一解决方案(一个不断重绘的计时器)。您可以使用许多技术来使用户体验更流畅(例如双缓冲)。
您可能想尝试一下 WPF。在 WPF 中有用于制作动画的内置工具,它们比基于计时器的解决方案更流畅(并且需要更少的代码并且不需要同步)。
请注意,对于该解决方案,您不需要在整个应用程序中使用 WPF;可以将此功能打包到 WPF 控件中,并将控件嵌入 WinForms 应用程序(或非托管应用程序,就此而言):