2010-04-05 7 views
9

Estoy escribiendo un UserControl. Quiero dibujar el control del usuario cuando el cambio de tamaño está hecho. No puedo encontrar ningún evento equivalente a "ResizeEnd" de un formulario de Windows."ResizeEnd" equivalente para controles de usuario

¿Hay algún evento equivalente para los controles del usuario?

Tenga en cuenta que en este caso el control principal del control de usuario es en sí mismo un UserControl, por lo que no puedo convertirlo (control de usuario principal) en un formulario. Como estoy usando un marco, no puedo acceder al formulario en el que se mostrará este control de usuario.

+0

¿Has resuelto tu problema? Si la respuesta es sí, ¿cómo? Tengo el mismo problema y he publicado una posible solución [aquí] (http://stackoverflow.com/questions/7584307/user-control-resize) – Marco

Respuesta

7

No hay equivalente. Un formulario tiene un ciclo de tamaño modal, iniciado cuando el usuario hace clic en el borde o en una esquina del formulario. Los controles secundarios no se pueden cambiar de tamaño de esa manera, solo ve cambios en su propiedad Tamaño.

Resuelva esto agregando una propiedad de tamaño a su control de usuario. El formulario puede asignarlo fácilmente desde sus anulaciones OnResizeBegin/End(). Tras la propiedad Parent en el evento Load del UC hasta encontrar la forma es posible también:

solución
public bool Resizing { get; set; } 

private void UserControl1_Load(object sender, EventArgs e) { 
    if (!this.DesignMode) { 
    var parent = this.Parent; 
    while (!(parent is Form)) parent = parent.Parent; 
    var form = parent as Form; 
    form.ResizeBegin += (s, ea) => this.Resizing = true; 
    form.ResizeEnd += (s, ea) => this.Resizing = false; 
    } 
} 
+0

En mayo, el formulario principal también es un control de usuario. Por lo tanto, no puedo convertir el control principal en un formulario. – Ram

+0

@Ram: es por eso que el ciclo while está ahí. ¿Lo intentaste? –

+0

@ Hans Passant: esta publicación me fue dada después de mi publicación [aquí] (http://stackoverflow.com/questions/7584307/user-control-resize). El problema es (usando tu respuesta) que el padre se vuelve nulo durante el ciclo y todo falla. Incluso el uso de 'this.FindForm()' me da nulo. ¿Tienes otra idea? – Marco

1

Las Hans está trabajando (y parece que es la única manera de hacerlo), pero es requiere estos controladores en todas las formas, que usa su control (que no siempre es aceptable).

Por lo tanto, puede utilizar una solución simple, iniciando el temporizador cuando se produce el cambio de tamaño. Cada vez que se cambie el tamaño, se reiniciará el temporizador. Y solo cuando no haya cambios de tamaño durante un tiempo (_timer.Interval) invocará el método ResizeFinished().

private Timer _timer; 

    public MyControl() 
    { 
     _timer = new Timer(); 
     _timer.Interval = 500; 
     _timer.Tick += (sender, e) => ResizeFinished(); 
    } 

    protected override void OnSizeChanged(EventArgs e) 
    { 
     base.OnSizeChanged(e); 
     _timer.Start(); 
    } 

    private void ResizeFinished() 
    { 
     _timer.Stop(); 
     // Your code 
    } 

Como puede ver, su código será invocado solo después de 500 ms después de la última invocación modificada.

Cuestiones relacionadas