Объект Frame хранит историю навигации, благодаря чему поддерживает возврат на предыдущую страницу с помощью метода Frame.GoBack(), либо переход на следующую в истории переходов страницу посредством метода Frame.GoForward().
Для практики с историей навигации продолжим работу с проектом из прошлой темы и добавим в него новую страницу по типу Blank Page, которую назовем Page3 (либо создадим новый проект, в котором будут три страницы MainPage, Page2 и Page3).
Итак, пусть страница MainPage содержит кнопку:
<Button Content="Вперед" Click="Forward_Click" Margin="10" />
В коде обработчика нажатия кнопки пропишем следующий код:
private void Forward_Click(object sender, RoutedEventArgs e) { if (Frame.CanGoForward) Frame.GoForward(); else Frame.Navigate(typeof(Page2)); }
Таким образом, если в истории переходов уже есть страница, на которую переходили с MainPage (то есть свойство Frame.CanGoForward равно true), то сработает переход к этой странице с помощью Frame.GoForward(). Иначе произойдет переход к странице Page2.
На странице Page2 определим две кнопки:
<StackPanel> <TextBlock Text="Страница 2" FontSize="36" /> <Button Content="Вперед" Click="Forward_Click" Margin="10" /> <Button Content="Назад" Click="Back_Click" Margin="10" /> </StackPanel>
И определим в файле Page2.xaml.cs для них обработчики:
private void Back_Click(object sender, RoutedEventArgs e) { if (Frame.CanGoBack) Frame.GoBack(); } private void Forward_Click(object sender, RoutedEventArgs e) { if (Frame.CanGoForward) Frame.GoForward(); else Frame.Navigate(typeof(Page3)); }
На третьей странице Page3 определим одну кнопку:
<StackPanel> <TextBlock Text="Страница 3" FontSize="36" /> <Button Content="Назад" Click="Back_Click" Margin="10" /> </StackPanel>
И также добавим обработчик для этой кнопки в файл Page3.xaml.cs:
private void Back_Click(object sender, RoutedEventArgs e) { if (Frame.CanGoBack) Frame.GoBack(); }
И после этого мы сможем переходить от одной страницы к другой.
При переходе от одной страницы к другой с помощью метода Navigate() в специальный стек в объекте Frame поверх остальных добавляется информация о страницах. Этот стек мы можем получить с помощью свойства Frame.BackStack. Так, в нашем случае при цепи переходов MainPage->Page2->Page3, когда мы окажемся на странице Page, в этом стеке будут два объекта MainPage и Page2. Как и любой стек, Frame.BackStack работает по принципу LIFO. Поэтому при вызове метода Frame.GoBack() система извлекает из стека первую страницу и осуществляет к ней переход.
Мы можем вручную управлять стеком, например, изменим метод кнопки на странице Page3 таким образом, чтобы переход шел к самой первой странице в стеке:
private void Back_Click(object sender, RoutedEventArgs e) { List<PageStackEntry> pageEntries = Frame.BackStack.ToList(); if (pageEntries.Count > 0) Frame.Navigate(pageEntries[0].SourcePageType); }
Каждый объект в стеке представляет тип PageStackEntry, из которого мы можем получить данные о странице. То есть в данном случае переход будет идти обратно к MainPage, а не к Page2. Причем поскольку здесь используется метод Frame.Navigate(), а не Frame.GoBack(), то извлечения из стека информации о последней странице не будет. Наоборот, при переходе к MainPage в стек будет добавлена информация о странице Page3.