Windows Phone 8 принесла такую замечательную возможность, как быстрое возобновление состояния приложения после его перезапуска из списка приложений или через плитку начального экрана с полным сохранением состояния и истории навигации внутри приложения (для возможности последующей навигации используя кнопку Назад так, как если бы приложение никуда и не сворачивалось).
Если вы уже пробовали пользоваться Windows 8 и приложениями из Windows Store, вы, возможно, заметили, что при запуске приложения со стартового экрана вы вернетесь именно к тому месту приложения, на котором вы его оставили. Именно такого результата мы и добьемся в нашем приложении дляWindows Phone 8 .
Итак, начнем.
Для начала, давайте откроем файл манифеста нашего приложения (кликнув по нему в Solution Explorer и выбрав View Source, в английской редакции Visual Studio). Все, что нам нужно сделать, это добавить в элемент DefaultTask атрибут под названием ActivationPolicy со значением Resume. Вот так:
По большому счету, этим изменением мы добились того, что наше приложение при перезапуске через стартовый экран/список приложений стало восстанавливаться к своему предыдущему состоянию плюс переходу на страницу, указанную в атрибуте NavigationPage элемента DefaultTask манифеста нашего приложения. Сразу после этого, история навигации нашего приложения выглядит вот так:
Это немного ускорило перезапуск за счет того, что система больше не очищает состояние и не запускает приложение с нуля. Но, мы идём дальше.
Теперь мы должны отменить этот ненужный нам переход на главную страницу после перезапуска приложения. Для этого, нам нужно немножко отредактировать файл App.xaml.cs (можно заметить, что SDK почему-то не хочет работать так, как описано на MSDN, поэтому мы пойдем немного другим путём).
Для начала, давайте добавим приватное нестатическое поле типа System.Boolean в наш класс App и назовём его _reset.
Следующим шагом, нужно найти приватный метод InitializePhoneApplication (он автоматически создается шаблоном по-умолчанию) и настроить инициализацию RootFrame, определив наши обратотчики для событий Navigating и Navigated.
Последним шагом будет модификация тел методов-обработчиков этих событий.
И это всё, цель достигнута. Теперь, после возобновления приложения при его перезапуске, пользователь будет попадать именно туда, откуда он покинул это приложение.
Буквально за считанные минуты мы сделали наше приложение гораздо более приятным в работе.
Можно так же дополнительно поиграться и, например, при возобновлении очищать историю кнопки Назад, сохранив при этом только состояние текущей страницы. Для этого в обработчике события Navigated необходимо добавить следующую строчку:
На этом всё, спасибо за внимание.
В оригинальной статье отсутствовали некоторые моменты из официальной документации, которые я посчитал уместным добавить на суд читателей.
Если вы уже пробовали пользоваться Windows 8 и приложениями из Windows Store, вы, возможно, заметили, что при запуске приложения со стартового экрана вы вернетесь именно к тому месту приложения, на котором вы его оставили. Именно такого результата мы и добьемся в нашем приложении для
Итак, начнем.
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);
На этом всё, спасибо за внимание.
Примечание
В оригинальной статье отсутствовали некоторые моменты из официальной документации, которые я посчитал уместным добавить на суд читателей.