Создание навигации

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

Создадим новый проект по типу Blank App и назовем его, например, NavigationApp.

Новый проект уже имеет по умолчанию одну страницу MainPage. Добавим еще пару страниц по типу Blank Page. Назовем их Page2 и Page3:

Navigation in Windows Phone 8.1

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

<Grid>
    <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. Определим на ней следующий код xaml:

<Grid>
    <StackPanel>
        <TextBlock x:Name="textBlock1" Text="Страница 2" FontSize="36" TextWrapping="Wrap"/>
        <Button Content="Вперед"  />
        <Button Content="Назад"  />
    </StackPanel>
</Grid>

Теперь перейдем к коду Page2.xaml.cs и вначале получим переданный из первой странице объект. В коде c# каждой страницы уже по умолчанию определен метод OnNavigatedTo(NavigationEventArgs e) и изменим его следующим образом:

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

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

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

Нам необязательно передавать именно строку. Это может быть объект любого класса. Например, у нас есть следующий класс 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;
    }    
}

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

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

Итак, пусть страница MainPage содержит кнопку:

<Button Content="Вперед" Click="Forward_Click" />

В коде обработчика нажатия кнопки пропишем следующий код:

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 определим две кнопки:

<Button Content="Вперед" Click="Forward_Click" />
<Button Content="Назад" Click="Back_Click" />

И определим в файле 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 определим одну кнопку:

<Button Content="Назад" Click="Back_Click" />

И также добавим обработчик для этой кнопки:

private void Back_Click(object sender, RoutedEventArgs e)
{
    if (Frame.CanGoBack)
        Frame.GoBack();
}
Навигация в Windows Phone 8.1

Таким образом, мы можем создать навигацию последовательно для нескольких страниц и переходить по ним.

Обработка кнопки Назад

По умолчанию, если мы попытаемся перейти из второй страницы на главную с помощью экранной кнопки Назад, то нас выбросит из приложения. Но мы можем обработать событие HardwareButtons.BackPressed, тем самым переопределив действие кнопки Назад в нашем приложении. Для этого определим у второй страницы конструктор и метод:

public Page2()
{
    this.InitializeComponent();
	// подключение обработчика для кнопки Назад
    HardwareButtons.BackPressed+=HardwareButtons_BackPressed;
}
private void HardwareButtons_BackPressed(object sender, BackPressedEventArgs e)
{
    Frame frame = Window.Current.Content as Frame;
    if (frame == null)
    {
        return;
    }

    if (frame.CanGoBack)
    {
        frame.GoBack();
        e.Handled = true;
    }
}

Если у нас в приложении есть история переходов, то осуществляем переход назад и после этого устанавливаем для свойства BackPressedEventArgs.Handled значение true

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