2010-03-19 11 views
9

Potrzebuję pomocy przy nakładanie widoki używając framework.Its pryzmatem trochę więcej niż skompleksowana więc niech mnie explain.I może być nadmierne myślenie to za dobrze: DWPF i Prism Zobacz Nakładka

mam shell (okno wpf) i mam 2 widoki (A & B - oba kontrole użytkownika) w module. kiedy powłoka ładuje ładuje widok A. W widoku A mam przycisk do "wyskakującego" widoku B dla niektórych danych wejściowych użytkownika. więc naturalnie pomyślałbym o jakimś modalnym oknie/sterowaniu, może nawet o wyskakującym okienku. jednak problemem, z którym się spotykam jest to, że gdy przesuję powłokę, popup pozostaje stały i nie blokuje zdarzeń w widoku A. Próbowałem wyłączyć wyłączanie widoku A, aby zatrzymać zdarzenia, a także próbowałem użyć a do uzyskać widok B poruszać się z powłoką. Działa tylko płótno, ale teraz potrzebuję sposobu, aby go zablokować. " Czy mimo to mogę nakryć widok na inny widok pryzmatem? lub w jaki sposób wszyscy inni tworzą modalne wyskakujące okienka z pryzmatem & wpf? wszelkie rady lub wskazówki byłyby bardzo mile widziane.

Odpowiedz

13

Jeśli chcesz używać okien dialogowych wbudowanych bez dodatkowego okna, możesz użyć programu RegionManager programu Pryzmat, aby uzyskać opisane zachowanie. Sztuką jest, aby umieścić regionu PopUp równolegle do głównego obszaru w drzewie wizualne:

<Grid> 
    <ContentControl cal:RegionManager.RegionName="MainRegion" IsEnabled={Binding IsNoPopUpActive} /> 
    <ContentControl cal:RegionManager.RegionName="PopUpRegion"/> 
</Grid> 

Teraz użyj RegionManager umieścić widok „A” do „MainRegion”. Utwórz klasę kontrolera podobną do IPopUpDialogController. Powinien być odpowiedzialny za umieszczenie twojego widoku "B" (lub dowolnego innego PopUpView w twojej aplikacji) w "PopUpRegion" na żądanie. Dodatkowo powinna kontrolować flagę sygnalizującą włączenie lub wyłączenie podstawowego "MainRegion". W ten sposób użytkownik nie będzie mógł grać z kontrolkami w widoku "A", dopóki okno podręczne nie zostanie zamknięte.

Można to nawet zrobić modalnie, używając narzędzia ComponentDispatcher.PushModal() przed wysłaniem ramki do Dispatchera. Zalecam jednak unikać dialogów modalnych.


Aktualizacja: Zgodnie z wnioskiem w komentarzu The IsNoPopUpActive mogą być realizowane w modelu widoku podkład. Nie można połączyć go z RegionManager widoku kolekcji dla regionu podręcznego:

public bool IsNoPopUpActive 
{ 
    get { return _regionManager.Regions["PopUpRegion"].Views.Count() == 0; } 
} 

Pamiętaj, aby wywołać zdarzenie PropertyChanged jak najszybciej zmodyfikować zbiór widoków (dodaj/usuń popup).

Po prostu dla twojej informacji: obecnie unikam wyłączania kontrolek w tle i zamiast tego wstawiam przezroczysty panel. Pozwala to uniknąć klikania kontrolek tła. Nie obsługuje to jednak wprowadzania danych z klawiatury (karta do sterowania). Aby naprawić wejście klawiatury, upewnij się, że ostrość klawiatury jest uwięziona w wyskakującym okienku (MSDN on WPF Focus concepts).

Dodanie następującego ostrość atrybuty regionu podręcznego powinno załatwić sprawę:

KeyboardNavigation.DirectionalNavigation="None" 
KeyboardNavigation.ControlTabNavigation="None" 
KeyboardNavigation.TabNavigation="Cycle" 
KeyboardNavigation.TabIndex="-1" 
+0

dzięki bardzo! faktycznie zrobiłem to w inny sposób, ale bardzo podobny do twojego. to, co zrobiłem, użyłem kontroli treści dla mojego regionu powłoki i utworzyłem region kontroli przedmiotów w module A. ustawiłem układ tak, aby używał siatki w obszarze kontroli przedmiotów i robiłem to, co aktywowało i dezaktywowało widoki wewnątrz regionu "wyskakujące okienko". Zamierzam dać ci rozwiązanie. będzie opinie na temat wyników. dzięki jeszcze raz! – Zaheer

+0

Witam Olli, czy możesz podać fragment, w jaki sposób dołączyć właściwość "IsNoPopUpActive"? – ioWint

+0

Witaj ioWint, zaktualizowałem odpowiedź. –

2

Jeśli używasz WPF + MVVM z Prism można przyjrzeć się tej wiadomości kontrolera Zobacz nakładki. Przyjemną częścią tego podejścia jest to, że możesz napisać testy jednostkowe na modelu widokowym za pomocą pozornego kontrolera nakładki i poprosić kontrolera próbnego o zwrócenie wyniku, który użytkownik wybrałby w nakładce.

Można go znaleźć tutaj: http://presentationlayer.wordpress.com/2011/05/24/wpf-overlay-message-view-controller/

Nadzieja to pomaga