Als allgemeine Regel vermeiden Sie TopMost, es sei denn, Sie müssen absolut nicht. Wenn Sie absolut nicht müssen, nie mehr als ein TopMost Formular gleichzeitig haben. (Es kann ja nicht drei TopMost-Formulare geben - jemand muss verlieren).
Überprüfen Sie zuerst, ob Sie den Besitzer richtig einstellen, wenn Sie Form.ShowDialog()
anrufen. Dies führt dazu, dass die neue Form mit größerer Wahrscheinlichkeit an einem geeigneten Ort erscheint und das Verhalten der Anwendung insgesamt verbessert. Zweitens, vergewissern Sie sich, dass Sie immer nur ein TopMost-Fenster haben. Ein kombiniertes Versäumnis, diese Dinge zu tun, könnte definitiv Ihr Problem verursachen. Zum Beispiel:
// MainForm.cs -- Don't do this
this.TopMost = true;
childForm.TopMost = true;
childForm.ShowDialog(/*no parent spec'd*/);
Was passiert nun? Sowohl die Hauptform als auch die Kinderform sind die obersten, also muss einer von ihnen verlieren. MainForm war aktiv, als es childForm als oberste erstellt hat, aber childForm hat kein übergeordnetes Element. Vielleicht hat Windows beschlossen, den Desktop zu seinem Elternteil zu machen. Dies könnte dazu führen, dass das Hauptformular auf dem neu geöffneten untergeordneten Formular verbleibt.
ShowDialog (parentHandle) löste meine Probleme so weit ich es jetzt sagen kann. Aber es taucht eine andere Frage auf: Warum gibt es einen ShowDialog (/ * no elter spec * *); das funktioniert nur in 99 von 100 Fällen? Diese Art von Bug kann wirklich verrückt machen. Ich hätte nie erwartet, dass die Kodierungsoberfläche den Coder in den Bereich der Statistik bringen wird. :) – Matze
Gute Frage, und ich weiß nicht, _die Antwort. Die beste Schätzung bezieht sich auf "http://preview.tinyurl.com/c6cfze". Die zugrunde liegenden APIs ermöglichen ein NULL-übergeordnetes Fenster aus welchen Gründen auch immer (möglicherweise kann ShowDialog() in einigen Kontexten kein Eltern haben), so das .Net-Äquivalent ebenfalls. –