Dziś w kolejnym odcinku mojego przygotowania do WPF’a przyjrzymy się mechanizmowi, który nosi wdzięczną nazwę Configure Page Based navigation.

Zacznę od opisania Page Base navigation, gdyż nie bardzo wiem co może kryć się pod tą konfiguracją – zobaczymy co z tego wyniknie

Jak zacząć

Jeśli chcemy użyć Page Base navigation, powinniśmy zacząć od zdefiniowania naszego okna jako NavigationWindow (lub Frame o różnicach później) oraz zdefiniować Source:

<NavigationWindow x:Class=”WpfExamDemo.Window1″

  xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”

  xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”

  Height=”300″ Width=”300″ Source=”Page1.xaml”>   

NavigationWindow>

Dzięki temu w prosty sposób uzyskujemy następujący efekt:


oczywiście Page1.xaml musi mieć jako obiekt główny Page.

NavigationWindow czy Frame

W zasadzie oba mogą być użyte jako element główny w przypadku takiego typu aplikacji. Frame od NavigationWindow różni się tym, że Frame zajmować może tylko fragment ekranu oraz mogą być zagnieżdżone. Frame ma domyślnie ukryte przyciski nawigacyjne – jeśli chcemy je pokazać, musimy ustawić NavigationUIVisibility na true. Jeśli chcemy uzyskać ten sam efekt dla NavigationWindow musimy użyć właściwości ShowNavigationUI. Frame nie posiada także właściwości Title.

NavigationService

To klasa, która umożliwia interakcję pomiędzy Frame’em a zawierającym go oknem. Aby uzyskać do niej dostęp wystarczy zawołać property o nazwie NavigationService. Klasa ta udostępnia sporo metod związanych z nawigacją po stronie takich jak: Navigate, GoBack, GoForward, Refresh oraz kilka eventów dzięki, którym możemy dowiedzieć się, kiedy jakie zdarzenie wstępuje. Pełna lista na MSDN

Nawigacja

Jak poruszać się pomiędzy stronami? Możemy to uczynić na 3 sposoby:

  • metoda Navigate
  • użyć HyperLink’ów
  • użyć dziennika (Journal)

Navigate

Aby użyć metody navigate możemy po prostu zawołać ją podająć Uri strony, którą chcemy załadować, bądź już stworzony obiekt strony.

NavigationService.Navigate(new Uri(“Page1.xaml”));

var page = new Page1();

NavigationService.Navigate(page);

W przypadku Uri może to być zarówno plik XAML jak i strona HTML. Jako ciekawostkę – ten sam efekt można uzyskać za pomocą właściwości Content lub Source na obikcie NavigationService.

HyperLink’i

Za dużo filozofii w tym przypadku nie ma. Wystarczy napisać:

<Hyperlink NavigateUri=”Page1.xaml”>LinkHyperlink>

Hyperlinki mogą linkować oczywiście do stron HTML. Niestety w drugą stronę nie jest to możliwe. Dodatkowo Hyperlinki wspierają zaawansowanie linkowanie tak jak tag A, czyli możemy linkować bezpośrednio do konkretnego Frame’a (ustawiając TargetName na linku) bądź dodajać # i linkując bezpośrednio do konkretnego elementu w Frame o takiej właśnie nazwie.

Dziennik (Journal)

Dziennik służy do pamiętania historii odwiedzonych stron. Dostęp do niego mają oba kontenery (NavigationWindow oraz Frame), jednak Frame nie musi go mieć zawsze i uzależnione jest to od stanu JournalOwnership. Możliwe wartości to:

  • OwnsJournal – Frame ma swój dziennik
  • UsesParentJournal – historia zapisywana jest w rodzicu lub nie jeśli rodzic nie posiada dziennika
  • Automatic – domyślnie. Jeśli jest to NavigationWindow to używa trybu UwnsJournal, jeśli Frame to UsesParentJournal

Dodatkowo należy pamiętać, że nawigacja pomiędzy stronami za pomocą Uri zawsze tworzy nową instancję strony, nawet jeśli już ją daną stronę odwiedzaliśmy, dlatego pamiętanie stanu strony leży w naszej odpowiedzialności. W przypadku używania dziennika można wymusić użycie starej instancji poprzez ustawienie JournalEntry.KeepAlive na true.

<Page x:Class=”WpfExamDemo.Page1″

  xmlns=”http://schemas.microsoft.com/winfx/2006/xaml/presentation”

  xmlns:x=”http://schemas.microsoft.com/winfx/2006/xaml”

  Title=”Page1″ JournalEntry.KeepAlive=”True”>

Navigation events

Niezależnie od sposobu przejścia pomiędzy stronami (oczywiście wykluczająć przechodzenia pomiędzy linkami w stronach HTML) odbywa się to asynchronicznie i parę eventów. Dokładnie rozrysowane jest to na schemacie. Brakuje tylko na nim jakie

Tym razem temat rozbiłem na dwie części. Następnym razem o przenoszeniu danych pomiędzy stronami i PageFunctions – odcinek 4.5.