如何修复嵌套的winform控件闪烁问题

我目前正在开发一个程序,该程序使用相当复杂的嵌套winform控件结构,当用户进行某些选择时,这些控件会动态更改。 有关控件的具体布局的详细信息,请参阅此问题。

在进行选择时,会对由用户控件控制的基础模型进行大量更新。 然后,这导致所显示的控件的大小/位置/可见性的一系列相应变化。 所有这些变化都会导致屏幕上控件的剧烈闪烁。 我需要以某种方式修复此问题,以便每次用户进行选择时,屏幕基本上都会冻结,直到所有控件更新完成。

我试图在许多不同的地方和方式使用Control.SuspendLayout / Control.ResumeLayout方法,我无法消除疯狂的闪烁。 我认为在更改期间暂停根控件上的布局可以解决问题,但看起来这个SuspendLayout在更改子控件时没有帮助。

我是否需要使用其他方法而不是SuspendLayout? 有没有办法我可以调试SuspendLayout,看看为什么它似乎没有级联到所有的子控件?

Suspend / ResumeLayout不是你的问题。 这只会暂停自动布局,即由Anchor和Dock属性触发的类型。 双缓冲也无法解决您的问题,只能抑制每个控件中的闪烁。 你真正的问题是你正在同时更新太多的控件,每个控件都会轮到自己画画,这需要时间。

你需要的是一种不同的双缓冲,合成。 检查此线程中的解决方案是否解决了您的问题。

除了@ tommieb75的双缓冲建议之外,您还可以尝试查看您的根级别控件是否具有BeginUpdate/EndUpdate方法对。 这些应该有助于抑制呼叫之间的重绘。

如果您使用的是WinForms 2+,那么您只需设置“控制”即可。 控件上的DoubleBuffer ‘属性为true(甚至在设计器中)。

使用框架2,设置DoubleBuffered设置3个标志:OptimizedDoubleBuffer,AllPaintingInWmPaint,以及我忘记的另一个,也就是’UserPaint’。

另外,请查看@yetapb提到的BeginUpdate / EndUpdate。

使用用户Control中的SetControlStyles ,标志是OptimizedDoubleBuffer ,它将防止闪烁。