13

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

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

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

4

2 回答 2

18

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

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

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

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

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

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

于 2013-08-23T11:45:01.313 回答
10

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

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

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

于 2012-12-07T01:37:44.590 回答