24

想象一下,您想为 WinForm 上的某个对象设置动画。您设置一个计时器来更新状态或模型,并覆盖 Form 的绘制事件。但是从那里开始,为动画不断重新绘制表单的最佳方法是什么?

  • 完成绘图后立即使表格无效?
  • 设置第二个计时器并定期使表单无效?
  • 也许这件事有一个共同的模式?
  • 是否有任何有用的 .NET 类可以提供帮助?

每次我需要这样做时,我都会发现一种具有新缺点的新方法。SO 社区的经验和建议是什么?

4

3 回答 3

52

我创建了一个可能对此有所帮助的库。它被称为过渡,可以在这里找到:https ://github.com/UweKeim/dot-net-transitions 。在 nuget 上作为dot-net-transitions 包提供

它使用在后台线程上运行的计时器来为对象设置动画。该库是开源的,所以如果它对您有用,您可以查看代码以了解它在做什么。

于 2009-07-20T21:10:10.663 回答
9

在某些情况下,不使用绘制事件进行绘制,而是从控件/表单获取 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++])); 
}

我自己在一些控件中使用它,并在感兴趣的对象移动或需要移除时缓冲图像以“清除”背景。

于 2008-08-14T17:39:43.307 回答
4

您正在做的是我在 WinForms 中使用过的唯一解决方案(一个不断重绘的计时器)。您可以使用许多技术来使用户体验更流畅(例如双缓冲)。

您可能想尝试一下 WPF。在 WPF 中有用于制作动画的内置工具,它们比基于计时器的解决方案更流畅(并且需要更少的代码并且不需要同步)。

请注意,对于该解决方案,您不需要在整个应用程序中使用 WPF;可以将此功能打包到 WPF 控件中,并将控件嵌入 WinForms 应用程序(或非托管应用程序,就此而言):

http://www.codeproject.com/KB/WPF/WPF_UserControls.aspx

于 2008-08-14T16:50:10.753 回答