Bunu yapmanın iki iyi yolu vardır: 1) bir iletişim servisi (kolay, temiz) ve 2) görünüm destekli. Görünüm destekli bazı düzgün özellikler sağlar, ancak genellikle buna değmez.
DİYALOG HİZMETİ
a) kurucu veya bazı bağımlılık konteyneri gibi bir iletişim servisi arayüzü:
interface IDialogService
{
Task ShowDialogAsync(DialogViewModel dlgVm);
}
b) IDialogService uygulamanız bir pencere açmalı (veya etkin pencereye bir miktar denetim enjekte etmeli), verilen dlgVm türünün adına karşılık gelen bir görünüm oluşturmalıdır (kapsayıcı kaydı veya kuralı veya ilişkili DataTemplates türüne sahip bir ContentPresenter kullanın). ShowDialogAsync bir TaskCompletionSource oluşturmalı ve .Task özelliklerini döndürmelidir. DialogViewModel sınıfının kendisi, kapatmak istediğinizde türetilmiş sınıfta çağırabileceğiniz bir olaya ihtiyaç duyar ve iletişim kutusunu gerçekten kapatmak / gizlemek ve TaskCompletionSource'u tamamlamak için iletişim kutusu görünümünde izleyebilirsiniz.
b) Kullanmak için, sadece DialogViewModel'den türetilmiş bir sınıf örneğinizde this.DialogService.ShowDialog (myDlgVm) 'u arayın. Geri gelmeyi bekledikten sonra, ne olduğunu belirlemek için iletişim kutusu sanal makinenize eklediğiniz özelliklere bakın; geri aramaya bile ihtiyacınız yok.
YARDIMLI GÖSTER
Bu, görüşünüzü görünüm modelindeki bir etkinliği dinlemenizi sağlar. Tüm bunlar, eğer eğiminiz varsa arkasındaki kodu ve kaynak kullanımını önlemek için bir Karışım Davranışı'na sarılabilir (FMI, steroidlerde bir tür Blendable ekli özelliği görmek için "Davranış" sınıfını alt sınıf). Şimdilik, bunu her görünümde manuel olarak yapacağız:
a) Özel bir yük (DialogViewModel türetilmiş bir sınıf) ile bir OpenXXXXXDialogEvent oluşturun.
b) Görünümün OnDataContextChanged etkinliğinde olaya abone olmasını sağlayın. Eski değer! = Null ise ve Window'un Unloaded olayında gizlediğinizden ve abonelikten çıktığınızdan emin olun.
c) Etkinlik tetiklendiğinde, sayfanızdaki bir kaynakta olabilecek görünümünüzü açmasını sağlayın veya başka bir yerde (iletişim hizmeti yaklaşımında olduğu gibi) kongre ile bulabilirsiniz.
Bu yaklaşım daha esnektir, ancak daha fazla çalışma gerektirir. Çok kullanmıyorum. Tek güzel avantajı, görünümü fiziksel olarak bir sekmenin içine yerleştirme yeteneğidir. Geçerli kullanıcı denetiminin sınırlarına yerleştirmek için bir algoritma kullandım ya da yeterince büyük değilse, yeterince büyük bir kap bulunana kadar görsel ağacı yukarı doğru hareket ettirdim.
Bu, iletişim kutularının gerçekte kullanıldığı yere yakın olmasına izin verir, uygulamanın geçerli etkinlikle ilgili kısmını yalnızca karartır ve kullanıcının iletişim kutularını manuel olarak itmek zorunda kalmadan uygulama içinde hareket etmesine izin verir, hatta birden fazla yarı kalıcı iletişim kutuları farklı sekmelerde veya alt görünümlerde açılır.