Saya menulis aplikasi pertama saya di WPF dan ingin agar pengguna memasukkan beberapa data pada jendela dialog modal. Tampaknya, ini tidak mudah dilakukan di WPF, karena jendela induk tetap diaktifkan sepenuhnya, dan metode yang membuat jendela anak baru tidak berhenti dan menunggu jendela anak untuk memanggil Tutup (). Sebaliknya itu hanya terus maju. Ini bukan yang saya inginkan.
Bagaimana saya bisa membuka jendela anak, dan membiarkan jendela induk menunggu anak menutup sebelum jendela induk terus dijalankan?
.net
wpf
dialog
modal-dialog
Alex Baranosky
sumber
sumber
Jawaban:
Apakah Anda mencoba menampilkan jendela menggunakan metode ShowDialog ?
Jangan lupa untuk mengatur properti Owner di jendela dialog ke jendela utama. Ini akan menghindari perilaku aneh ketika Alt + Tab, dll.
sumber
Banyak jawaban ini sederhana, dan jika seseorang memulai WPF, mereka mungkin tidak mengetahui semua "seluk beluk", karena lebih rumit daripada hanya mengatakan pada seseorang "Gunakan
.ShowDialog()
!". Tetapi itu adalah metode (bukan.Show()
) yang ingin Anda gunakan untuk memblokir penggunaan jendela yang mendasarinya dan untuk menjaga kode dari melanjutkan sampai jendela modal ditutup.Pertama, Anda membutuhkan 2 jendela WPF. (Satu akan memanggil yang lain.)
Dari jendela pertama, katakanlah yang disebut MainWindow.xaml, di belakangnya adalah:
Kemudian tambahkan tombol Anda ke XAML Anda:
Dan klik kanan
Click
rutinnya, pilih "Pergi ke definisi". Ini akan membuatnya untuk Anda di MainWindow.xaml.cs:Dalam fungsi itu, Anda harus menentukan halaman lain menggunakan kelas halamannya. Katakanlah Anda memberi nama halaman lain itu "ModalWindow", sehingga itu menjadi kelas halamannya dan bagaimana Anda akan instantiate (panggil) itu:
Katakanlah Anda memiliki nilai yang perlu Anda tetapkan pada dialog modal Anda. Buat kotak teks dan tombol di
ModalWindow
XAML:Kemudian buat pengendali acara (
Click
event lain ) lagi dan gunakan untuk menyimpan nilai textbox ke variabel statis publikModalWindow
dan panggilthis.Close()
.Kemudian, setelah
.ShowDialog()
pernyataan Anda, Anda bisa mengambil nilai itu dan menggunakannya:sumber
Window.Show Window akan menampilkan jendela, dan melanjutkan eksekusi - ini adalah panggilan yang tidak menghalangi.
Window.ShowDialog akan memblokir utas panggilan (agak [1]), dan menampilkan dialog. Ini juga akan memblokir interaksi dengan jendela induk / pemilik. Ketika dialog ditolak (untuk alasan apa pun) ShowDialog akan kembali ke pemanggil, dan akan memungkinkan Anda untuk mengakses DialogResult (jika Anda menginginkannya).
[1] Ini akan membuat pompa dispatcher dengan mendorong bingkai dispatcher ke dipatcher WPF. Ini akan menyebabkan pompa pesan terus memompa.
sumber
Diberikan objek Window myWindow, myWindow.Show () akan membukanya secara modeless dan myWindow.ShowDialog () akan membukanya secara modally. Namun, bahkan yang terakhir tidak menghalangi, dari apa yang saya ingat.
sumber
ShowDialog
tidak kembali sampai modal ditutup, sehingga memblokir operasi operator yang saat ini menjalankan. TapiShowDialog
itu sendiri secara efektif memanggilDispatcher.Run()
, sehingga operator terus menjalankan operasi, yang pada dasarnya menjaga UI responsif.