45 дней с Windows Phone 7. День #3. Аппаратная кнопка «Назад».
<< День #2. Навигация между страницами. | День #4. Ориентация экрана>>
Это третья статья серии «45 дней с Windows Phone 7».
Вчера мы говорили о навигации между страницами в Windows Phone 7 Silverlight приложениях и о том, как мы можем использовать класс NavigationService для перехода на другую страницу из C# кода. Аппаратная кнопка «Назад» (Back) на телефоне была кратко упомянута, так как она просто работает, и для её работы в стандартном режиме нам ничего делать не требовалось. Однако данная тема заслуживает отдельного поста, так как мы можем обработать нажатие и переопределить то, что делает кнопка «Назад».

Как работает кнопка «Назад»
Данная кнопка работает практически также как аналогичная кнопка в браузере. Телефон записывает историю перемещений, и Вы можете перейти назад по этой истории. Кроме того, как и в браузере, когда при переходах назад Вы можете посетить несколько различных сайтов, на которых были до этого, в телефоне кнопка «Назад» работает для нескольких приложений и интерфейса самого телефона. То есть история переходов не привязана к конкретному запущенному приложению.
Для примера:
- Откроем Internet Explorer.
- Перейдём на какой-либо сайт.
- Нажмём на кнопку «Start»
- Откроем настройки телефона.
- Ещё раз нажмём на «Start».
- Запустим наше приложение, созданное в предыдущей статье.
Теперь нажимая несколько раз кнопку «Назад» мы можем увидеть всё, с чем мы работали в обратном порядке.
Переопределение функциональности кнопки «Назад»
Как Вы могли заметить, в случае с Internet Explorer кнопка «назад» обрабатывается приложением и переводит нас на предыдущую посещённую страницу в браузере. Мы можем обработать нажатие данной кнопки и переопределить то, что после него происходит также и в своих приложениях. Но нельзя забывать об ответственности. Не стоит вводить пользователя в заблуждение непредсказуемой функциональностью.
Например, если Вы показываете на странице всплывающее сообщение, пользователь инстинктивно может нажать «назад», чтобы данное сообщение закрыть. В этом случае стоит обработать такое нажатие, чтобы закрывалось не всё ваше приложение, как в случае с необработанным нажатием, а только всплывающее сообщение.
Или в случае с игрой, может иметь смысл использовать кнопку «назад» для паузы в игре.
Есть несколько правил обработки нажатия кнопки «назад»:
- Нажатие кнопки должно означать для пользователя возвращение в состояние предшествующее текущему.
- Если пользователь нажимает кнопку «назад» второй раз подряд, следует совершить стандартное действие.
- Использование кнопки «назад» для паузы в игре является прекрасной идеей, но если пользователь нажимает данную кнопку второй раз, значит, он действительно хочет перейти назад, а не поставить игру на паузу. Разрешите ему сделать это.
Откроем пример из предыдущей статьи и на странице Pasta.xaml подпишемся на нажатие кнопки «Назад». Это событие страницы (элемент управления PhoneApplicationPage), поэтому в XAML коде подпишемся на него:
<phone:PhoneApplicationPage BackKeyPress="PhoneApplicationPage_BackKeyPress" …
А в C# коде обработаем:
private void PhoneApplicationPage_BackKeyPress(object sender, CancelEventArgs e)
{
if (MessageBox.Show
("Вы действительно хотите перейти назад?",
"Переход назад",
MessageBoxButton.OKCancel) == MessageBoxResult.Cancel)
{
e.Cancel = true;
}
}
В данном примере при нажатии кнопки «назад» выскакивает сообщение с просьбой подтвердить данное действие. Если пользователь нажимает кнопку «Cancel» переход назад не происходит.
Запустите приложение и проверьте его работу.
Завтра мы рассмотрим вопросы ориентации телефона, а именно портретный и ландшафтный режимы.
А есть ли возможность покрасить значок WindowsPhoneApplication в цвет текущей темы?
А каким образом можно настроить такую же реакцию на остальные кнопки?
Замечательная серия статей! Содержательно и вместе с тем не утомляет большим объемом информации. Спасибо Вам большое за Ваш труд! Буду ждать продолжения.
Здраствуйте, только начал разбираться с c# вообще. Сам c# у меня выдает ошибку на CancelEventArgs, потребовалось добавить using System.ComponentModel.