Вот базовый класс для приложений Windows Phone, который я использовал для хранения пользовательских настроек. Он включает в себя IsolatedStorageSettings и представляет собой слегка модифицированную версию класса SettingsStore, включенную в «Учебный пример для создания расширенных приложений Windows Phone — примеры кода» . Вот пример того, как использовать базовый класс (в приложении Windows Phone 8):
public class MySettingsStore : SettingsStore { public bool IsFirstAppStart { get { return this.GetValueOrDefault(true); } set { this.AddOrUpdateValue(value); } } public string FirstName { get { return this.GetValueOrDefault(""); } set { this.AddOrUpdateValue(value); } } }
Класс может использоваться для хранения более сложных объектов, если они сериализуемы:
[DataContract] public class User { [DataMember] public string Name { get; set; } } public class MySettingsStore : SettingsStore { public List<User> Users { get { return this.GetValueOrDefault(new List<User>()); } set { this.AddOrUpdateValue(value); } } }
Метод GetValueOrDefault принимает один параметр, и это значение по умолчанию, которое возвращается, если не найдено сохраненных настроек.
В вашем приложении вы можете сохранить настройки, используя следующий код:
var settingsStore = new MySettingsStore(); ... settingsStore.FirstName = this.FirstNameTextBox.Text;
И чтобы прочитать настройку (или значение по умолчанию):
var settingsStore = new MySettingsStore(); ... this.FirstNameTextBox.Text = settingsStore.FirstName;
Вот полный код для базового класса SettingsStore. Он использует CallerMemberName, чтобы автоматически вычесть ключ для настройки.
using System; using System.Collections.Generic; using System.IO.IsolatedStorage; using System.Runtime.CompilerServices; namespace Adafy.Infra { public class SettingsStore { private readonly IsolatedStorageSettings isolatedStore; public SettingsStore() { this.isolatedStore = IsolatedStorageSettings.ApplicationSettings; } protected void AddOrUpdateValue(object value, [CallerMemberName]string key = "key") { var valueChanged = false; lock (this) { try { if (value == null) { // Nothing to remove if (!this.isolatedStore.Contains(key)) return; this.isolatedStore.Remove(key); this.Save(); } // If the new value is different, set the new value. if (this.isolatedStore[key] != value) { this.isolatedStore[key] = value; valueChanged = true; } } catch (KeyNotFoundException) { this.isolatedStore.Add(key, value); valueChanged = true; } catch (ArgumentException) { this.isolatedStore.Add(key, value); valueChanged = true; } if (valueChanged) { this.Save(); } } } protected T GetValueOrDefault<T>(T defaultValue, [CallerMemberName]string key = "key") { lock (this) { T value; try { value = (T)this.isolatedStore[key]; } catch (KeyNotFoundException) { value = defaultValue; } catch (ArgumentException) { value = defaultValue; } return value; } } private void Save() { try { this.isolatedStore.Save(); } catch (Exception) { return; } } } }
Настройки Store для Windows Phone 7
CallerMemberName недоступно в Windows Phone 7. По этой причине в каждой настройке должен быть указан уникальный ключ:
public class MySettingsStore : SettingsStore { private const string FirstAppStartKey = "MyKey"; private const string FirstNameKey = "MyKey2"; public bool IsFirstAppStart { get { return this.GetValueOrDefault(true, FirstAppStartKey); } set { this.AddOrUpdateValue(value, FirstAppStartKey); } } public string FirstName { get { return this.GetValueOrDefault("", FirstNameKey); } set { this.AddOrUpdateValue(value, FirstNameKey); } } }
Вот полный код WP7-версии SettingsStore, который практически идентичен тому, который представлен в Prism.
using System; using System.Collections.Generic; using System.IO.IsolatedStorage; using System.Runtime.CompilerServices; namespace Adafy.Infra { public class SettingsStore { private readonly IsolatedStorageSettings isolatedStore; public SettingsStore() { this.isolatedStore = IsolatedStorageSettings.ApplicationSettings; } protected void AddOrUpdateValue(object value, [CallerMemberName]string key = "key") { var valueChanged = false; lock (this) { try { if (value == null) { // Nothing to remove if (!this.isolatedStore.Contains(key)) return; this.isolatedStore.Remove(key); this.Save(); } // If the new value is different, set the new value. if (this.isolatedStore[key] != value) { this.isolatedStore[key] = value; valueChanged = true; } } catch (KeyNotFoundException) { this.isolatedStore.Add(key, value); valueChanged = true; } catch (ArgumentException) { this.isolatedStore.Add(key, value); valueChanged = true; } if (valueChanged) { this.Save(); } } } protected T GetValueOrDefault<T>(T defaultValue, [CallerMemberName]string key = "key") { lock (this) { T value; try { value = (T)this.isolatedStore[key]; } catch (KeyNotFoundException) { value = defaultValue; } catch (ArgumentException) { value = defaultValue; } return value; } } private void Save() { try { this.isolatedStore.Save(); } catch (Exception) { return; } } } }
Классы SettingsStore можно комбинировать с помощью условной компиляции.