【问题标题】:(C#) Does SuspendLayout cascade to child controls?(C#) SuspendLayout 是否级联到子控件?
【发布时间】:2010-12-10 17:19:06
【问题描述】:

C#:SuspendLayout 是否级联到子控件?

我是否必须自己迭代控件的子级才能在它们上调用suspendlayout? 和他们的孙子?大孙子??大孙子?

谢谢

【问题讨论】:

  • 赞成,因为这是一个非常可靠的问题。

标签: c# controls


【解决方案1】:

SuspendLayout 不会递归传播,但根据您的操作,仅暂停特定控件可能就足够了。

经验法则是:您将要对其布局进行多次处理的控件挂起。

例如:

  • 如果控件包含多个子控件,并且您打算添加一个,则无需暂停任何内容。
  • 如果您打算向父级添加多个子级,则应暂停父级。
  • 如果您打算更改一个孩子的Size 属性,则无需暂停任何内容。子项只会更改一次,而这反过来只会导致父项发生一次更改。
  • 如果您打算更改多个子级的Size,您应该只暂停父级。孩子们每个人只能调整一个大小,所以不需要暂停他们。但是这些孩子中的每一个都会导致父母重新布局,因此一旦您致电ResumeLayout,就暂停父母批量进行所有重新布局。
  • 如果您打算更改多个子级的SizeLocationBounds 属性,则应暂停父级和子级。它们都将触发多个布局事件。请确保仅在其所有子级恢复后才恢复父级。否则,每个子级的 ResumeLayouts 都会导致父级的重新布局,因此您一开始就不会从暂停它中获得任何好处。
  • 如果父母有多个孩子,但您只想更改父母的Size,则无需暂停任何内容。这将间接修改一堆孩子,但父母是做他们修改的人,所以它应该已经知道如何有效地处理它。例如,每次用户调整窗口大小时,它都会这样做。
  • 如果多个父级的布局相关属性发生更改,但没有子级的属性发生更改,则只有父级应暂停。推理与上一点相同,只是暂停了父级,因此它本身只产生一个布局事件。

【讨论】:

    【解决方案2】:

    是的; SuspendLayout 停止正在绘制的控件(或者更确切地说是正在处理的布局请求),默认情况下会沿子结构向下流动。

    换句话说:不再有“没有人”调用绘制例程了。

    【讨论】:

    • 我必须在这里反对你的说法:这只影响直接的子控件,而不是当你在层次结构中进一步添加控件时!支持我的反对意见的 MSDN 文章 - msdn.microsoft.com/en-us/magazine/cc163630.aspx 来自文章:“请记住,SuspendLayout 仅阻止对特定控件执行 Layout 事件。例如,如果将控件添加到面板,则必须调用 SuspendLayout 和 ResumeLayout面板而不是父表单。”
    • SuspendLayout 不是关于抑制绘制程序,而是关于Layout 事件。此事件由子级触发,而不是由父级触发。它会向上流动,而不是向下流动。
    猜你喜欢
    • 1970-01-01
    • 2012-10-12
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多