C# 防止多次调用油漆

C# 防止多次调用油漆,c#,winforms,drawing,C#,Winforms,Drawing,可能重复: 我有一个表单,它绘制了一组用户定义的控件(其中81个),每个控件包含另外10个控件(总共8100个)。这一切似乎都是按顺序绘制的(大约需要1秒钟) 我查看了问题,并遵循了ier建议(在窗体和自定义控件上设置this.DoubleBuffered=true,以及在窗体上设置SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint,true);,但这似乎没有任何作用 是否有一种方

可能重复:

我有一个表单,它绘制了一组用户定义的控件(其中81个),每个控件包含另外10个控件(总共8100个)。这一切似乎都是按顺序绘制的(大约需要1秒钟)

我查看了问题,并遵循了ier建议(在窗体和自定义控件上设置
this.DoubleBuffered=true
,以及在窗体上设置
SetStyle(ControlStyles.OptimizedDoubleBuffer | ControlStyles.AllPaintingInWmPaint,true);
,但这似乎没有任何作用

是否有一种方法可以保存窗体的paint函数,将其保存在委托中,交换虚拟函数以使窗体完全不被重绘,然后将实际函数放回并触发它

我假设有一种更标准的方法来实现这一点,但我找不到(它不是
SuspendLayout
/
resumellayout
那些只处理布局逻辑的方法)

我该怎么做呢?

答案是:()

但是想想看,如果你阻止了
Paint
的发生,当用户与你的UI控件交互时,你的UI控件应该如何更新?不会有按钮闪烁、文本框光标闪烁等等

如果你同意的话,那为什么不把用户控件的容器作为背景图像呢?。

答案是:()

但是想想看,如果你阻止了
Paint
的发生,当用户与你的UI控件交互时,你的UI控件应该如何更新?不会有按钮闪烁、文本框光标闪烁等等


如果你同意的话,那你为什么不把用户控件的容器作为它的背景图像呢?

@HansPassant这与此无关。它画得很完美,只是很慢。此外,它并没有试图暂停表单的绘制。我是。这两个问题有什么关系?请帮我复制/粘贴代码进入表单,需要30秒。@HansPassant现在正在渲染大型黑色方块,然后一次填充所有方块(仍然需要大约一秒)。这是否意味着从本质上说,创建所有这些控件都需要这么多时间?我如何衡量这一点?@HansPassant这与此无关。它绘制得非常完美,只是速度很慢。此外,它并不是试图暂停表单的绘制。我是。这两个问题有何关联?请帮个忙,将代码复制/粘贴到您的身上r形式,需要30秒。@HansPassant它现在正在绘制大的黑色方块,然后一次填充它们(仍然需要大约一秒钟)。这是否意味着从本质上说创建所有这些控件需要这么多时间?我如何衡量这一点?