Ich schreibe meine erste Anwendung in WPF und möchte, dass der Benutzer einige Daten in ein modales Dialogfenster eingibt. Anscheinend ist dies in WPF nicht einfach, da das übergeordnete Fenster vollständig aktiviert bleibt und die Methode, mit der das neue untergeordnete Fenster erstellt wurde, nicht stoppt und darauf wartet, dass das untergeordnete Fenster Close () aufruft. Stattdessen geht es einfach weiter. Das will ich nicht.
Wie kann ich das untergeordnete Fenster öffnen und das übergeordnete Fenster warten lassen, bis das untergeordnete Fenster geschlossen ist, bevor das übergeordnete Fenster weiter ausgeführt wird?
.net
wpf
dialog
modal-dialog
Alex Baranosky
quelle
quelle
Antworten:
Haben Sie versucht, Ihr Fenster mit der ShowDialog- Methode anzuzeigen ?
Vergessen Sie nicht, die Owner-Eigenschaft im Dialogfenster auf das Hauptfenster zu setzen. Dies vermeidet seltsames Verhalten bei Alt + Tabbing usw.
quelle
Viele dieser Antworten sind simpel, und wenn jemand mit der WPF beginnt, kennt er möglicherweise nicht alle "Vor- und Nachteile", da dies komplizierter ist, als nur jemandem "Verwenden
.ShowDialog()
!" Zu sagen . Dies ist jedoch die Methode (nicht.Show()
), die Sie verwenden möchten, um die Verwendung des zugrunde liegenden Fensters zu blockieren und zu verhindern, dass der Code fortgesetzt wird, bis das modale Fenster geschlossen wird.Zunächst benötigen Sie 2 WPF-Fenster. (Einer wird den anderen anrufen.)
Nehmen wir vom ersten Fenster an an, dass MainWindow.xaml in seinem Code-Behind heißt:
Fügen Sie dann Ihre Schaltfläche zu Ihrer XAML hinzu:
Klicken Sie mit der rechten Maustaste auf die
Click
Routine und wählen Sie "Zur Definition gehen". Es wird es für Sie in MainWindow.xaml.cs erstellen:Innerhalb dieser Funktion müssen Sie die andere Seite anhand ihrer Seitenklasse angeben. Angenommen, Sie haben diese andere Seite "ModalWindow" genannt, damit sie zu ihrer Seitenklasse wird und Sie sie instanziieren (aufrufen) würden:
Angenommen, Sie haben einen Wert festgelegt, den Sie in Ihrem modalen Dialogfeld festlegen müssen. Erstellen Sie ein Textfeld und eine Schaltfläche in der
ModalWindow
XAML:Erstellen Sie dann erneut einen Ereignishandler (ein anderes
Click
Ereignis) und verwenden Sie ihn, um den Textfeldwert in einer öffentlichen statischen Variablen zu speichernModalWindow
und aufzurufenthis.Close()
.Nach Ihrer
.ShowDialog()
Aussage können Sie diesen Wert abrufen und verwenden:quelle
Window.Show Window zeigt das Fenster an und setzt die Ausführung fort - es ist ein nicht blockierender Aufruf.
Window.ShowDialog blockiert den aufrufenden Thread (irgendwie [1]) und zeigt den Dialog an. Außerdem wird die Interaktion mit dem übergeordneten / besitzenden Fenster blockiert. Wenn der Dialog geschlossen wird (aus welchem Grund auch immer), kehrt ShowDialog zum Aufrufer zurück und ermöglicht Ihnen den Zugriff auf DialogResult (falls gewünscht).
[1] Der Dispatcher wird weiter gepumpt, indem ein Dispatcher-Rahmen auf den WPF-Dipatcher gedrückt wird. Dadurch pumpt die Meldungspumpe weiter.
quelle
Wenn ein Window-Objekt myWindow gegeben ist, öffnet myWindow.Show () es modelllos und myWindow.ShowDialog () öffnet es modal. Aber auch letzteres blockiert nicht, soweit ich mich erinnere.
quelle
ShowDialog
kehren erst zurück, wenn das Modal geschlossen ist, und blockieren daher den aktuell ausgeführten Dispatcher-Vorgang. AberShowDialog
selbst ruft effektiv aufDispatcher.Run()
, so dass der Dispatcher weiterhin Operationen ausführt, wodurch die Benutzeroberfläche reaktionsfähig bleibt.