【问题标题】:Simple animation in WinFormsWinForms 中的简单动画
【发布时间】:2021-07-06 09:13:13
【问题描述】:

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

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

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

【问题讨论】:

    标签: .net winforms animation


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          猜你喜欢
          • 2014-02-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多