我需要大量的控件添加到父控件。
但我发现,如果我添加ParentControl.SuspendLayout
和ParentControl.ResumeLayout
之前和之后我添加这些控件到父,我用秒表来测量刻度:如果我删除代码ParentControl.SuspendLayout
和ParentControl.ResumeLayout
,它会更快。 为什么会发生?
所以SuspendLayout
和ResumeLayout
不应该减少添加子控件的时间,对不对? 那么什么是使用效益SuspendLayout
和ResumeLayout
或者换句话说,如果我不使用SuspendLayout
和ResumeLayout
而是直接添加子控件的父母,有什么不好?
这是通常的原因,删除代码通常使程序运行得更快。
暂停/ ResumeLayout()是相当普遍误解。 它只会有,当你有一个具有非默认自动调整大小,码头或锚属性控制的影响。 它可以防止意外的布局时,控件具有相互影响的布局属性。
如果您有数百个控件的形式则是非常不可能的,你在所有使用这些属性。 这样一个庞大的窗口不会轻易借给自己自动布局。 所以,你拨打的实际上并不做任何事情的方法,他们需要时间来重复布局但没有任何好处。
你可能想使用.ResumeLayout(假)来代替。 调用mySubPanel.ResumeLayout()等于.ResumeLayout(真),这意味着它应该重新布局这一控制(以及一切儿童控制未在该点暂停)马上。
MSDN报价:“调用ResumeLayout方法[无参数]强制,如果有任何挂起的布局请求立即进行布局。” [1]
如果你喜欢添加100个控制面板,你想用这样的方法:
- mainPanel.SuspendLayout()
- 创建子控件
- 调用child.SuspendLayout()
- 改变孩子的控制特性
- 子控件添加到的mainPanel
- 调用child.ResumeLayout(假) - 这意味着:未来布局来看,重新布局这种控制,但不会立即
- 重复(2-6)为每个孩子控制
- 调用mainPanel.ResumeLayout(真) - 这意味着:重新布局我的mainPanel,现在每个孩子控制!
注:无SuspendLayout(),用于控制每个属性的更改将调用布局规 - 甚至改变.BackColor让您控制重新布局本身。
[1] http://msdn.microsoft.com/en-us/library/y53zat12.aspx