为什么添加SuspendLayout和ResumeLayout会降低性能?
我需要向父控件添加很多控件。
但我发现如果在将这些控件添加到父级之前和之后添加ParentControl.SuspendLayout
和ParentControl.ResumeLayout
,我会使用秒表来测量滴答:如果我删除代码ParentControl.SuspendLayout
和ParentControl.ResumeLayout
,它会更快。 为什么会这样?
所以SuspendLayout
和ResumeLayout
不应该减少添加子控件的时间,对吗? 那么使用SuspendLayout
和ResumeLayout
什么好处,换句话说,如果我不使用SuspendLayout
和ResumeLayout
但是直接将子控件添加到父母,那有什么不好?
这是通常的原因,删除代码通常会使您的程序运行得更快。
Suspend / ResumeLayout()非常普遍被误解。 只有具有非默认AutoSize,Dock或Anchor属性的控件才会产生影响。 当控件具有相互影响的布局属性时,它可以防止布局事故。
如果您有一个包含数百个控件的表单,那么您根本不可能使用这些属性。 这样一个巨大的窗口不容易自动布局。 因此,您调用的方法实际上并没有做任何事情,它们需要时间来迭代布局,但没有任何好处。
您可能想要使用.ResumeLayout(false)。 调用mySubPanel.ResumeLayout()等于.ResumeLayout(true),这意味着它应该立即重新布局此控件(以及那时未挂起的所有子控件)。
MSDN引用:“如果有任何挂起的布局请求,调用ResumeLayout方法[不带参数]会强制立即布局。” [1]
如果您想在面板中添加100个控件,则需要使用如下方法:
- mainPanel.SuspendLayout()
- 创造儿童控制
- call child.SuspendLayout()
- 更改子控件属性
- 将子控件添加到mainPanel
- call child.ResumeLayout(false) – 这意味着:下一个布局运行,重新启动此控件,但不是立即
- 对每个儿童控制重复(2-6)
- 调用mainPanel.ResumeLayout(true) – 这意味着:重新启动我的mainPanel和每个子控件吧!
注意:没有SuspendLayout(),控件的每个属性更改都会调用布局例程 – 即使更改.BackColor也会使控件重新布局。