为什么添加SuspendLayout和ResumeLayout会降低性能?

时间:2012-10-29 13:54:21

标签: c# winforms layout controls suspend

我需要向父控件添加很多控件。

但我发现如果在将这些控件添加到父级之前和之后添加ParentControl.SuspendLayoutParentControl.ResumeLayout,我会使用秒表来测量刻度: 如果我删除代码ParentControl.SuspendLayoutParentControl.ResumeLayout,则会更快。为什么会这样?

所以SuspendLayoutResumeLayout不应该减少添加子控件的时间,对吧?那么使用SuspendLayoutResumeLayout有什么好处,换句话说,如果我不使用SuspendLayoutResumeLayout但是直接将子控件添加到父级,那么什么是坏?

2 个答案:

答案 0 :(得分:14)

您可能希望使用.ResumeLayout(false)。调用mySubPanel.ResumeLayout()等于.ResumeLayout(true),这意味着它应该立即重新布局此控件(以及那时未挂起的所有子控件)。

MSDN引用:“如果有任何挂起的布局请求,则调用ResumeLayout方法[不带参数]会强制立即布局。” [1]

如果你想在面板中添加100个控件,你想使用这样的方法:

  1. mainPanel.SuspendLayout()
  2. 创建子控件
  3. call child.SuspendLayout()
  4. 更改子控件属性
  5. 将子控件添加到mainPanel
  6. 调用child.ResumeLayout(false) - 这意味着:下一个布局运行,重新启动此控件,但不会立即执行
  7. 每个儿童控制重复(2-6)
  8. call mainPanel.ResumeLayout(true) - 这意味着:现在重新启动我的mainPanel和每个子控件!
  9. 注意:如果没有SuspendLayout(),控件的每个属性更改都会调用布局例程 - 即使更改.BackColor也会使控件重新布局。

    [1] http://msdn.microsoft.com/en-us/library/y53zat12.aspx

答案 1 :(得分:8)

这是通常的原因,删除代码通常会使程序运行得更快。

Suspend / ResumeLayout()非常普遍被误解。当您拥有具有非默认AutoSize,Dock或Anchor属性的控件时,它只会产生影响。当控件具有相互影响的布局属性时,它可以防止布局事故。

如果您的表单中包含数百个控件,则根本不可能使用这些属性。这样一个巨大的窗口不容易自动布局。因此,您调用的方法实际上并没有做任何事情,它们需要时间来迭代布局,但没有任何好处。