Używanie Prism do nawigacji w aplikacji Wpf

Rozpoczynam nowy projekt w Wpf i teraz zastanawiam się nad użyciem Prism. Na razie próbuję po prostu skonfigurować nawigację w aplikacji za pomocą Prism. Niestety mój brak doświadczenia z frameworkiem utrudnia rozpoczęcie pracy.

Mówiąc dokładniej o moim pierwszym wyzwaniu, mam aplikację z regionem „nawigacja/menu” i regionem „głównym”. Region nawigacji będzie taki sam dla wszystkich różnych widoków regionu głównego, dlatego definiuję menu w pliku Shell.xaml. Klikając dowolną pozycję menu, chciałbym dodać widok na region za pomocą Prism. Pierwszy; czy jest to coś, do czego zazwyczaj używa się Prism? W takim razie; jakie jest typowe podejście? Mam na myśli bardziej strukturalny poziom..

Mam wrażenie, że Prism ostatecznie sprawi, że moja aplikacja będzie znacznie bardziej skalowalna i widzę, że czerpię z tego jeszcze inne korzyści - na przykład kontener IoC. Więc chciałbym to wykorzystać - gdybym tylko mógł przejść pierwsze kroki..


person stiank81    schedule 09.09.2009    source źródło


Odpowiedzi (2)


Mam próbkę, która wykorzystuje nieco więcej stylu CAG w przypadku modułów tworzących menu i dodawania widoków do regionu. Powinno to nieco rozjaśnić sprawę.

http://dl.getdropbox.com/u/376992/CAGMenus.zip

Mam nadzieję, że to pomoże, Anderson

person Anderson Imes    schedule 10.09.2009
comment
Dzięki. Mam już tę próbkę. Mam koncepcje, ale tak naprawdę nie mogłem się ich uchwycić i złożyć w jedną całość we własnych aplikacjach. Ale po dalszych badaniach ta próbka naprawdę mi pomogła – więc teraz jestem na dobrej drodze. - person stiank81; 10.09.2009
comment
Oznaczenie tego jako odpowiedzi jako dostarczonego przykładowego kodu doprowadziło do rozwiązania. Dzięki! - person stiank81; 10.09.2009

Bumbuska,

Pryzmat będzie dla Ciebie świetnym sposobem na osiągnięcie tej funkcjonalności i jest to całkiem łatwe do wykonania, gdy zrozumiesz zasady.

Zrobię to poprzez dodanie detektorów zdarzeń w zdarzeniu startowym Twojego Regionu Głównego. Po wybraniu pozycji w menu uruchamiasz zdarzenie. Kiedy tak się stanie, Twój Region Główny zajmie się wydarzeniem, a Ty wyczyścisz bieżący widok z Regionu Głównego. Następnie utwórz nowy widok, którego chcesz użyć i dodaj go.

Twój główny region powinien wyglądać mniej więcej tak:

public void Initialize()
{
    Events.PageEvents.ClickedEvent1 ce1 = this.eventAggregator.GetEvent<Events.PageEvents.ClickedEvent1>();
    ce1.Subscribe(LoadView, ThreadOption.UIThread, true);
}

private void LoadView(Events.HomePageEvents.Clicked clicked1)
{
    IRegion mainRegion = RegionManager.Regions["MainRegion"];
    foreach (object view in new List<object>mainRegion.Views))
    {
        RegionManager.Regions["MainRegion"].Remove(view);
    }

    IModule firstModule = Container.Resolve<Modules.FirstModule>();
    firstModuleModules.Initialize();

}

Mam nadzieję, że to wskaże Ci właściwy kierunek. Proszę dać mi znać, jeśli potrzebujesz więcej informacji.

person Cornelius Kruger    schedule 09.09.2009
comment
Dzięki! To dla mnie dobra pomoc. Sprawiłem, że działa tak, jak chciałem, ale nie używam agregacji zdarzeń. Używam powiązań poleceń dla elementów menu, które są niektórymi obiektami viewModel przechowującymi informacje o tym, który komponent otworzyć w głównym regionie. Wydaje mi się, że jest to w porządku, ale czy agregacja zdarzeń jest bardziej preferowanym sposobem? Dziękuję za przykład rozliczenia regionu. Miałem nadzieję znaleźć funkcję ustawiania elementu w widoku zamiast czyszczenia wszystkich istniejących i dodawania nowego. Ale twój przykład ilustruje typowe podejście? - person stiank81; 10.09.2009
comment
To naprawdę zależy od aplikacji, w której polecenie pogodowe lub zdarzenia są lepsze. Myślę, że w przypadku głównych poleceń menu nawigacji prawdopodobnie działałoby lepiej. Możesz mieć wszystkie widoki aktywne w swoim regionie głównym i po prostu aktywować ten, którego chcesz używać. Znowu będzie to zależeć od twojej aplikacji, ale dla mnie nie ładowałbym czegoś, co mogłoby się nie przydać. - person Cornelius Kruger; 10.09.2009
comment
OK – dla mnie wydaje się to rozsądne bez bieżących wydarzeń. Może później zmienię zdanie, ale na razie jest OK. Jeszcze raz dziękuję za pomoc! - person stiank81; 10.09.2009