2009-04-06 5 views
0

Ich zeige Dialoge mit Form.ShowDialog(). Formulare sind auf TopMost festgelegt. Einige Bildverarbeitungsberechnungen werden asynchron im Hintergrund ausgeführt. Ihre Ergebnisse werden im Hauptformular von Invoke gerendert. So weit, ist es gut. Seltsam ist, dass der modale Dialog immer wieder hinter die Hauptform verschoben wird. Ich denke, das passiert, wenn die Nachrichten, die den Dialog aufbauen, irgendwie durch Invoke "gestört" sind.Problem mit Z-Order mit TopMost und Invoke

Irgendwelche Ideen, wie man dieses Problem löst?

Antwort

1

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.

+0

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

+0

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. –

0

Vielleicht versuchen Sie könnten den Besitz Form als Parameter Showdialog geben, wie die (VB-Syntax):

Form.ShowDialog(Me) 

nicht sicher, ob es irgendetwas ändern würde, aber einen Versuch wert ...

Wenn Sie sagen "Formulare sind auf TopMost eingestellt", meinen Sie auch die Hauptform oder die modalen Formen? Müssen Sie es wirklich auf TopMost setzen? Manchmal haben TopMost-Formulare ein merkwürdiges Verhalten ...