2011-02-14 34 views
8

He escrito un control de usuario que se comporta como un ContainerControl, pero es totalmente pintada por WindowsForms (I heredan de UserControl)BeginUpdate() EndUpdate para un control de usuario

me gustaría evitar pintar el mientras que el control Lo estoy llenando, así que necesitaría escribir algo similar al BeginUpdate() - EndUpdate().

Esto es fácil de hacer cuando el control está pintado por el usuario, pero en este caso no estoy seguro de cómo proceder.

Respuesta

11

Puede utilizar el diseño Suspender/Reanudar. p.ej.

private void BeginUpdate() 
{ 
    this.SuspendLayout(); 
    // Do paint events 
    EndUpdate(); 
} 

private void EndUpdate() 
{ 
    this.ResumeLayout(); 
    // Raise an event if needed. 
} 

Si usted está interesado en la suspensión de la pintura de un control y de los niños, echa un vistazo a esta cuestión de forma: Suspend Control and Children Painting

+4

Por lo que tengo entendido, SuspendLayout no necesariamente detiene el control de la pintura. Es principalmente útil en contenedores como el FlowLayoutPanel, que realiza operaciones de diseño en sus elementos secundarios. Se usaría para evitar realizar operaciones de diseño cada vez que agregue un control al panel, por ejemplo, en un bucle. Podría estar equivocado, pero me gustaría algo más de información si tienes alguno. – Craigt

1

Se podría reemplazar el método OnPaint y sólo pasar el control de nuevo a la base.OnPaint() cuando se cumple una cierta condición.

private bool _doPaint = true; 
    protected override void OnPaint(PaintEventArgs e) 
    { 
     if(_doPaint) 
      base.OnPaint(e); 
    } 

Entonces manejar estableciendo la variable de _doPaint en el valor adecuado con los métodos públicos o una propiedad.

Es posible que tenga que anular OnPaintBackground() de manera similar, según sus necesidades.

+0

Elegí este método. Como mi control está destinado a que otros desarrolladores lo usen, también agregué un temporizador de seguridad que vuelve a habilitar '_doPaint' 1500ms más adelante en caso de que su código no lo vuelva a encender correctamente. – QuickDanger

Cuestiones relacionadas