Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Form verliert den Focus und springt in den Hintergrund...

Moderationshinweis von herbivore (21.04.2011 - 17:34)

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!

ViperNeo
myCSharp.de - Member



Dabei seit:
Beiträge: 352
Herkunft: Darmstadt

Themenstarter:

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

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo ViperNeo,

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

herbivore
private Nachricht | Beiträge des Benutzers
ViperNeo
myCSharp.de - Member



Dabei seit:
Beiträge: 352
Herkunft: Darmstadt

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
Programmierhans
myCSharp.de - Experte

Avatar #avatar-1651.gif


Dabei seit:
Beiträge: 4.221
Herkunft: Zentralschweiz

beantworten | zitieren | melden

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...
private Nachricht | Beiträge des Benutzers