Są dwa dobre sposoby, aby to zrobić: 1) usługa dialogu (łatwa, czysta) i 2) pomoc w wyświetlaniu. Wspomaganie widoku zapewnia kilka ciekawych funkcji, ale zwykle nie jest tego warte.
USŁUGA DIALOGOWA
a) interfejs usługi okna dialogowego, taki jak przez konstruktora lub jakiś kontener zależności:
interface IDialogService
{
Task ShowDialogAsync(DialogViewModel dlgVm);
}
b) Wdrożenie IDialogService powinno otworzyć okno (lub wstrzyknąć trochę kontroli do aktywnego okna), stworzyć widok odpowiadający nazwie danego typu dlgVm (użyj rejestracji lub konwencji kontenera lub ContentPresenter z typem DataTemplates). ShowDialogAsync powinien utworzyć TaskCompletionSource i zwrócić jego właściwość .Task. Sama klasa DialogViewModel potrzebuje zdarzenia, które można wywołać w klasie pochodnej, gdy chce się zamknąć, i oglądać w oknie dialogowym, aby faktycznie zamknąć / ukryć okno dialogowe i ukończyć TaskCompletionSource.
b) Aby użyć, po prostu wywołaj polecenie wyczekuj this.DialogService.ShowDialog (myDlgVm) w twojej instancji klasy wywodzącej się z DialogViewModel. Po oczekiwaniu na powrót sprawdź właściwości dodane do maszyny Wirtualnej okna dialogowego, aby ustalić, co się stało; nawet nie potrzebujesz oddzwonienia.
WIDOK Z POMOCĄ
Dzięki temu twój widok nasłuchuje zdarzenia na viewmodel. Można to wszystko zawrzeć w zachowaniu mieszania, aby uniknąć opóźnień w korzystaniu z kodu i zasobów, jeśli masz takie skłonności (FMI, podklasę klasy „Zachowanie”, aby zobaczyć coś w rodzaju mieszanej właściwości dołączanej na sterydach). Na razie zrobimy to ręcznie dla każdego widoku:
a) Utwórz OpenXXXXXDialogEvent z niestandardowym ładunkiem (klasa pochodna DialogViewModel).
b) Poproś widok, aby zasubskrybował to wydarzenie w swoim zdarzeniu OnDataContextChanged. Pamiętaj, aby ukryć i anulować subskrypcję, jeśli stara wartość! = Null oraz w zdarzeniu okna rozładowanego.
c) Gdy zdarzenie się uruchomi, otwórz widok, który może znajdować się w zasobie na Twojej stronie, lub możesz go zlokalizować zgodnie z konwencją w innym miejscu (np. w podejściu do usługi dialogu).
To podejście jest bardziej elastyczne, ale wymaga więcej pracy. Nie używam tego dużo. Jedną miłą zaletą jest na przykład fizyczne umieszczenie widoku wewnątrz karty. Użyłem algorytmu, aby umieścić go w granicach bieżącego formantu użytkownika, a jeśli nie jest wystarczająco duży, przejdź w górę drzewa wizualnego, aż znajdzie się wystarczająco duży kontener.
Dzięki temu okna dialogowe mogą znajdować się w pobliżu miejsca, w którym faktycznie są używane, przyciemnić tylko część aplikacji związaną z bieżącą aktywnością i pozwolić użytkownikowi poruszać się po aplikacji bez konieczności ręcznego odsuwania okien dialogowych, a nawet mieć wiele quasi- modalne okna dialogowe otwierają się na różnych kartach lub widokach podrzędnych.