2013-12-17 16 views
6

Perché un modulo è ancora visibile dopo che è stato generato un evento FormClosed? Come rilevare quando un modulo è in realtà chiuso?Modulo chiuso ma visibile

enter image description here

parte interessante è che

_form2.VisibleChanged += (s, a) => 
{ 
    if (_form2.Visible == false) 
     MessageBox.Show("TEXT"); 
}; 

conduce al medesimo risultato.

risposta

3

Si sta chiudendo la finestra di dialogo in un modo insolito, il modo normale è impostando la proprietà DialogResult del modulo. Winforms sintetizza ancora l'evento FormClosed in questo caso ma lo fa nel momento "sbagliato", la finestra è ancora visibile. Sarà invisibile subito dopo.

Se è necessario un rimedio per questo, è possibile, ritardare ciò che si vuole fare nel gestore di eventi FormClosed. Questo è elegantemente fatto usando il metodo Control.BeginInvoke(), in questo modo:

_form2.FormClosed += (s, a) => { 
     this.BeginInvoke(new Action(() => MessageBox.Show("TEXT"))); 
    }; 

E Vedrai MessageBox dopo finestra scomparve.

Attenzione al bug nel codice, si sottoscrive l'evento FormClosed più di una volta.

+0

Che funziona solo su un secondo Modulo. Se è il form principale chiamato da 'Program' di' Application.Run (new Form1()); '- il MessageBox non verrà mostrato. [La mia domanda in merito] (http://stackoverflow.com/questions/28397177/how-to-execute-code-after-the-main-form-has-closed). – ispiro

+0

+1. Ho pensato che mi mancasse qualcosa. Perché un evento Form ** Closed ** non viene attivato _after_ il modulo è chiuso. Con il tuo commento, ho capito che è proprio così. Grazie. – ispiro

2

Il fatto è che si sta visualizzando una finestra di dialogo modale, che impedisce al thread dell'interfaccia utente di rimuovere effettivamente il modulo dallo schermo.

+0

Ma come può il modulo essere "_form2.Visible == false" e visualizzato sullo schermo allo stesso tempo? – aush

+0

Perché lo stato della proprietà e ciò che viene disegnato sullo schermo non corrispondono necessariamente. Hai detto al tuo modulo di nascondersi/chiudersi e il cambiamento della proprietà significa che il modulo "ha capito" quello che vuoi e "ha detto" a Windows di farlo, ma quando il gestore di finestre effettivamente ridisegna lo schermo in modo che il modulo venga effettivamente rimosso del modo non è sotto il controllo di nessuno. Inoltre, mostrando il 'MessageBox' stai interrompendo il flusso dei messaggi della finestra che potrebbe effettivamente far scomparire visivamente il modulo. –

+0

C'è un modo per determinare quando un modulo modale viene rimosso dallo schermo? – aush

Problemi correlati