Навигация в приложении
Показатели производительности полезны при отладке, если же речь идёт о копиях экрана, которые снимают для того, чтобы включить в материалы, необходимые для отправки приложения в Магазин (а иногда подобные копии экранов попадаются у приложений, опубликованных в Магазине), их нужно скрыть для того, чтобы не вводить пользователей в заблуждение относительно интерфейса программы.
В Листинге 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.
На ней размещена кнопка-гиперссылка для перехода на страницу сведений о программе. Как можно видеть из 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

