Невозможно пройти тесты, в окне с вопросами пусто |
Работа с данными, сохранение и загрузка параметров игры
32.2. Изолированное хранилище, хранение настроек
Мы уже работали с изолированным хранилищем (IsolatedStorage) в практической работе №13, используя для создания игр XNA. Напомним, что в изолированном хранилище мы можем сохранять файлы (мы занимались этим в XNA) и управлять ими. Кроме того, имеется специальная область хранилища (изолированное хранилище настроек), где можно хранить настройки приложения в словаре, содержащем ключи и значения.
В классе App содержатся обработчики событий жизненного цикла приложения – запуска, активации, деактивации и закрытия. Ориентироваться в сохранении и загрузке данных можно на эти события (при запуске и активации восстанавливать данные, при деактивации и закрытии – сохранять), но вполне возможно использовать для сохранения и загрузки какие-то другие события. Например, как это принято в современных играх, можно периодически сохранять состояние игры в процессе игры, можно предоставить пользователю интерфейс для самостоятельного сохранения игры и загрузки сохранённых игр и так далее.
Создадим новый проект, P25_2, на основе предыдущего. Состав страниц проекта и их визуальное оформление не изменилось, а вот код переработан. Он будет иметь следующие особенности. При запуске программа пытается восстановить данные пользователя (имя и количество набранных очков), которые были зафиксированы в предыдущем сеансе работы. При закрытии программы вышеуказанные данные сохраняются. При работе программы мы будем хранить эти данные в полях класса App, эти же поля будем сохранять, и их же будем восстанавливать при запуске приложения.
В листинге 32.4. приведен код класса App, который содержит команды для работы с изолированным хранилищем настроек. Для удобства в листинге (но не в коде класса) мы опустили те автоматически созданные механизмы класса, которые остаются в значении по умолчанию. Обратите внимание, для работы с изолированным хранилищем мы подключили пространство имен System.IO.IsolatedStorage.
using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Input; using System.Windows.Media; using System.Windows.Media.Animation; using System.Windows.Navigation; using System.Windows.Shapes; using Microsoft.Phone.Controls; using Microsoft.Phone.Shell; using System.IO.IsolatedStorage; namespace P25_2 { public partial class App : Application { public int Scores=0; public string Username=""; // Код для выполнения при запуске приложения (например, из меню "Пуск") // Этот код не будет выполняться при повторной активации приложения 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(); } void LoadSettings() { IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings; int scores; string username; if (settings.TryGetValue<int>("scores", out scores)) { Scores = scores; } if (settings.TryGetValue<string>("username", out username)) { Username = username; } } void SaveSettings() { IsolatedStorageSettings settings = IsolatedStorageSettings.ApplicationSettings; settings["scores"] = Scores; settings["username"] = Username; settings.Save(); } } }Листинг 32.4. Организация работы с изолированным хранилищем настроек в App.xaml.cs
У класса имеются два общедоступных поля, одно из них типа int, другое – string.
Мы создаем два метода, один, SaveSettings, используется для сохранения данных в изолированное хранилище настроек. Мы получаем хранилище настроек, после чего записываем в него наши данные с ключами "scores" и "username". Если такие ключи уже присутствуют в хранилище, данные будут перезаписаны, если нет (при первой записи) – они будут созданы. После записи в хранилище мы сохраняем изменения.
Второй метод – LoadSettings, выглядит сложнее. Здесь мы сначала проверяем, имеются ли в хранилище данные с нужными ключами. Если имеются – записываем то, что удалось прочитать, в переменные Scores и Username, соответственно.
Мы вызываем метод SaveSettings при деактивации и закрытии приложения, так как у нас нет гарантии того, что деактивированное приложение выйдет из фонового режима и будет после этого закрыто пользователем, поэтому сохранения данных лишь при закрытии приложения недостаточно.
Мы вызываем метод LoadSettings при запуске приложения или при его активации, то есть, при возвращении из фонового режима.