Опубликован: 02.08.2013 | Доступ: свободный | Студентов: 465 / 15 | Длительность: 18:38:00
Специальности: Программист
Самостоятельная работа 4:

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

Показатели производительности полезны при отладке, если же речь идёт о копиях экрана, которые снимают для того, чтобы включить в материалы, необходимые для отправки приложения в Магазин (а иногда подобные копии экранов попадаются у приложений, опубликованных в Магазине), их нужно скрыть для того, чтобы не вводить пользователей в заблуждение относительно интерфейса программы.

В Листинге 17.1 приведен код страницы MainPage.xaml

<phone:PhoneApplicationPage
    x:Class="P4_1.MainPage"
    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="False">

    <!--LayoutRoot представляет корневую сетку, где размещается все содержимое страницы-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel содержит имя приложения и заголовок страницы-->
        <StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,28">
            <TextBlock Text="НАВИГАЦИЯ" Style="{StaticResource PhoneTextNormalStyle}" Margin="12,0"/>
            <TextBlock Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}" Text="вход"/>
        </StackPanel>

        <!--ContentPanel — поместите здесь дополнительное содержимое-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="10,0,14,0">
            <TextBlock HorizontalAlignment="Left" Margin="31,87,0,0" T
TextWrapping="Wrap" 
Text="Имя пользователя" VerticalAlignment="Top" Width="179"/>
            <Button x:Name="cmdEnter" Content="Вход" HorizontalAlignment="Left" Margin="31,221,0,0" 
VerticalAlignment="Top" Width="132" Click="cmdEnter_Click"/>
            <TextBox x:Name="txtLogin" HorizontalAlignment="Left" 
Height="73" Margin="24,115,0,0" 
Grid.Row="1" TextWrapping="Wrap" VerticalAlignment="Top" Width="425"/>
        </Grid>
       
    </Grid>
</phone:PhoneApplicationPage>
Листинг 17.1. Код страницы MainPage.xaml

На копии экрана, кроме того, видно, что при выводе этой страницы не отображается системная строка состояния, расположенная по умолчанию в верхней части экрана. Мы скрыли её благодаря следующей настройке: shell:SystemTray.IsVisible="False".

Как можно видеть из кода, по нажатию на кнопку cmdEnter выполняется вызов обработчика её события Click. Код файла MainPage.xaml.cs приведен в Листинге 17.2. Для организации навигации по страницам приложения используется объект System.Windows.Navigation.NavigationService (http://msdn.microsoft.com/en-us/library/windowsphone/develop/system.windows.navigation.navigationservice%28v=vs.105%29.aspx)

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

namespace P4_1
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Конструктор
        public MainPage()
        {
            InitializeComponent();

        }

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


        protected override void OnNavigatingFrom(NavigatingCancelEventArgs e)
        {
            base.OnNavigatingFrom(e);

            if (txtLogin.Text == "")
            {
               MessageBox.Show("Нужно ввести учетные данные");
               e.Cancel = true;
            }
            
        }
        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            NavigationService.RemoveBackEntry();
            base.OnNavigatedFrom(e);
        }
       
    }
}
Листинг 17.2. Код страницы MainPage.xaml.cs

Здесь мы используем обработчик события нажатия на кнопку для навигации к странице CommonPage.xaml. Затем мы обрабатываем событие OnNavigatingFrom. Оно вызывается до выполнения перехода, здесь мы можем, в частности, отменить переход. Мы проверяем, заполнено ли текстовое поле, если это не так – показываем пользователю соответствующее сообщение и отменяем навигацию. В противном случае никаких действий не предпринимаем. Если же поле заполнено, в обработчике OnNavigatingFrom мы не предпринимаем никаких действий, вызывается обработчик OnNavigatedFrom. На данном этапе стек навигации уже содержит запись о странице MainPage.xaml, при обычном ходе событий это позволит перейти со следующей страницы на данную. Нам нужно иное поведение системы, поэтому мы удаляем запись из журнала и пользователь видит страницу CommonPage.xaml, рис. 17.3.

Страница CommonPage.xaml

увеличить изображение
Рис. 17.3. Страница CommonPage.xaml

На ней размещена кнопка-гиперссылка для перехода на страницу сведений о программе. Как можно видеть из XAML-кода страницы (Листинг 17.3) настройка адреса для перехода при использовании кнопки-гиперссылки, производится непосредственно в разметке страницы, обработчик события нам здесь не нужен.

Кроме того, на странице используется панель приложения. Здесь имеется одна кнопка, изображение для которой находится в папке Images нашего проекта (рис. 17.4.).

Структура проекта после добавления изображения для элемента панели приложения

увеличить изображение
Рис. 17.4. Структура проекта после добавления изображения для элемента панели приложения

Здесь использовано стандартное изображение, набор таких изображений, которые присутствуют в поставке средств разработки, можно найти по адресу C:\Program Files (x86)\Microsoft SDKs\Windows Phone\v8.0\Icons. Причем, здесь имеется папки с готовыми изображениями Dark и Light. Значки, расположенные в первой из них, можно использовать и при установках светлой темы, и при установках тёмной темы на устройстве. Они представляют собой PNG-изображения с прозрачным фоном и изображениями, выполненными белым цветом. Такой же подход следует использовать при создании собственных значков для кнопок панели управления.

<phone:PhoneApplicationPage
    x:Class="P4_1.CommonPage"
    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"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    mc:Ignorable="d"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot представляет корневую сетку, где размещается все содержимое страницы-->
    <Grid x:Name="LayoutRoot" Background="Transparent">
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto"/>
            <RowDefinition Height="*"/>
        </Grid.RowDefinitions>

        <!--TitlePanel содержит имя приложения и заголовок страницы-->
        <StackPanel Grid.Row="0" Margin="12,17,0,28">
            <TextBlock Text="НАВИГАЦИЯ" Style="{StaticResource PhoneTextNormalStyle}"/>
            <TextBlock Text="страница" Margin="9,-7,0,0" Style="{StaticResource PhoneTextTitle1Style}"/>
        </StackPanel>

        <!--ContentPanel – поместите здесь дополнительное содержимое-->
        <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
            <HyperlinkButton Content="О программе" HorizontalAlignment="Left" Margin="140,192,0,0" 
VerticalAlignment="Top" NavigateUri="/About.xaml"/>
        </Grid>
    </Grid>
    <phone:PhoneApplicationPage.ApplicationBar>
        <shell:ApplicationBar IsVisible="True" IsMenuEnabled="True" Mode="Minimized">
            <shell:ApplicationBarIconButton IconUri="/Images/questionmark.png" 
Text="О программе" Click="ApplicationBarIconButton_Click"/>
            <shell:ApplicationBar.MenuItems>
                <shell:ApplicationBarMenuItem Text="Настройки" 
Click="ApplicationBarMenuItem_Click"/>
                <shell:ApplicationBarMenuItem Text="Команда меню"/>
            </shell:ApplicationBar.MenuItems>
        </shell:ApplicationBar>
    </phone:PhoneApplicationPage.ApplicationBar>
</phone:PhoneApplicationPage>
Листинг 17.3. Код страницы CommonPage.xaml