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

时间:2010-02-26 17:42:34

标签: c# winforms layout user-controls

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

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

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

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

4 个答案:

答案 0 :(得分:14)

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

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

答案 1 :(得分:2)

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

答案 2 :(得分:0)

使用用户控件中的SetControlStyles,标志为OptimizedDoubleBuffer,以防止闪烁。

答案 3 :(得分:0)

如果您使用的是WinForms 2+,则可以将控件上的“Control。DoubleBuffer”属性设置为true(在设计器中)。

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

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