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