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


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

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

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

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


1080
2018-02-26 17:42


起源

这个答案对我有用 stackoverflow.com/questions/487661/... - wal


答案:


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

你需要的是一种不同的双缓冲,合成。看看是否有解决方案 这个帖子 解决你的问题。


14
2018-02-26 18:12



是的,一个额外的方式:)希望我在需要它时记住它。 - Andrew Backer
+1你节省了我的一天(即使它在深夜......) - karlipoppins
谢谢..节省了我的时间=) - Emo


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


2
2018-02-26 18:04



另一对需要注意的方法是 SuspendLayout() 和 ResumeLayout() 这将暂停/恢复控件的绘制 - STW


如果您使用的是WinForms 2+,那么您只需设置“控制”即可。双缓冲'控制上的属性为真(在设计师中)。

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

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


0
2018-02-26 18:09





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


0
2018-02-26 17:59