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

sps*_*pli 10 c# layout controls suspend winforms

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

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

所以SuspendLayout并且ResumeLayout不应该减少添加子控件的时间,对吗?那么,有什么好处使用SuspendLayoutResumeLayout或者换句话说,如果我不使用SuspendLayout,并ResumeLayout而是直接添加子控件的父母,有什么不好?

too*_*ong 14

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

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

如果您想在面板中添加100个控件,则需要使用如下方法:

  1. mainPanel.SuspendLayout()
  2. 创造儿童控制
  3. call child.SuspendLayout()
  4. 更改子控件属性
  5. 将子控件添加到mainPanel
  6. call child.ResumeLayout(false) - 这意味着:下一个布局运行,重新启动此控件,但不是立即
  7. 对每个儿童控制重复(2-6)
  8. call mainPanel.ResumeLayout(true) - 这意味着:重新启动我的mainPanel和每个子控件吧!

注意:如果没有SuspendLayout(),控件的每个属性更改都会调用布局例程 - 即使更改.BackColor也会使控件重新布局.

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

  • 如果我们通过(循环)大量控件进行迭代以进行属性更改,这尤其有用。对循环案例有很大的影响。谢谢! (2认同)

Han*_*ant 8

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

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

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