Laden...

Form verliert den Focus und springt in den Hintergrund...

Erstellt von ViperNeo vor 14 Jahren Letzter Beitrag vor 13 Jahren 8.107 Views
Information von herbivore vor 12 Jahren

Dies ist ein Thread, auf den aus der FAQ ([FAQ] Kommunikation von 2 Forms) verwiesen wird. Bitte keine weitere Diskussion, sondern nur wichtige Ergänzungen und diese bitte knapp und präzise. Vielen Dank!

V
ViperNeo Themenstarter:in
352 Beiträge seit 2008
vor 14 Jahren
Form verliert den Focus und springt in den Hintergrund...

Hallo Leute,

ich beobachte in meiner Applikation ein komisches Phänomen.

Und zwar habe ich meine MainForm, auf der ein ListView platziert ist. Über einen Button wird ein modales ToolWindow geöffnet, indem ein neues Objekt angelegt werden kann. Nach dem Schließen der modalen Form, springt die Hauptform automatisch in den Hintergrund. Auch ein manuelles Setzen des Focus oder ein BringToFront aufruf bringen nichts.

Kann mir da jemand mal behilflich sein woran das liegen könnte?

Danke!

Grüße
ViperNeo

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo ViperNeo,

das Thema wurde schon einige Male besprochen. Bitte benutze die Forumssuche und poste die besten Treffer hier. Vielen Dank!

herbivore

V
ViperNeo Themenstarter:in
352 Beiträge seit 2008
vor 14 Jahren

So, hier im Forum lässt sich zwar nichts nützliches finden ich habe nun aber ein wenig das verhalten der form bei verschiedenen einstellungen analysiert.

Und zwar zum grundsätzliche nhandling mit Windows Forms:
Beim Aufruf einer Modalen oder nicht Modalen Form über (Show() und ShowDialog()) ist es sehr sinnvoll immer die Aufrufende Form mit anzugeben (Show(baseForm), ShowDialog(baseForm)). Dadurch wird der aufzurufenden Form schonmal gesagt wer das Mutterfenster ist und der weg des Fokus wird der applikation klarer.

Dann ein unglaublich wichtiger Punkt, der bei mir das Problem verursacht hat:
Setzt man im neuen Dialog einen DialogResult um dem aufrufer mitzuteilen zum Beispiel welcher Knopf gedrückt wurde, dann sollte man nicht!! this.Close() oder this.Hide() zusätzlich aufrufen, da ein setzen des DialogResult bereits ein schließen der Form initiiert. Durch das doppelte Aufrufen im Prinzip verliert die Anwendung den Bezug und die Z-Indexe aller aktiven Anwendungen verschieben sich. Die Anwendung die dann am nächsten Greifbar ist, wird nach vorne geholt.

Führt man nur ein this.Close(), this.Hide() aus, dann klappts. Genauso wie wenn man lediglich einen DialogResult setzt.

Alles ohne Flackern, ohne BringToFront(), Activate(), Show() oder sonstigen Workarounds.

Beim Handling mit Forms sollte man also meine Tips beachten 😃

Danke und bis demnächst 😉

Grüße
ViperNeo

4.221 Beiträge seit 2005
vor 13 Jahren

Danke für die Ausführungen ViperNeo

Dieses Problem ist auf eine gewisse unschärfe im .Net Framework (ShowDialog - Methode mit Owner-Parameter) zurückzuführen.

Es tritt immer dann auf, wenn die ShowDialog-Methode noch nicht beendet ist, das modal angezeigte Form unsichtbar wird.

Ein Beispiel (nur Hide kontra Close)

Form1 ruft Form2 auf mit Form2.ShowDialog(this).

Wenn nun das modale Form mit Hide versteckt wird, dann tritt der Fehler auf.
Wenn es aber mit Close geschlossen wird, dann tritt der Fehler nicht auf.

Weiter habe ich nicht getestet... kann mir aber durchaus vorstellen, dass z.B: ein
this.Hide();
gefolgt von einem
this.DialogResult = ...

Ebenso zu diesem Problem führen kann.

Grund: gegen Ende der ShowDialog-Methode wird geprüft ob das Owner-Form (oder das aktive Form) sichtbar ist... falls es sichtbar ist, dann wird es wieder aktiviert... wenn es nicht sichtbar ist, dann passiert nichts (das ist die unschärfe).

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...