我目前正在开发一个程序,该程序使用相当复杂的嵌套winform控件结构,当用户进行某些选择时,这些控件会动态更改。有关控件的具体布局的详细信息,请参阅此问题。
在进行选择时,会对由用户控件控制的基础模型进行大量更新。然后,这导致所显示的控件的大小/位置/可见性的一系列相应变化。所有这些变化都会导致屏幕上控件的剧烈闪烁。我需要以某种方式修复此问题,以便每次用户进行选择时,屏幕基本上都会冻结,直到所有控件更新完成。
我试图在许多不同的地方和方式使用Control.SuspendLayout / Control.ResumeLayout方法,我无法消除疯狂的闪烁。我认为在更改期间暂停根控件上的布局可以解决问题,但看起来这个SuspendLayout在更改子控件时没有帮助。
我是否需要使用其他方法而不是SuspendLayout?有没有办法我可以调试SuspendLayout,看看为什么它似乎没有级联到所有的子控件?
Suspend / ResumeLayout不是你的问题。这只会暂停自动布局,即由Anchor和Dock属性触发的类型。双缓冲也无法解决您的问题,只能抑制每个控件中的闪烁。你真正的问题是你正在同时更新太多的控件,每个控件都会轮到自己画画,这需要时间。
你需要的是一种不同的双缓冲,合成。看看是否有解决方案 这个帖子 解决你的问题。
除了@ tommieb75的双缓冲建议之外,您还可以尝试查看您的根级控件是否具有 BeginUpdate/EndUpdate
方法对。这些应该有助于抑制呼叫之间的重绘。
如果您使用的是WinForms 2+,那么您只需设置“控制”即可。双缓冲'控制上的属性为真(在设计师中)。
使用框架2,设置DoubleBuffered设置3个标志:OptimizedDoubleBuffer,AllPaintingInWmPaint,以及我忘记的另一个,也就是'UserPaint'。
另外,请查看@yetapb提到的BeginUpdate / EndUpdate。
使用 SetControlStyles
在用户Control中,标志是 OptimizedDoubleBuffer
这将防止闪烁。