Главная » Разработка для Windows Phone 7 » Состояние страницы Windows Phone 7

0

Проект SilverlightFlawedTombstoning – это простое одностраничное приложение на Silverlight, которое отвечает на касания экрана изменением цвета фона ContentGrid случайным образом и выводит в заголовке страницы общее число касаний. Все самое интересное происходит в файле выделенного кода:

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

public partial class MainPage : PhoneApplicationPage {

Random rand = new Random(); int numTaps = 0;

public MainPage() {

InitializeComponent(); UpdatePageTitle(numTaps);

}

protected override void OnManipulationStarted(ManipulationStartedEventArgs args)

ContentPanel.Background =

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

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

UpdatePageTitle(++numTaps); args.Complete();

base.OnManipulationStarted(args);

}

void UpdatePageTitle(int numTaps) {

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

}

}

Небольшой метод UpdatePageTitle (Обновить заголовок страницы) вызывается из конструктора приложения (в результате чего на экран всегда выводится 0) и из перегруже нного OnManipulationStarted.

Выполняем сборку приложения и развертываем его на телефоне или эмуляторе телефона нажатием клавиши F5 (или выбирая Start Debugging в меню Debug). Настраиваем Visual Studio так, чтобы видеть окно Output (Вывод). Когда приложение запущено, несколько раз касаемся экрана, чтобы изменить цвет и увеличить счет касаний. Теперь нажимаем кнопку телефона Start. В Visual Studio можно увидеть, что два потока приложения завершены и приложение завершено, но фактически для телефона оно деактивировано и захоронено.

Теперь нажимаем кнопку Back, чтобы вернуться в приложение. Появится пустой экран со словом «Resuming…» (Возобновление…) и в Visual Studio будет выведено окно Output с загружаемыми библиотеками. Это приложение возвращается к жизни.

Однако когда приложение вновь появляется на экране, цвет и количество касаний утрачены. Все что нажито непосильным трудом! Все пропало! Не годится приложению так воскресать после захоронения. Данные состояния должны сохраняться. (Теперь можно понять, почему описанный после рассмотрения приложения SilverlightInsertData подходит не для всех случаев. В той схеме предполагается сохранение экземпляра SecondPage при переходе MainPage на эту страницу. Но если пользователь с SecondPage переходит на стартовую страницу и затем возвращается, он переходит не в тот экземпляр, который был сохранен FrontPage (Титульная страница), а в совершенно новый.)

Перегруженные методы OnNavigatedTo и OnNavigatedFrom класса Page, от которого наследуется PhoneApplicationPage, предоставляют замечательную возможность сохранять и повторно загружать данные состояния страницы. Эти методы вызываются, когда страница выводится на экран в результате загрузки рамкой, и когда страница выгружается из рамки.

Эти методы особенно удобны для многостраничных приложений на Silverlight. Каждый раз, когда пользователь переходит к странице, создается новый экземпляр PhoneApplicationPage. Чтобы обеспечить нормальные переходы со страницы на страницу, необходимо сохранять и повторно загружать данные ее состояния. Перегрузка OnNavigatedTo и OnNavigatedFrom эффективно решает две проблемы.

Windows Phone 7 перекладывает большую часть ответственности за восстановление приложения после захоронения на само приложение, но, тем не менее, при активации загружает нужную страницу. Поэтому, вероятно, страничным приложениям на Silverlight, сохраняющим и восстанавливающим данные состояния в свойстве State класса PhoneApplicationSerivce в ходе выполнения методов OnNavigatedTo и OnNavigatedFrom, не понадобится специально обрабатывать захоронение. Операционная система телефона

сохраняет значение этого свойства State пока приложение деактивировано и захоронено, но удаляет его, если приложение действительно закрывается и завершается.

Файл выделенного кода SilverlightBetterTombstoning включает директиву using для Microsoft.Phone.Shell и использует словарь State. Рассмотрим класс полностью:

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

public partial class MainPage : PhoneApplicationPage {

Random rand = new Random(); int numTaps = 0;

PhoneApplicationService appService = PhoneApplicationService.Current;

public MainPage() {

InitializeComponent(); UpdatePageTitle(numTaps);

}

protected override void OnManipulationStarted(ManipulationStartedEventArgs args) {

ContentPanel.Background =

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

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

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;

if (ContentPanel.Background is SolidColorBrush) {

appService.State["backgroundColor"] =

(ContentPanel.Background as SolidColorBrush).Color;

}

base.OnNavigatedFrom(args);

}

protected override void OnNavigatedTo(NavigationEventArgs args) {

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

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

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

}

// Загружаем цвет фона object obj;

if (appService.State.TryGetValue("backgroundColor", out obj)) ContentPanel.Background = new SolidColorBrush((Color)obj);

base.OnNavigatedTo(args);

Обратите внимание, полю appService присваивается PhoneApplicationService.Current. Это делается просто для удобства доступа к свойству State, но можно использовать и длинную ссылку PhoneApplicationService.Current.State.

Сохранить элементы в словарь State проще, чем извлечь их оттуда. Такое выражение:

appService.State["numTaps"] = numTaps;

обеспечивает замещение существующего элемента, если ключ «numTaps» существует, или добавляет новый элемент, если ключа нет. Сохранить цвет фона несколько сложнее. По умолчанию свойство Background объекта ContentPanel имеет значение null, поэтому перед попыткой сохранить свойство Color выполняется проверка того, что это значение не null.

Для извлечения элементов из словаря этот синтаксис не подойдет. В случае несуществования ключей будет сформировано исключение. (И эти ключи не будут существовать при запуске приложения.) Метод OnNavigatedTo представляет два разных стандартных способа доступа к элементам. В первом случае проверяется наличие ключа в словаре; во втором используется метод TryGetValue (Попытаться получить значение), который возвращает true, если ключ существует.

В реальном приложении, вероятно, в качестве ключей будут использоваться строковые переменные, что позволит избежать нечаянного введения несовместимых значений. (Если вы печатаете безупречно, не волнуйтесь о том, что множество идентичных строк заполонят хранилище: строки изолируются, и идентичные строки консолидируются в одну.) Также, скорее всего, для выполнения этих операций вы решите создать стандартные процедуры.

Попробуйте выполнить это приложение так же, как предыдущее: нажмите F5, чтобы развернуть его на телефоне или эмуляторе телефона из Visual Studio. Несколько раз коснитесь экрана. Нажмите кнопку Start, как будто хотите запустить новое приложение. Visual Studio сообщит о завершении процесса. Теперь нажимайте кнопку Back. Приложение возобновляет выполнение с сохраненными настройками, так что «труп» выглядит просто, как новенький!

Обратите внимание, что настройки сохраняются, когда происходит захоронение приложения (т.е. когда пользователь покидает приложение по кнопке Start и затем возвращается), но не когда новый экземпляр запускается из списка запуска. Такое поведения является правильным. Операционная система удаляет словарь State, когда приложение действительно завершается. Словарь State предназначен только для хранения промежуточных данных и не годится для данных, используемых другими экземплярами приложения.

Если определенные данные должны использоваться всеми экземплярами приложения, необходимо реализовать параметры приложения. Вы тоже можете это сделать.

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

По теме:

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