Ada dua cara yang baik untuk melakukan ini, 1) layanan dialog (mudah, bersih), dan 2) lihat dibantu. View dibantu menyediakan beberapa fitur yang rapi, tetapi biasanya tidak sepadan.
LAYANAN DIALOG
a) antarmuka layanan dialog seperti via konstruktor atau wadah ketergantungan:
interface IDialogService
{
Task ShowDialogAsync(DialogViewModel dlgVm);
}
b) Implementasi IDialogService Anda harus membuka jendela (atau menyuntikkan kontrol ke jendela aktif), membuat tampilan yang sesuai dengan nama tipe dlgVm yang diberikan (menggunakan registrasi atau konvensi wadah atau ContentPresenter dengan tipe DataTemplates terkait). ShowDialogAsync harus membuat TaskCompletionSource dan mengembalikan proposinya .Task. Kelas DialogViewModel sendiri membutuhkan acara yang dapat Anda panggil di kelas turunan saat Anda ingin menutup, dan tonton di tampilan dialog untuk benar-benar menutup / menyembunyikan dialog dan menyelesaikan TaskCompletionSource.
b) Untuk menggunakannya, cukup panggil tunggu ini. DialogService.ShowDialog (myDlgVm) pada contoh Anda dari beberapa kelas yang diturunkan dari DialogViewModel. Setelah menunggu pengembalian, lihat properti yang telah Anda tambahkan pada dialog VM Anda untuk menentukan apa yang terjadi; Anda bahkan tidak memerlukan panggilan balik.
LIHAT BANTUAN
Ini membuat Anda mendengarkan acara di model tampilan. Ini semua bisa dibungkus menjadi Perilaku Blend untuk menghindari kode di belakang dan penggunaan sumber daya jika Anda cenderung (FMI, subkelas kelas "Perilaku" untuk melihat semacam properti terlampir Blendable pada steroid). Untuk saat ini, kami akan melakukan ini secara manual pada setiap tampilan:
a) Buat OpenXXXXXDialogEvent dengan payload kustom (kelas turunan DialogViewModel).
b) Minta tampilan untuk berlangganan acara tersebut di acara OnDataContextChanged-nya. Pastikan untuk menyembunyikan dan berhenti berlangganan jika nilai lama! = Null dan pada acara Window's Unloaded.
c) Ketika acara menyala, mintalah tampilan untuk membuka tampilan Anda, yang mungkin ada di sumber daya pada halaman Anda, atau Anda dapat menemukannya dengan konvensi di tempat lain (seperti dalam pendekatan layanan dialog).
Pendekatan ini lebih fleksibel, tetapi membutuhkan lebih banyak pekerjaan untuk digunakan. Saya tidak banyak menggunakannya. Satu keuntungan yang bagus adalah kemampuan untuk menempatkan tampilan secara fisik di dalam tab, misalnya. Saya telah menggunakan algoritma untuk menempatkannya di batas kontrol pengguna saat ini, atau jika tidak cukup besar, melintasi pohon visual sampai wadah yang cukup besar ditemukan.
Ini memungkinkan dialog menjadi dekat dengan tempat mereka sebenarnya digunakan, hanya meredupkan bagian dari aplikasi yang terkait dengan aktivitas saat ini, dan membiarkan pengguna bergerak di dalam aplikasi tanpa harus secara manual mendorong dialog, bahkan memiliki beberapa kuasi- dialog modal terbuka pada tab atau sub-tampilan yang berbeda.