如何实现无闪烁的C#自定义控件动画效果?

4
我正在创建一个自定义控件,需要在C#项目中处理动画。它基本上是一个列表框,包含一定数量的可移动元素。一个元素(另一个用户控件,具有背景图像和一些生成的标签)可以向上、向下移动或从列表中移除。
我想在容器自定义控件内部移动元素时创建动画效果,但是似乎我只能使用诸如以下行来移动控件:
myCustomControl.left -= m_iSpeed;

在计时器事件中触发的动画会出现闪烁和可怕的渲染问题,即使启用了双缓冲。

所以问题来了:如何实现一个无闪烁的动画C#控件? 我应该只使用面板的背景图像处理所有绘制而不创建自定义控件吗?还是有一种超级动画方法我没有发现? :)

谢谢!


你使用的GUI工具包是什么? - Serafina Brocious
他提到了C#,所以我认为我们可能在谈论.Net Windows Forms。我认为DoubleBuffering是答案,但我暂时想不起具体细节了。 - Jonathan Rupp
对的,我正在使用正则表达式 .net Windows 表单。 - Gad
4个回答

3

如果您想要无闪烁的动画效果,最好自己进行绘制(使用Paint事件处理程序中的Graphics对象),并使用双缓冲技术。在自定义控件中,您需要在构造函数中添加以下代码:

this.SetStyle(ControlStyles.UserPaint | ControlStyles.OptimizedDoubleBuffer | 
    ControlStyles.AllPaintingInWmPaint | ControlStyles.SupportsTransparentBackColor,
    true);


1
今天早上在这个问题上进行了类似的讨论。visual c# form update results in flickering.所以我会懒一点,给出我在那里给出的相同答案:
在开始移动之前,您可以尝试调用this.SuspendLayout();,并在移动所有控件完成后调用this.ResumeLayout(false);。通过这种方式,所有控件应该同时绘制,您应该会看到更少的闪烁。
顺便说一句,我已经在工作中尝试重现此问题,但似乎失败了。您能否提供更多的示例代码,让我修复一下?

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接