Главная » Разработка для Windows Phone 7 » Изолированное хранилище Windows Phone 7

0

Для каждого приложения, установленного на устройстве Windows Phone 7, выделяется собственная постоянная область памяти на диске, которую называют изолированным хранилищем. Приложение работает с этой областью памяти с помощью классов пространства имен System.IO.IsolatedStorage. В изолированное хранилище могут помещаться и извлекаться целые файлы, и в приложении, завершающем данную главу, я покажу, как это делается. Сейчас же остановимся на специальном применении изолированного хранилища

для хранения параметров приложения. Для этой цели существует класс IsolatedStorageSettings (Параметры изолированного хранилища).

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

Объект PhoneApplicationService (такой же объект PhoneApplicationService использовался для хранения промежуточных данных) создается в файле App.xaml и задает обработчики для четырех событий:

<shell:PhoneApplicationService Launching="Application_Launching"

Closing="Application_Closing" Activated="Application_Activated" Deactivated="Application_Deactivated"/>

Событие Launching (Запуск) формируется при первом запуске приложения с экрана запуска. Событие Deactivated (Деактивирован) происходит при захоронении приложения. И событие Activated (Активирован) возникает при воскрешении приложения после захоронения. Событие Closing (Закрывается) формируется, когда приложение на самом деле завершается, возможно, по нажатию кнопки Back пользователем.

Итак, когда приложение запускается, возникает либо событие Launching, либо Activated (но никогда оба) в зависимости от того, было ли оно запущено с экрана запуска или восстановлено после захоронения. По завершении приложения формируется событие Deactivated или Closing в зависимости от того, произошло ли захоронение приложения или его действительное завершение.

Приложение должно загружать параметры приложения во время события Launching и сохранять их в ответ на событие Closing. Это очевидно. Но также параметры приложения должны сохраняться во время события Deactivated, потому что приложение не знает, будет ли оно когда-нибудь впоследствии восстановлено. При воскрешении приложение должно загрузить параметры приложения во время события Activated, потому что в противном случае оно не будет знать об этих настройках.

Вывод: параметры приложения должны загружаться во время событий Launching и Activated и сохраняться во время Deactivated и Closing.

Для приложения SilverlightIsolatedStorage я решил, что количество касаний должно сохраняться как промежуточные данные, т.е. как часть состояния страницы. Но цвет фона должен быть параметром приложения и быть общим для всех экземпляров.

В App.xaml.cs я описал следующее открытое свойство:

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

public partial class App : Application {

// Параметры приложения

public Brush BackgroundBrush { set; get; }

}

По-видимому, это может быть одним из многих параметров приложения, доступных во всем приложении.

App.xaml.cs уже имеет пустые обработчики событий для всех событий PhoneApplicationService. Для каждого обработчика описываем тело, состоящее из единственного вызова метода:

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

private void Application_Launching(object sender, LaunchingEventArgs e) LoadSettings();

private void Application_Activated(object sender, ActivatedEventArgs e) LoadSettings();

private void Application Deactivated(object sender, DeactivatedEventArgs e) SaveSettings();

private void Application_Closing(object sender, ClosingEventArgs e) SaveSettings();

Рассмотрим методы LoadSettings (Загрузить параметры) и SaveSettings (Сохранить параметры). Оба метода работают с объектом IsolatedStorageSettings. Как и свойство State класса PhoneApplicationService, объект IsolatedStorageSettings является словарем. Один метод загружает (и другой сохраняет) свойство Color свойства BackgroundBrush, используя для этого код, подобный рассмотренному нами ранее:

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

void LoadSettings() {

IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings; Color clr;

if (settings.TryGetValue<Color>("backgroundColor", out clr)) BackgroundBrush = new SolidColorBrush(clr);

}

void SaveSettings() {

IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings;

if (BackgroundBrush is SolidColorBrush) {

settings["backgroundColor"] = (BackgroundBrush as SolidColorBrush).Color; settings.Save();

}

}

И, наконец, рассмотрим новый файл MainPage.xaml.cs. Этот файл, и любой другой класс в приложении, может получить доступ к объекту App, приводя статическое свойство Application.Current к App. Конструктор MainPage получает значение свойства BackgroundBrush из класса App, и метод OnManipulationStarted задает это свойство BackgroundBrush.

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

public partial class MainPage : PhoneApplicationPage {

Random rand = new Random();

int numTaps = 0;

PhoneApplicationService appService = PhoneApplicationService.Current;

public MainPage() {

InitializeComponent(); UpdatePageTitle(numTaps);

// Выполняем доступ к классу App для получения параметров из изолированного хранилища

Brush brush = (Application.Current as App).BackgroundBrush;

if (brush != null)

ContentPanel.Background = brush;

}

protected override void OnManipulationStarted(ManipulationStartedEventArgs args) {

SolidColorBrush brush =

new SolidColorBrush(Color.FromArgb(255, (byte)rand.Next(25 6),

(byte) rand.Next (256), (byte)rand.Next(256)));

ContentPanel.Background = brush;

// Выполняем доступ к классу App для сохранения параметров в изолированном хранилище

(Application.Current as App).BackgroundBrush = brush; UpdatePageTitle(++numTaps); args.Complete();

base.OnManipulationStarted(args);

}

void UpdatePageTitle(int numTaps) {

PageTitle.Text = String.Format("{0} taps total", numTaps);

}

protected override void OnNavigatedFrom(NavigationEventArgs args) {

appService.State["numTaps"] = numTaps; base.OnNavigatedFrom(args);

}

protected override void OnNavigatedTo(NavigationEventArgs args) {

// Загружаем numTaps

if (appService.State.ContainsKey("numTaps")) {

numTaps = (int)appService.State["numTaps"]; UpdatePageTitle(numTaps);

}

}

}

Поскольку цвет фона был переведен из промежуточных данных страницы в параметры приложения, ссылки на него удалены из перегруженных методов OnNavigatedFrom и OnNavigatedTo.

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

По теме:

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