双面板缓冲

Ale*_*rov 4 c# system.drawing panel winforms double-buffering

可以通过将"AllPaintingInWmPaint","UserPaint"和"DoubleBuffer"ControlStyles的值设置为"true"(this.SetStyle(ControlStyles.AllPaintingInWmPaint | ControlStyles.UserPaint | ControlStyles.DoubleBuffer, true))来完成对整个表单的双缓冲.

但是System.Windows.Forms.Panel不会发生这种情况,因为该类不允许我这样做.我找到了一个解决方案:http://bytes.com/topic/c-sharp/answers/267635-double-buffering-panel-control.我也试过这个:Winforms Double Buffering.它是滞后的,即使它用在一个小图纸上,我有一些我在表格中使用的自定义资源和其他东西,因为我不会把整个表格变成一张图纸.第二个似乎会引起问题.还有其他方法吗?

我问这个是因为我不希望在调整表单大小时,面板上的绘图一直闪烁.如果有办法在没有双缓冲的情况下摆脱闪烁,我会很高兴知道.

Han*_*ant 9

如果您不需要滚动支持,请使用PictureBox,默认情况下它是双缓冲的.获得双缓冲可滚动面板非常简单:

using System;
using System.Windows.Forms;

class MyPanel : Panel {
    public MyPanel() {
        this.DoubleBuffered = true;
        this.ResizeRedraw = true;
    }
}
Run Code Online (Sandbox Code Playgroud)

ResizeRedraw分配禁止容器控件的绘制优化.如果你在面板上做任何绘画,你将需要这个.没有它,当您调整面板大小时,绘画会变脏.

双缓冲实际上使绘画变慢.这可能会对以后绘制的控件产生影响.他们在被填充之前留下的洞可能会被看到一段时间,也被认为是闪烁.你会在这个答案中找到反对效果的反措施.