2013-12-17 19 views
6

Warum ist ein Formular immer noch sichtbar, nachdem ein FormClosed-Ereignis ausgelöst wurde? Wie erkennt man, wenn ein Formular tatsächlich geschlossen ist?Formular geschlossen, aber sichtbar

enter image description here

Interessante daran ist, dass

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

zum gleichen Ergebnis führt.

Antwort

3

Sie schließen den Dialog auf eine ungewöhnliche Art und Weise, indem Sie die DialogResult-Eigenschaft des Formulars festlegen. Winforms synthetisiert immer noch das FormClosed-Ereignis in diesem Fall, tut es aber zur "falschen" Zeit, das Fenster ist immer noch sichtbar. Es wird unmittelbar danach unsichtbar.

Wenn Sie eine Problemumgehung für diese dann benötigen, ist der Trick zu verzögern, was Sie in Ihrem FormClosed-Ereignishandler tun möchten. Das ist elegant getan, indem die Control.BeginInvoke() Methode verwendet wird, wie folgt aus:

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

Und Sie werden jetzt die MessageBox nach das Fenster verschwunden sehen.

Vorsicht vor dem Fehler in Ihrem Code, Sie abonnieren das FormClosed-Ereignis mehr als einmal.

+0

Das funktioniert nur auf einem zweiten Formular. Wenn es das Hauptformular ist, das von 'Program' durch' Application.Run (neues Form1()) aufgerufen wird; '- wird die MessageBox nicht angezeigt. [Meine Frage zu diesem Thema] (http://stackoverflow.com/questions/28397177/how-to-execute-code-after-the-main-form-hasclosed). – ispiro

+0

+1. Ich nahm an, dass ich etwas verpasse. Warum würde ein Formular ** Geschlossen ** nicht ausgelöst, nachdem das Formular geschlossen wurde. Durch deinen Kommentar habe ich verstanden, dass es so ist. Vielen Dank. – ispiro

2

Die Sache ist, dass Sie einen modalen Dialog zeigen - der verhindert, dass der UI-Thread das Formular tatsächlich vom Bildschirm entfernt.

+0

Aber wie kann das Formular "_form2.Visible == false" sein und gleichzeitig auf dem Bildschirm angezeigt werden? – aush

+0

Da der Zustand der Eigenschaft und was auf dem Bildschirm gezeichnet wird nicht unbedingt übereinstimmen. Sie haben Ihrem Formular gesagt, dass es sich verstecken/schließen soll und das Ändern der Eigenschaft bedeutet, dass die Form "verstanden" hat, was Sie wollen, und Windows "gesagt", dies zu tun, aber wenn der Fenstermanager den Bildschirm tatsächlich neu überstreicht, so dass das Formular tatsächlich herauskommt der Weg ist nicht unter Kontrolle von irgendjemandem. Durch das Anzeigen der "MessageBox" unterbrechen Sie tatsächlich den Fluss von Fenstermeldungen, die tatsächlich dazu führen würden, dass das Formular visuell verschwindet. –

+0

Gibt es eine Möglichkeit zu bestimmen, wann ein modales Formular aus dem Bildschirm entfernt wird? – aush

Verwandte Themen