Если вы уже пробовали пользоваться Windows 8 и приложениям из Windows Store, вы, возможно, заметили, что при запуске приложения со стартового экрана вы вернетесь именно к тому месту приложения, на котором вы его оставили. Именно такого результата мы и добьемся в нашем приложении для Windows Phone 8.
WMAppManifest.xml
Для начала, давайте откроем файл манифеста нашего приложения (кликнув по нему в Solution Explorer и выбрав View Source, в английской редакции Visual Studio). Все, что нам нужно сделать, это добавить в элемент DefaultTask атрибут под названием ActivationPolicy со значением Resume. Вот так:
<DefaultTask Name="_default" NavigationPage="MainPage.xaml" ActivationPolicy="Resume" />
По большому счету, этим изменением мы добились того, что наше приложение при перезапуске через стартовый экран/список приложений стало восстанавливаться к своему предыдущему состоянию плюс переходу на страницу, указанную в атрибуте NavigationPage элемента DefaultTask манифеста нашего приложения. Сразу после этого, история навигации нашего приложения выглядит вот так:
Это немного ускорило перезапуск за счет того, что система больше не очищает состояние и не запускает приложение с нуля. Но, мы идём дальше.
App.xaml.cs
Теперь мы должны отменить этот ненужный нам переход на главную страницу после перезапуска приложения. Для этого, нам нужно немножко отредактировать файл App.xaml.cs (можно заметить, что SDK почему-то не хочет работать так, как описано на MSDN, поэтому мы пойдем немного другим путём).
Для начала, давайте добавим приватное нестатическое поле типа System.Boolean в наш класс App и назовём его _reset.
private bool _reset;
Следующим шагом, нужно найти приватный метод InitializePhoneApplication (он автоматически создается шаблоном по-умолчанию) и настроить инициализацию RootFrame, определив наши обратотчики для событий Navigating и Navigated.
RootFrame.Navigating += RootFrame_Navigating; RootFrame.Navigated += RootFrame_Navigated;
Последним шагом будет модификация тел методов-обработчиков этих событий.
private void RootFrame_Navigating(object sender, NavigatingCancelEventArgs e) { if (_reset && e.IsCancelable && e.Uri.OriginalString == "/MainPage.xaml") { e.Cancel = true; reset = false; } } private void RootFrame_Navigated(object sender, NavigationEventArgs e) { _reset = e.NavigationMode == NavigationMode.Reset; }
И это всё, цель достигнута. Теперь, после возобновления приложения при его перезапуске, пользователь будет попадать именно туда, откуда он покинул это приложение.
Можно так же дополнительно поиграться и так же очистить историю кнопки Назад при возобновлении, сохранив состояние только текущей страницы. Для этого, в обработчике события Navigated можно добавить следующую строчку:
if (e.NavigationMode == NavigationMode.Reset) while (RootFrame.RemoveBackEntry() != null);
На этом всё, спасибо за внимание.
Примечание
В оригинальной статье отсутствовали некоторые моменты из официальной документации, которые я посчитал уместным добавить на суд читателей.
ссылка на оригинал статьи http://habrahabr.ru/post/157379/
Добавить комментарий