История навигации

Последнее обновление: 13.02.2016

Объект Frame хранит историю навигации, благодаря чему поддерживает возврат на предыдущую страницу с помощью метода Frame.GoBack(), либо переход на следующую в истории переходов страницу посредством метода Frame.GoForward().

Для практики с историей навигации продолжим работу с проектом из прошлой темы и добавим в него новую страницу по типу Blank Page, которую назовем Page3 (либо создадим новый проект, в котором будут три страницы MainPage, Page2 и Page3).

Страницы в UWP

Итак, пусть страница 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();
}

И после этого мы сможем переходить от одной страницы к другой.

Навигация в UWP

При переходе от одной страницы к другой с помощью метода 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.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850