如何解决嵌套的winform控件闪烁问题

我目前正在研究一个程序,该程序使用嵌套的winform控件的相当复杂的结构,它随着用户进行某些选择而动态变化。 有关控制的具体布局的更多细节将广泛用于此问题。

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

我试图在很多不同的地方和方法中使用Control.SuspendLayout / Control.ResumeLayout方法,并且我无法消除疯狂的闪烁。 我认为在更改过程中在根控件上挂起布局可以解决问题,但是看起来SuspendLayout在子控件更改时不起作用。

我是否需要使用其他方法而不是SuspendLayout? 有没有一种方法可以调试SuspendLayout以查看它为什么不会级联到所有子控件?


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

你需要的是一种不同的双缓冲合成。 看看这个线程中的解决方案是否解决了你的问题。


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


如果您使用的是WinForms 2+,那么您可以将控件上的'Control.DoubleBuffer'属性设置为true(甚至在设计器中)。

在框架2中,设置DoubleBuffered将设置3个标志:OptimizedDoubleBuffer,AllPaintingInWmPaint和另一个我忘记的'UserPaint'。

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

链接地址: http://www.djcxy.com/p/29177.html

上一篇: How to fix nested winform control flicker issues

下一篇: a strange problem a with simple binding