c# winforms layout controls suspend

c# - ¿Por qué agregar SuspendLayout y ResumeLayout reduce el rendimiento?



winforms controls (2)

Esto es por la razón habitual, la eliminación de código generalmente hace que su programa se ejecute más rápido.

Suspend / ResumeLayout () es bastante universalmente mal entendido. Solo tendrá un efecto cuando tenga controles que tengan una propiedad AutoSize, Dock o Anchor no predeterminada. Evita los accidentes de disposición cuando los controles tienen propiedades de diseño que se afectan entre sí.

Si tiene un formulario con cientos de controles, entonces es muy poco probable que use estas propiedades. Una ventana tan masiva no se presta fácilmente al diseño automático. Así que estás llamando a métodos que en realidad no hacen nada, se toman el tiempo de iterar el diseño pero sin ningún beneficio.

Necesito agregar muchos controles a un control principal.

Pero me parece que si agrego ParentControl.SuspendLayout y ParentControl.ResumeLayout antes y después de agregar esos controles al padre, utilizo el cronómetro para medir los tics: si ParentControl.SuspendLayout el código ParentControl.SuspendLayout y ParentControl.ResumeLayout , será más rápido. ¿Por que sucede?

Entonces, se SuspendLayout que SuspendLayout y ResumeLayout reducen el tiempo para agregar controles secundarios, ¿verdad? Entonces, ¿cuál es el beneficio de utilizar SuspendLayout y ResumeLayout o, en otras palabras, si no uso SuspendLayout y ResumeLayout pero agrego los subcontroles directamente a los padres, ¿cuál es el problema?


Probablemente desee utilizar .ResumeLayout (falso) en su lugar. Llamar a mySubPanel.ResumeLayout () es igual a .ResumeLayout (true), lo que significa que debe volver a diseñar este control (y todo el control secundario que no se suspende en ese punto) inmediatamente.

Cita de MSDN: "Llamar al método ResumeLayout [sin parámetros] obliga a un diseño inmediato si hay solicitudes de diseño pendientes". [1]

Si quiere agregar 100 controles a un panel, quiere usar un enfoque como este:

  1. mainPanel.SuspendLayout ()
  2. crear control infantil
  3. llamar a child.SuspendLayout ()
  4. cambiar las propiedades de control secundario
  5. agregue el control secundario al panel principal
  6. call child.ResumeLayout (false) - esto significa: la próxima ejecución del diseño, retransmite este control, pero no de inmediato
  7. repita (2-6) para cada control infantil
  8. llame a mainPanel.ResumeLayout (true) - esto significa: relayout mi mainPanel y cada control de niños ahora!

Nota: sin SuspendLayout (), cada cambio de propiedad para un control invocaría la rutina de diseño; incluso cambiar el .BackColor hace que el control se redistribuya por sí mismo.

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