Навигация

Введение в навигацию

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

Рассмотрим, как устроена навигация в приложении Universal Windows Platform. Прежде всего надо отметить, что приложение UWP имеет одно единственное окно, которое представлено объектом Window. Окно содержит один единственный фрейм, который занимает все пространство окна. Фрейм представлен объектом Frame. А фрейм уже содержит страницы (представленные классом Page), которые, как правило, занимают все пространство фрейма. Таким образом, в один момент времени мы можем видеть только одну страницу. И как правило, под навигацией технически подразумевается переход от одной страницы к другой.

Для работы с навигацией создадим новый проект. Пусть он будет называться NavigationApp. По умолчанию новый стандартный проект уже содержит элементы навигации. Если мы посмотрим на содержимое файла App.xaml.cs, который у нас есть в проекте по умолчанию и который хранит класс приложения, то в методе OnLaunched() мы сможем увидеть такие строки:

Frame rootFrame = Window.Current.Content as Frame;

// проверяем наличие фрейма, если его нет, создаем
if (rootFrame == null)
{
    rootFrame = new Frame();

    rootFrame.NavigationFailed += OnNavigationFailed;

    if (e.PreviousExecutionState == ApplicationExecutionState.Terminated)
    {
        
    }
	
    // Помещаем фрейм в окно приложения
    Window.Current.Content = rootFrame;
}

if (rootFrame.Content == null)
{
    // Переход во фрейме к странице MainPage
    rootFrame.Navigate(typeof(MainPage), e.Arguments);
}

То есть вначале создается объект Frame и его размещение в окне приложения, а потом происходит переход к главной странице приложения, которая представлена классом MainPage с помощью метода Navigate().

Хотя в принципе мы можем обойтись без фрейма, напрямую загружая страницы в объект Window, однако фрейм упрощает навигацию, предоставляя специальные методы, а также хранит историю навигации.

Теперь рассмотрим, как мы можем сделать навигацию между несколькими страницами. Для этого добавим в проект новую страницу по типу Blank Page. Назовем ее Page2:

Добавление новой страницы в Universal WIndows Platform Постраничная навигация в Universal WIndows Platform

Добавим в первую страницу MainPage заголовок и кнопку для перехода:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel>
        <TextBlock Text="Страница 1" Style="{ThemeResource HeaderTextBlockStyle}" />
        <Button Content="Вперед" Click="Forward_Click" />
    </StackPanel>
</Grid>

И также добавим в файл MainPage.xaml.cs обработчик нажатия кнопки:

private void Forward_Click(object sender, RoutedEventArgs e)
{
    Frame.Navigate(typeof(Page2));
}

Для перехода к другой странице применяется метод Frame.Navigate(), в который передается тип объекта. В данном случае мы переходим на вторую страницу Page2.

Перегрузка метода Frame.Navigate() позволяет передать при переходе какой-то объект. Например, передадим строку:

private void Forward_Click(object sender, RoutedEventArgs e)
{
    Frame.Navigate(typeof(Page2), "переход из MainPage");
}

Теперь займемся страницей Page2. Любая страница, то есть любой объект Page имеет ряд методов, которые позволяют реагировать на события навигации:

  • OnNavigatedTo(NavigationEventArgs e): срабатывает, когда осуществляется переход на текущую страницу

  • OnNavigatedFrom(NavigationEventArgs e): срабатывает при завершении перехода с текущей страницы

  • OnNavigatingFrom(NavigatingCancelEventArgs e): срабатывает при начале перехода с текущей страницы

Таким образом, если нам надо выполнить какие-либо действия при переходе на/со страницы, то мы можем переопределить эти методы. Так как в данном случае мы передаем из главной страницы некоторый параметр, то мы можем переопределить метод OnNavigatedTo(), чтобы получить этот параметр и что-то с ним сделать.

Для этого определим в коде XAML на странице Page2 текстовый блок для вывода переданного параметра:

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
    <StackPanel>
        <TextBlock Text="Страница 2" FontSize="36" />
        <TextBlock x:Name="textBlock1" FontSize="24" TextWrapping="Wrap"/>
    </StackPanel>
</Grid>

И далее в файле кода Page2.xaml.cs определим следующий метод:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if (e.Parameter != null)
        textBlock1.Text = e.Parameter.ToString();
}

То есть объект e.Parameter - это тот объект, который передается во втором параметре метода Frame.Navigate(typeof(Page2), "переход из MainPage")

И при переходе с главной страницы в заголовок Page2 добавится переданное из MainPage сообщение:

Навигация в UWP

Нам необязательно передавать именно строку. Это может быть объект любого класса. Например, у нас есть следующий класс PageInfo:

class PageInfo
{
    public int Id { get; set; }
    public string Name { get; set; }
}

Тогда на странице MainPage мы можем передать объект этого класса так:

private void Forward_Click(object sender, RoutedEventArgs e)
{
    PageInfo pi = new PageInfo { Id = 1, Name = "MainPage" };
    Frame.Navigate(typeof(Page2), pi);
}

А на странице Page2 получаем переданные данные так:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    if(e.Parameter!=null)
    {
        PageInfo pi = (PageInfo)e.Parameter;
        textBlock1.Text = pi.Name;
    }    
}
Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850