Главная » Разработка для Windows Phone 7 » Вопросы архитектуры приложений Windows Phone 7

0

Приложение на Silverlight для Windows Phone 7 включает несколько стандартных классов:

•                                   класс App, производный от Application;

•                                   экземпляр класса PhoneApplicationFrame;

•                                   и один или более классов, производных от PhoneApplicationPage.

Данная глава отчасти посвящена вот этим «и более» классам. Рассматриваемые до сих пор приложения включали всего один класс MainPage, наследуемый от PhoneApplicationPage. В более сложных приложениях возможно наличие нескольких страниц, по которым пользователь может перемещаться, во многом аналогично навигации по Веб-страницам.

Может показаться, что навигация – это лишь дополнительный аспект программирования на Silverlight, применимый только к написанию приложений на Silverlight и не имеющий отношения к XNA. Но навигация напрямую связана с очень важными для приложений Windows Phone 7 вопросами захоронения (tombstoning). Захоронение приложения Windows Phone 7 происходит, когда пользователь переходит к другому приложению через стартовый экран телефона. Это касается и приложений на XNA.

Реализация простейшей навигации

Проект SilverlightSimpleNavigation начинается как обычно, с класса MainPage. Также, как обычно, описываем два элемента TextBlock для заголовков:

Проект Silverlight: SilverlightSimpleNavigation Файл: MainPage.xaml (фрагмент)

<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,2 8">

<TextBlock x:Name="ApplicationTitle" Text="SIMPLE NAVIGATION" … /> <TextBlock x:Name="PageTitle" Text="main page" … /> </ StackPanel>

Область содержимого MainPage.xaml включает только TextBlock, определяющий обработчик для своего события ManipulationStarted:

Проект Silverlight: SilverlightSimpleNavigation Файл: MainPage.xaml (фрагмент)

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <TextBlock Text="Navigate to 2nd Page" HorizontalAlignment="Center" VerticalAlignment="Center" Padding="0 34"

ManipulationStarted="OnTextBlockManipulationStarted" />

</Grid>

Обратите внимание на свойство Text этого TextBlock: «Navigate to 2nd page» (Перейти на вторую страницу). Файл выделенного кода включает обработчик ManipulationStarted и также перегрузку метода OnManipulationStarted для всей страницы:

Проект Silverlight: SilverlightSimpleNavigation Файл: MainPage.xaml.cs (фрагмент)

public partial class MainPage : PhoneApplicationPage {

Random rand = new Random();

public MainPage() {

InitializeComponent();

}

void OnTextBlockManipulationStarted(object sender, ManipulationStartedEventArgs

args) {

this.NavigationService.Navigate(new Uri("/SecondPage.xaml", UriKind.Relative));

args.Complete(); args.Handled = true;

}

protected override void OnManipulationStarted(ManipulationStartedEventArgs args) {

ContentPanel.Background = new SolidColorBrush( Color.FromArgb(255, (byte)rand.Next(255), (byte)rand.Next(255), (byte)rand.Next(255)));

base.OnManipulationStarted(args);

}

}

При касании страницы в любом месте вне TextBlock фон ContentPanel меняет цвет случайным образом. Когда касание происходит в области TextBlock, обработчик выполняет доступ к свойству NavigationService (Служба навигации) страницы. Это объект типа NavigationService, включающий свойства, методы и события, связанные с навигацией, в том числе и самый важный метод Navigate (Перейти):

this.NavigationService.Navigate(new Uri("/SecondPage.xaml", UriKind.Relative));

Аргументом этого метода является объект типа Uri. Обратите внимание на косую черту перед SecondPage.xaml и использование UriKind.Relative для обозначения URI относительно страницы MainPage.xaml.

Создаем вторую страницу в проекте SilverlightSimpleNavigation, щелкнув правой кнопкой мыши имя проекта в обозревателе проекта в Visual Studio и выбрав в меню Add и New Item. В диалоговом окне Add New Item (Добавить новый элемент) выберем Windows Phone Portrait Page (Страница Windows Phone в портретном режиме) и назовем ее SecondPage.xaml (Вторая страница).

В результате этой операции создается не только SecondPage.xaml, но и файл выделенного кода SecondPage.xaml.cs. Эти два файла SecondPage практически ничем не отличаются от файлов MainPage, создаваемых Visual Studio в обычном порядке. Как и MainPage, SecondPage наследуется от PhoneApplicationPage.

Имя приложения в SecondPage.xaml будет тем же, что и в FirstPage.xaml, но заголовок страницы – «second page» (вторая страница):

Проект Silverlight: SilverlightSimpleNavigation Файл: SecondPage.xaml (фрагмент)

<StackPanel x:Name="TitlePanel" Grid.Row="0" Margin="12,17,0,2 8">

<TextBlock x:Name="ApplicationTitle" Text="SIMPLE NAVIGATION" … /> <TextBlock x:Name="PageTitle" Text="second page" … /> </ StackPanel>

Область содержимого SecondPage.xaml практически аналогична MainPage.xaml, только в TextBlock отображается «Go Back to 1st Page» (Назад на первую страницу):

Проект Silverlight: SilverlightSimpleNavigation Файл: SecondPage.xaml (фрагмент)

<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0"> <TextBlock Text="Go Back to 1st Page"

HorizontalAlignment="Center" VerticalAlignment="Center" Padding="0 34"

ManipulationStarted="OnTextBlockManipulationStarted" />

</Grid>

Файл выделенного кода класса SecondPage также очень схож с классом FirstPage:

Проект Silverlight: SilverlightSimpleNavigation Файл: SecondPage.xaml.cs (фрагмент)

public partial class SecondPage : PhoneApplicationPage {

Random rand = new Random();

public SecondPage() {

InitializeComponent();

}

void OnTextBlockManipulationStarted(object sender, ManipulationStartedEventArgs

args) {

this.NavigationService.GoBack();

args.Complete(); args.Handled = true;

}

protected override void OnManipulationStarted(ManipulationStartedEventArgs args) {

ContentPanel.Background = new SolidColorBrush( Color.FromArgb(255, (byte)rand.Next(255), (byte)rand.Next(255), (byte)rand.Next(255)));

base.OnManipulationStarted(args);

}

}

Опять же, при касании в любой области экрана вне TextBlock фон меняет цвет случайным образом. Когда касание происходит в рамках TextBlock, обработчик вызывает другой метод NavigationService:

this.NavigationService.GoBack();

Этот вызов возвращает приложение на страницу, с которой был выполнен переход на SecondPage.xaml, в данном случае это MainPage.xaml. Еще раз посмотрим на вызов метода Navigate в MainPage.xaml.cs:

this.NavigationService.Navigate(new Uri("/SecondPage.xaml", UriKind.Relative));

В основе реализации навигации в приложении на Silverlight лежат XAML-файлы во многом аналогично тому, как в традиционной Веб-среде для этого используются HTML-файлы. Экземпляр класса SecondPage создается в фоновом режиме. Экземпляр PhoneApplicationFrame реализует в приложении практически все механизмы навигации, но открытый интерфейс PhoneApplicationFrame включает не экземпляры производных PhoneApplicationPage, а объекты Uri и XAML-файлы.

Можете коснуться экрана, чтобы изменить его цвет:

Запустим приложение. Выполнение начинается с главной страницы. Можно коснуться экрана, чтобы изменить его цвет:

Теперь коснемся TextBlock с надписью «Navigate to 2nd Page». На экран выводится вторая страница:

Теперь коснемся TextBlock с надписью «Go Back to 1st Page». (Или можно нажать кнопку Back телефона.) Это возвратит нас на главную страницу. Ее цвет остался неизменным с момента, когда мы покинули ее:

Теперь снова коснемся TextBlock, чтобы перейти на вторую страницу:

Фон черный. Вторая страница не сохраняет цвет, заданный ей при предыдущем нашем посещении. Абсолютно очевидно, что это совершенно новый экземпляр класса SecondPage.

Система навигации в Silverlight для Windows Phone строится на концепции стека – структуры данных с доступом по принципу «last-in-first-out[7]». В данной книге страницу, вызвавшую метод Navigate, я буду называть исходной страницей, и страницу, на которую выполняется переход – страницей перехода. После вызова Navigate исходная страница помещается в стек, и новый экземпляр страницы перехода создается и отображается. После вызова GoBack (Вернуться) (или нажатия кнопки Back телефона), текущая страница закрывается, из стека извлекается страница, помещенная туда последней, и выводится на экран.

В приложении на Silverlight кнопка Back телефона выполняет ту же функцию, что и вызов метода GoBack. Исключением является случай, когда вы находитесь на начальной странице приложения. Тогда по нажатию кнопки Back приложение прекращает выполнение.

Попробуем заменить вызов GoBack в SecondPage.xaml.cs следующим:

this.NavigationService.Navigate(new Uri("/MainPage.xaml", UriKind.Relative));

Это не то же самое, что вызов GoBack, и он не обеспечит возвращения к исходному экземпляру MainPage. В результате этого вызова SecondPage перейдет к новому экземпляру MainPage. Если продолжить нажимать TextBlock на каждой открывающейся странице, стек заполнится чередующимися экземплярами MainPage и SecondPage, каждый из которых может быть разного цвета. Чтобы закрыть все эти страницы и, в конце концов, завершить выполнение приложения, придется воспользоваться кнопкой Back телефона.

Navigate и GoBack – два основных метода NavigationService. Маловероятно, что в приложениях для телефона придется пользоваться чем-то сверх этого. Никогда нельзя забывать, что для телефона нет особого смысла реализовывать очень сложные схемы переходов в рамках приложения, а также необходимо обеспечивать пользователю некоторое средство отслеживания того, как он попал на текущую страницу и как вернуться назад.

Но, наверное, основным применением вторичных страниц в приложении на Silverlight для телефона является использование их в качестве диалоговых окон. Если приложению требуется получить некоторые данные от пользователя, оно переходит на новую страницу для сбора этих сведений. Пользователь вводит необходимые данные и возвращается к основной странице. Такой сценарий будет продемонстрирован в главе 10.

Источник: Чарльз Петзольд, Программируем Windows Phone 7, Microsoft Press, © 2011.

По теме:

  • Комментарии