Опубликован: 02.08.2013 | Уровень: для всех | Доступ: платный
Самостоятельная работа 4:

Навигация в приложении

Обратите внимание на то, что у панели приложения свойство Mode установлено в значение Minimized. Это приводит к тому, что панель занимает минимум места на экране, однако, для доступа к кнопкам её нужно развернуть. Какую именно панель использовать – стандартную или уменьшенную – можно решить, основываясь на необходимости постоянной доступности её кнопок. Кнопкам и командам меню панели можно назначать обработчики, они располагаются в коде страницы (Листинг 17.4.).

using System;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;

namespace P4_1
{
    public partial class CommonPage : PhoneApplicationPage
    {
        public CommonPage()
        {
            InitializeComponent();
        }

        private void ApplicationBarMenuItem_Click(object sender, EventArgs e)
        {
            NavigationService.Navigate(new Uri("/Pages/Settings.xaml", UriKind.Relative));
        }

        private void ApplicationBarIconButton_Click(object sender, EventArgs e)
        {
            NavigationService.Navigate(new Uri("/About.xaml", UriKind.Relative));
        }
    }
}
Листинг 17.4. Код страницы CommonPage.xaml.cs

Навигация с помощью элементов панели приложения ничем не отличается от навигации с помощью кнопок. Обратите внимание на обращение к странице, расположенной не в корневом разделе проекта, а в одном из подразделов. Путь к странице Settings.xaml (рис. 17.4.) указывается относительно корневого раздела: /Pages/Settings.xaml.

На странице Settings.xaml (Листинг 17.5) мы использовали элемент управления Pivot (создав её по соответствующему шаблону, хотя это не принципиально, можно добавить его на страницу самостоятельно), на одном из экранов которого расположена кнопка для "выхода из системы", то есть – в нашем случае для перехода на первую страницу приложения и очистки стека навигации.

<phone:PhoneApplicationPage
    x:Class="P4_1.Pages.Settings"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait"  Orientation="Portrait"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot представляет корневую сетку, где размещается все содержимое страницы-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <!--Элемент управления Pivot-->
        <phone:Pivot Title="НАВИГАЦИЯ">
            <!--Первый элемент Pivot-->
            <phone:PivotItem Header="цвет">
                <Grid/>
            </phone:PivotItem>

            <!--Второй элемент Pivot-->
            <phone:PivotItem Header="размер">
                <Grid/>
            </phone:PivotItem>

            <!--Третий элемент Pivot-->
            <phone:PivotItem Header="общие">
                <Button x:Name="cmdLogOut" Content="Выйти из системы" 
HorizontalAlignment="Left" Height="83" Margin="52,84,0,0" 
VerticalAlignment="Top" Width="259" Click="cmdLogOut_Click"/>
            </phone:PivotItem>
        </phone:Pivot>
    </Grid>
Листинг 17.5. Код страницы Settings.xaml

В файле кода страницы (Листинг 17.6) мы, обрабатывая событие кнопки cmdLogOut, выполняем переход на страницу MainPage.xaml и в событии OnNavigatedFrom очищаем стек. В нашем случае такой подход работает, однако, если бы мы инициировали переход с данной страницы на другие страницы, каждый раз при вызове события OnNavigatedFrom стек не нужно было бы очищать. Следовало бы проверять, на какую страницу осуществляется переход (например, воспользовавшись свойством CurrentSource объекта NavigationService), и очищать стек лишь при переходе на MainPage.xaml. В нашем случае это не нарушает логику приложения, в иных случаях нужно обратить на это внимание.

</phone:PhoneApplicationPage>

using System;
using System.Windows;
using System.Windows.Navigation;
using Microsoft.Phone.Controls;

namespace P4_1.Pages
{
    public partial class Settings : PhoneApplicationPage
    {
        public Settings()
        {
            InitializeComponent();
        }

        private void cmdLogOut_Click(object sender, RoutedEventArgs e)
        {
            NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));
        }

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            while (NavigationService.CanGoBack)
            {
                NavigationService.RemoveBackEntry();
            }
            base.OnNavigatedFrom(e);
        }
    }
}
Листинг 17.6. Код страницы Settings.xaml.cs

Выводы

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

Задание

Продумайте систему навигации по приложению, идею которого вы выработали после проведения предыдущего семинарского занятия. Подумайте над тем, нужна ли в вашем приложении панель приложения и если нужна – определите примерный состав её кнопок и команд. Создайте новый проект, добавьте в него страницы, которые будут содержаться в вашем приложении, при необходимости – настройте панели приложения и организуйте навигацию между ними в соответствии с особенностями приложения. Убедитесь в том, что навигация по приложению интуитивно понятна, предложите кому-нибудь поработать с системой навигации и оценить – не вызывает ли работа с ней затруднений.

Дополнительные материалы

К данной лекции подготовлено видеоприложение и демонстрационный программный проект.

Вася Пупкин
Вася Пупкин
Россия, с. Оймякон
антон Антонкин
антон Антонкин
Россия