如何解决嵌套Winform控件闪烁问题 [英] How to fix nested winform control flicker issues

查看:363
本文介绍了如何解决嵌套Winform控件闪烁问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前正在开发一个程序,该程序使用嵌套的winform控件的相当复杂的结构,该结构会随着用户做出某些选择而动态变化.要详细了解控件的特定布局,可能会涉及到这个问题.

I am currently working on a program that uses a fairly complex structure of nested winform controls which changes dynamically as a user makes certain selections. To go into more detail about the specific layout of the controls would be to extensive for this question.

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

When ever a selection is made, a lot of updates are made to the underlying model which is controlled by the user controls. This then results in series of corresponding changes in the size/position/visibility of the displayed controls. All of these changes results in a painfully intense flickering of controls on the screen. I need to somehow fix this so that everytime the user makes a selection the screen is basically frozen until all of the control updates have completed.

我试图在许多不同的地方和方式中使用Control.SuspendLayout/Control.ResumeLayout方法,但我无法消除疯狂的闪烁.我以为在更改过程中在根控件上挂起布局可以解决此问题,但是当更改子控件时,此SuspendLayout似乎无济于事.

I have attempted to use the Control.SuspendLayout/Control.ResumeLayout methods in many different places and ways and I can not eliminate the crazy flickering. I thought that suspending layout on the root control during the changes would fix the problem but it appears that this SuspendLayout doesn't help when child controls are changed.

除了SuspendLayout之外,我还需要使用其他方法吗?有什么方法可以调试SuspendLayout,以查看为什么它似乎没有级联到所有子控件?

Do I need to use some other approach rather than SuspendLayout? Is there a way I can debug SuspendLayout to see why it doesn't appear to be cascading to all of the child controls?

推荐答案

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

Suspend/ResumeLayout isn't your problem here. That only suspends automatic layout, the kind that is triggered by the Anchor and Dock properties. Double-buffering can't fix your problem either, that only suppresses flicker in each individual control. Your real problem is that you are updating too many controls at the same time, each will take its turn to paint itself and that takes time.

您需要的是另一种双重缓冲,合成.在此线程解决了您的问题.

What you need is a different kind of double-buffering, compositing. Check out if the solution in this thread solves your problem.

这篇关于如何解决嵌套Winform控件闪烁问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆