2009-12-10 47 views
5

¿Hay alguna manera de obtener un evento Load para System.Windows.Forms.Control como System.Windows.Forms.Form.Load?Agregar un evento Load para Winforms Control al igual que la clase de formulario

Quiero ejecutar un código de inicialización antes de que se muestre el control por primera vez.

Además, sería bueno poder hacer lo mismo para System.Windows.Forms.ToolStripStatusLabel que no es realmente un Control, pero funciona como uno.

Idealmente, puedo hacer esto: control.OnLoad (() => {dosomething aquí;});

en el que OnLoad es un método de extensión que ejecutaría el argumento Acción cuando el "control" "Carga".

Gracias!

Respuesta

4

Form.Load evento es llamado por el método OnLoad que se llama desde el método OnCreateControl que pertenece a la clase Control. Así que para la forma de la secuencia de llamada sería siguiente:

OnCreateControl start 
    OnLoad start 
     Form Load event call 
    OnLoad finish 
OnCreateControl finish 

supongo que se puede anular OnCreateControl para su componente y añadir su código de optimización allí.

Espero que esto ayude, Saludos.

+0

Gracias por su consejo. Siguiendo su consejo, encontré el evento CreateControl de la clase Control. ¿Hay algo así en la clase ToolStripItem? – deerchao

+0

¿Está intentando crear un nuevo descendiente ToolStripItem? Supongo que puede poner el código de inicialización en su contructor –

+0

No, no puedo porque el código tiene algo que ver con su elemento primario: el control ToolStrip. en el constructor, serían nulos. – deerchao

4

Para un control puede anular OnControlCreated o OnHandleCreated. Este último puede disparar varias veces si es necesario recrear la ventana de control. Asegúrese de usarlo si su código afecta la ventana en sí. En otras palabras, si hace algo que requiera la propiedad Manejar.

Pocas opciones adecuadas para un control derivado de ToolStripItem. Recomiendo anular SetVisibleCore() o OnAvailableChanged() o el evento AvailableChanged. Se ejecutan cuando cambia la propiedad Visible de ToolStripItem. Tenga en cuenta que puede disparar varias veces, mantenga un campo bool que rastree que su código de inicialización ya se haya ejecutado.

Por último pero no menos importante, asegúrese de hacer solo esto si su código realmente requiere que se cree el control. La gran mayoría del código de inicio puede ir en el constructor. Solo necesita un evento Load si su código depende de la ubicación real y el tamaño del control. Que podría ser diferente del valor del diseñador si el formulario se vuelve a escalar a sí mismo debido a una fuente de sistema diferente o una configuración de PPP de video en la máquina de destino.

+0

Gracias. Lo probé, pero no funcionaba como esperaba. El evento VisibleChanged/AvailableChanged se activa cuando GetCurrentParent() es nulo. – deerchao

0

Necesitaba una solución como esta para un TabPage dentro de un TabControl.Lo único que se me ocurrió fue utilizar el controlador de eventos de pintura. Agregué el controlador de eventos para Paint y en la primera línea eliminé el controlador de eventos y luego hice más código de inicialización. Esto solo funciona si no tienes una pintura personalizada. Alternativamente, si necesita hacer una pintura personalizada, puede agregar una bandera para verificar cada vez que Paint se ejecuta.

//Paint only runs once  
private void tabPage1_Paint(object sender, PaintEventArgs e) 
{ 
    tabPage1.Paint -= tabPage1_Paint;  
    //Do initialization here  
} 

///////////////////////////////////////////////////////////////////////////////// 

//Paint always runs 

private bool IsFirstPaint = true; 

private void tabPage1_Paint(object sender, PaintEventArgs e)  
{  
    if(IsFirstPaint) 
    { 
     IsFirstPaint = false;  
     //Do initialization here 
    }  
    //Do custom painting here 
} 
Cuestiones relacionadas