Теперь рассмотрим общие способы работы с событиями жизненного цикла. Для этого создадим новый проект по типу Blank App. Назовем его, к примеру, LifecycleApp.
Проект по умолчанию содержит страницу MainPage, но нам он не понадобится. Для управления навигацией и ее историей нам нужны страницы по типу Basic Page, а не Blank Page. Итак, удалим файл MainPage.xaml и после этого добавим в проект новый элемент по типу Basic Page:
При добавлении элемента появится сообщение о том, что вместе с этим элементом надо добавить и некоторые другие связанные компоненты:
После этого, во-первых, будет добавлена новая страница Page1.xaml, которая будет уже иметь некоторое содержимое. Во-вторых, в проект также будет добавлена папка Commom с рядом файлов. В итоге структура проекта должна выглядеть так:
Сделаем довольно примитивное приложение, суть которого будет заключаться в сохранении и восстановлении данных текстового поля. Для этого изменим разметку xaml страницы Page1, добавив в нее элемент TextBox и убрав лишние элементы:
<Page x:Class="LifecycleApp.Page1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="using:LifecycleApp" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="d" Background="{ThemeResource ApplicationPageBackgroundThemeBrush}"> <Grid x:Name="LayoutRoot"> <TextBox x:Name="inputBox" TextChanged="inputBox_TextChanged" /> </Grid> </Page>
Первым делом, нам надо сохранить данные приложения, когда оно переходит в приостановленное состояние. Для управления данными приложения мы можем использовать объект Windows.Storage.ApplicationData. Данный объект поддерживает два варианта сохранения данных: через свойство RoamingSettings и через свойство LocalSettings.
RoamingSettings позволяет сохранять данные в каталоге, который синхронизирован с различными устройствами, например, в облачном хранилище. А свойство LocalSettings позволят сохранить данные на текущем устройстве. Для данной задачи мы используем LocalSettings.
Итак, добавим в файл отделенного кода Page1.xaml.cs следующий код обработчика изменения текста:
private void inputBox_TextChanged(object sender, TextChangedEventArgs e) { Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; localSettings.Values["userName"] = inputBox.Text; }
Таким образом, введенное значение будет сохраняться при каждом изменении текста в текстовом поле.
Теперь загрузим ранее сохраненное значение в текстовое поле. Для этого найдем в файле Page1.xaml.cs метод NavigationHelper_LoadState
:
private void NavigationHelper_LoadState(object sender, LoadStateEventArgs e) { }
И изменим его следующим образом:
private void NavigationHelper_LoadState(object sender, LoadStateEventArgs e) { Windows.Storage.ApplicationDataContainer localSettings = Windows.Storage.ApplicationData.Current.LocalSettings; if (localSettings.Values.ContainsKey("userName")) { inputBox.Text = localSettings.Values["userName"].ToString(); } }
Метод NavigationHelper_LoadState
является обработчиком события LoadState
класса NavigationHelper,
который находится в проекте в каталоге Common. Сам обработчик прикрепляется в конструкторе странице.
Теперь мы можем ввести некоторое значение в текстовое поле, приостановить приложение или полность закрыть и открыть его снова. И мы вновь увидим ранее введенное значение. Мы можем эмулировать завершение приложения в Visual Studio после запуска с помощью опции Suspend and shutdown: