Создадим новый проект по типу Blank App и назовем его, например, NavigationApp.
Новый проект уже имеет по умолчанию одну страницу MainPage. Добавим еще пару страниц по типу Blank Page. Назовем их Page2 и Page3:
Добавим в первую страницу 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(); }
Таким образом, мы можем создать навигацию последовательно для нескольких страниц и переходить по ним.
По умолчанию, если мы попытаемся перейти из второй страницы на главную с помощью экранной кнопки Назад, то нас выбросит из приложения. Но мы можем обработать событие 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