【问题标题】:Difference between SuspendLayout and BeginUpdateSuspendLayout 和 BeginUpdate 的区别
【发布时间】:2014-03-04 08:35:03
【问题描述】:

我没有很好地解释Control.SuspendLayoutBeginUpdate 两种方法之间的根本区别(通常在ListViewComboBoxListBox 等列表控件上看到),其他而不是它们都提高了性能。

据我了解:

  1. 他们都暂停绘制,直到所有要显示的项目都加载完毕,然后重新绘制。

  2. 通常SuspendLayout 会在将控件添加到PanelGroupBox 等容器控件时调用,而BeginUpdate 用于将对象等非控件项添加到ListBox 等列表控件中.

但是为什么在他们做同样的事情时会有两个调用呢?或者他们有什么不同?

同样有 ResumeLayoutEndUpdate 等价物。

【问题讨论】:

    标签: .net winforms performance drawing controls


    【解决方案1】:

    他们没有共同点。 SuspendLayout 关闭自动布局,TableLayoutPanel 和 FlowLayoutPanel 等控件以及从 Dock、Anchor 和 AutoSize 属性获得的布局更新所使用的那种。它对 ListView、ComboBox 或 ListBox 完全没有影响,这些控件不执行布局。通常仅在将控件批量添加到容器时才使用它。有时,当自动布局使调整窗口大小过于讨厌时,您会使用它。它确实减少了重绘的次数,仅仅是因为它暂停了控件大小的更新。

    BeginUpdate 阻止控件重新绘制自身。当您向 ListView 或 ListBox 等控件批量添加项目并且由于某种原因无法使用它们的 Items.AddRange() 方法时,您确实使用它。

    【讨论】:

    • 嗯,这引出了一个问题,为什么在非容器控件(如不执行布局操作的列表框和按钮)上存在 SuspendLayout。我猜它是一个虚拟方法,它没有在 ListBox 等子类中被覆盖或实现,并且什么也不做。
    【解决方案2】:

    正如您所指出的,BeginUpdate 是列表控件的一部分,在您添加项目时使用。

    SuspendLayout 类似,但它来自 Control 类。当您进行自定义绘图时,它非常有用。

    实际上,区别在于绘制控件与控件中的绘制项。如果您设置绘图相关的属性 - 使用SuspendLayout。在添加项目的过程中,使用BeginUpdate

    更新

    机制有点不同。 BeginUpdate 在项目添加/删除期间抑制绘制事件。如果您尝试调试 paint 事件,您可能会看到它经常触发。

    SuspendLayout 在移动、调整大小等期间抑制布局计算。

    【讨论】:

    • 是的,我明白了。我的问题是为什么在绘制新控件与更新现有控件的布局之间会有区别。
    猜你喜欢
    • 2010-10-27
    • 2021-11-24
    • 1970-01-01
    • 1970-01-01
    • 2011-06-27
    • 1970-01-01
    • 2013-08-07
    • 2011-10-20
    • 2020-01-23
    相关资源
    最近更新 更多