Главная » Разработка для Windows Phone 7 » Хранение данных вне экземпляров Windows Phone 7

0

Каждый раз MainPage переходит к новому экземпляру SecondPage. Именно поэтому SecondPage каждый раз запускается в исходном состоянии. Потому что это всегда новый экземпляр.

Если требуется, чтобы SecondPage «запоминал», по крайней мере, заданный цвет, необходимо каким-то образом реализовать внешнее хранение этих данных. Для этого подойдет MainPage.

Также данные состояния SecondPage могут храниться в изолированном хранилище. Хранение в изолированном хранилище во многом аналогично хранению на обычном дисковом накопителе. Для доступа к нему используются классы пространства имен System.IO.IsolatedStorage. Любое приложение Windows Phone 7 имеет доступ к изолированному хранилищу, но только к тем файлам, которое оно само создало. Изолированное хранилище позволяет приложению сохранять данные между выполнениями и идеально подходит для хранения параметров приложения.

Примеры изолированного хранилища будут представлены в данной главе несколько позже.

Третье решение обеспечивает класс PhoneApplicationService, описанный в пространстве имен Microsoft.Phone.Shell. Экземпляр PhoneApplicationService создается в стандартном файле App.xaml:

<Application.ApplicationLifetimeObjects>

<!–Обязательный объект, обрабатывающий события жизненного цикла приложения–> <shell:PhoneApplicationService

Launching="Application_Launching" Closing="Application_Closing" Activated="Application_Activated" Deactivated="Application_Deactivated"/> </Application.ApplicationLifetimeObjects>

За тегом PhoneApplicationService следуют четыре события, связанные с обработчиками. Примеры этих событий будут приведены в данной главе чуть ниже. Не создавайте новый PhoneApplicationService. Этот существующий экземпляр PhoneApplicationService можно получить посредством статического свойства PhoneApplicationService.Current.

PhoneApplicationService включает свойство State. Это словарь, который обеспечивает возможность сохранять и восстанавливать данные. Свойство State типа IDictionary<string, object>. Объекты сохраняются в словарь с помощью текстовых ключей. Эти данные хранятся только в ходе выполнения приложения, поэтому такой метод хранения не подходит для параметров приложения, которые должны сохраняться между запусками приложения. Данные, сохраняемые приложением только в ходе его выполнения, иногда называют «промежуточными» данными (transient data).

Любой объект, сохраняемый в словаре State, должен быть сериализуемым, т.е. таким объектом, который может быть преобразован в XML и вновь восстановлен из XML. Конструктор этого объекта должен быть открытым и без параметров. Все открытые свойства объекта должны быть либо сериализуемыми, либо таких типов, для которых существуют методы Parse для преобразования строк в объекты.

Не всегда очевидно, какие объекты являются сериализуемыми, а какие нет. Когда я только начинал экспериментировать, я попытался сохранить в словаре State объекты SolidColorBrush. Приложение сформировало исключение «Type ‘System.Windows.Media.Transform’ cannot be serialized»[8]. Мне потребовалось некоторое время, чтобы вспомнить, что у класса Brush есть свойство Transform (Преобразование) типа Transform, который является абстрактным классом. Вместо этого мне пришлось сериализовать Color.

Скорректируем предыдущее приложение так, чтобы SecondPage использовал свойство State. Проект SilverlightRetainData остается практически неизменным, только добавляется директива для пространства имен Microsoft.Phone.Shell и два перегруженных метода в SecondPage:

Проект Silverlight: SilverlightRetainData Файл: SecondPage.xaml.cs (фрагмент)

protected override void OnNavigatedFrom(NavigationEventArgs args) {

if (ContentPanel.Background is SolidColorBrush) {

Color clr = (ContentPanel.Background as SolidColorBrush).Color;

if (args.Content is MainPage)

(args.Content as MainPage).ReturnedColor = clr;

// Сохраняем значение цвета

PhoneApplicationService.Current.State["Color"] = clr;

}

base.OnNavigatedFrom(args);

}

protected override void OnNavigatedTo(NavigationEventArgs args) {

// Извлекаем значение цвета

if (PhoneApplicationService.Current.State.ContainsKey("Color")) {

Color clr = (Color)PhoneApplicationService.Current.State["Color"]; ContentPanel.Background = new SolidColorBrush(clr);

}

base.OnNavigatedTo(args);

}

Если время вызова метода OnNavigatedFrom имеется доступный действительный объект Color, он сохраняется в словаре State с ключом «Color»:

PhoneApplicationService.Current.State["Color"] = clr;

При выполнении перегруженного OnNavigatedTo, если ключ существует, значение Color загружается из словаря, и из Color формируется SolidColorBrush. Ключ не будет существовать, если приложение только что начало выполнение и переход на SecondPage выполняется впервые. Но при последующих переходах на SecondPage страница будет создаваться с использованием значения цвета, заданного при предыдущем ее посещении.

При каждом выходе из приложения через нажатие кнопки Back при открытой главной странице словарь State уничтожается вместе со всем PhoneApplicationService. Словарь State подходит только для хранения промежуточных данных, используемых приложением во время выполнения. Если требуется сохранять данные между запусками приложения, используйте изолированное хранилище.

Теперь попробуем такой сценарий. Перейдем к SecondPage. Коснемся экрана, чтобы изменить его цвет. Теперь нажмем кнопку телефона Start. Мы покинули приложение SilverlightRetainData и вернулись на стартовый экран телефона, с которого можно переходить к любым другим приложениям. Но если вдруг мы решим нажать кнопку телефона Back и вернуться к приложению SilverlightRetainData и его SecondPage, цвет остался неизменным с момента, когда мы вышли из приложения.

Теперь вернемся на MainPage. Цвет главной страницы аналогичен цвету SecondPage. Находясь на MainPage, нажмем кнопку телефона Start и покинем приложение. Можем немного «побродить» по другим приложениям, но после этого нажимаем кнопку Back необходимое число раз, чтобы вернуться к SilverlightRetainData и MainPage.

Вот чудеса! Экран изменил цвет! Что же произошло?

Источник: Чарльз Петзольд, Программируем Windows Phone 7, Microsoft Press, © 2011.

По теме:

  • Комментарии