Статьи

Windows Phone 7 Навигация

Что интересно в платформе разработки для Windows Phone, так это то, что она основана на Silverlight, который, как известно большинству из нас, был прежде всего веб-технологией. Таким образом, Silverlight поддерживает навигационную модель, которая хорошо отображается в соответствии с тем, как работают браузеры, с возможностью перехода вперед на новые страницы и обратно на предыдущие страницы. В этом посте вы узнаете, как выполнять навигационные задачи в приложении Windows Phone.

Когда вы создаете новое приложение в Visual Studio или Expression Blend, ваш проект будет содержать ряд файлов, которые определяют базовое приложение Windows Phone, см. Рисунок 1. Есть два XAML-файла, которые содержат информацию о макете, App.xaml для ресурсов всего приложения и MainPage.xaml который определяет первую страницу в приложении.

WP7 Navigation Рисунок 1

фигура 1

Другие файлы, которые вы можете видеть, это ApplicationIcon.png , значок, который появляется рядом с именем приложения в списке приложений, Background.png , фон плитки запуска по умолчанию и SplashScreenImage.jpg , заставка, которая появляется при запуске приложения. За исключением изображения заставки (которое должно называться SplashScreenImage.jpg ), другие файлы можно настроить через диалоговое окно свойств проекта, см. Рисунок 2, доступ к которому можно получить, дважды щелкнув узел «Свойства» в обозревателе решений.

WP7 Navigation Рисунок 2

фигура 2

К сожалению, если вы хотите переименовать или изменить начальную страницу приложения, вы должны вручную отредактировать файл WMAppManifest.xml . Этот файл можно найти, развернув узел Свойства в окне обозревателя решений. Большую часть этого файла вы можете игнорировать, но часть, которую вам нужно изменить, это элемент DefaultTask :

 <Tasks> <DefaultTask Name ="_default" NavigationPage="MainPage.xaml"/> </Tasks> 

Если вы хотите изменить начальную страницу приложения, измените атрибут NavigationPage для DefaultTask . Например, следующее указывает SecondPage.xaml качестве SecondPage.xaml страницы:

 <DefaultTask Name ="_default" NavigationPage="SecondPage.xaml"/> 

В качестве альтернативы вы можете разместить свои страницы в одной или нескольких подпапках. Следующий MainPage.xaml находится в MainPage.xaml «Pages».

 <DefaultTask Name ="_default" NavigationPage="/Pages/MainPage.xaml"/> 

После запуска приложения вы захотите, чтобы пользователь мог перейти на следующую страницу приложения. Это можно сделать, вызвав метод Navigate либо непосредственно во фрейме приложения, либо через ссылку на NavigationService который можно найти в контексте текущей страницы. Хорошо, это может показаться странным, если вы не знакомы с навигационной моделью Silverlight. Модель на самом деле относительно проста: в приложении Windows Phone в качестве корневого визуального PhoneApplicationFrame размещается экземпляр класса PhoneApplicationFrame . Думайте об этом как о рамке приложения, в которую визуализируется все остальное. В большинстве случаев сам фрейм не имеет никаких визуальных характеристик, но в некоторых случаях вы можете переопределить поведение фрейма по умолчанию, чтобы определить переходы страниц или другие эффекты в приложении.

Фрейм отвечает за отображение первой страницы (класса, который наследуется от PhoneApplicationPage ) приложения и PhoneApplicationPage к последующим страницам. Во фрейме содержится экземпляр класса NavigationService который обрабатывает переход между страницами. Независимо от того, как вы запускаете навигацию в приложении Windows Phone, именно этот NavigationService обрабатывает переход с одной страницы на другую. Однако рекомендуется либо вызвать метод Navigate на фрейме, либо вызвать метод Navigate на NavigationService в рамках текущей страницы, как в следующих примерах кода:

Навигация по фрейму

 var frame = Application.Current.RootVisual as PhoneApplicationFrame; frame.Navigate(new Uri("/SecondPage.xaml", UriKind.Relative)); 

Навигация по странице

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

Как только вы перейдете вперед, в какой-то момент в будущем пользователь, вероятно, захочет вернуться в приложение. По умолчанию аппаратная кнопка «Назад» на устройстве будет перемещаться назад по страницам приложения. Находясь на первой странице приложения, повторное нажатие кнопки «Назад» приведет к закрытию приложения, открывая предыдущее приложение. Это два измерения «заднего стека» Windows Phone. Существует задний стек приложений, запущенных пользователем; в каждом приложении страниц, к которым пользователь перешел, есть задний стек.

Примечание . Хотя задний стек в приложении ограничен только доступной памятью устройства, в заднем стеке приложений может существовать ограничение в 5 приложений. Когда открывается шестое приложение, первое приложение навсегда удаляется из заднего стека.

В некоторых случаях вы можете захотеть перехватить, когда пользователь нажимает кнопку возврата. Например, если вы отобразили всплывающее окно, чтобы задать пользователю вопрос, вы можете перехватить кнопку «Назад», чтобы закрыть всплывающее окно. Следующий код (записанный в коде файла для страницы, например, MainPage.xaml.cs ) определяет, открыт ли всплывающий элемент управления. Если это так, обратная операция отменяется, а всплывающее окно закрывается.

 protected override void OnBackKeyPress (CancelEventArgs e){ base.OnBackKeyPress(e); if (this.ProceedPopup.IsOpen){ this.ProceedPopup.IsOpen = false; e.Cancel = true; } } 

Кроме того, в некоторых случаях вы захотите заставить пользователя вернуться на предыдущую страницу. В этом случае вы можете просто вызвать метод GoBack для экземпляра NavigationService (например, this.NavigationService.GoBack() в коде страницы за файлом). Важно отметить, что вы не можете закрыть первую страницу приложения. Это означает, что если пользователь в настоящее время находится на первой странице приложения, попытка вызвать метод GoBack вызовет исключение. Чтобы избежать возникновения исключения, вы всегда должны запрашивать свойство CanGoBack перед вызовом метода GoBack . Если вы посмотрите на доступные методы в NavigationService вы также увидите метод CanGoForward свойство CanGoForward . CanGoForward всегда будет возвращать false, а метод GoForward вызовет исключение. Это связано с тем, что после закрытия страницы при возврате на предыдущую страницу эта страница становится недоступной, что препятствует переходу к существующей странице. Чтобы перейти к новому экземпляру страницы, используйте метод Navigate .

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