[英]Difference between ISupportInitialize (BeginInit/EndInit) and SuspendLayout/ResumeLayout
[英]Difference between SuspendLayout and BeginUpdate
我没有找到一个很好的解释,实际上两个方法Control.SuspendLayout
和BeginUpdate
(通常见于列表控件,如ListView
, ComboBox
, ListBox
等)之间的潜在差异,除了它们都提高了性能。
据我所知:
他们都暂停绘图,直到所有要显示的项目都被加载,然后重新绘制。
通常在将控件添加到Panel
, GroupBox
等容器控件时调用SuspendLayout
,而BeginUpdate
用于向列表控件(如ListBox
添加对象等非控件项。
但是,当他们这样做时,为什么会有两个电话? 或者他们有什么不同的做法?
类似地,还有ResumeLayout
和EndUpdate
等价物。
他们没有任何共同之处。 SuspendLayout关闭自动布局,这是由TableLayoutPanel和FlowLayoutPanel等控件使用的类型,以及从Dock,Anchor和AutoSize属性获得的布局更新。 它对ListView,ComboBox或ListBox完全没有影响,这些控件不执行布局。 通常只有在批量添加控件到容器时才使用它。 有时,当自动布局使窗口的大小变得太令人讨厌时,您会使用它。 它确实减少了重绘的次数,完全是因为它暂停了控件大小的更新。
BeginUpdate停止控件重绘自身。 你这样做 ,当你大量新增项目,对他们不能使用他们的Items.AddRange()方法,因为某些原因使用它就像ListView控件或列表框控件。
正如您所指出的那样, BeginUpdate
是列表控件的一部分,在您添加项目时使用。
SuspendLayout
类似,但它来自Control
类。 当您进行自定义绘制时,它非常有用。
实际上,不同之处在于控件中的控件与绘图项之间的对比。 如果设置与绘图相关的属性 - 请使用SuspendLayout
。 在添加项目的过程中,使用BeginUpdate
更新
机制有点不同。 在项目添加/删除期间, BeginUpdate
抑制绘制事件。 如果您曾尝试调试paint
事件,您可能会发现它触发了很多。
SuspendLayout
在移动,调整大小等过程中禁止布局计算。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.