День #8. Изолированное хранилище

Posted on Ноябрь 22, 2010

2


Привет всем!

Это восьмая статья из цикла Windows Phone 7 для начинающих. Не так давно мы с вами говорили о том, как сохранять и передавать данные между страницами и сущностями. Одним из способов хранения данных является Isolated Storage.

Немного теории

Каждое Windows Phone 7 приложение имеет доступ к внутреннему хранилищу данных. Для каждого приложения, это хранилище свое. Мы можем складывать в это хранилище все, что душа пожелает! Есть два типа: IsolatedStorageFile и IsolatedStorageSettings, назначение которого хранить настройки программы. Остановимся на нем немного подробнее.
У приложения есть 4 очень важных и полезных события:

<shell:PhoneApplicationService
Launching="Application_Launching" Closing="Application_Closing"
Activated="Application_Activated" Deactivated="Application_Deactivated"/>

Событие Launching происходит когда приложение запускается со стартового(далее главного) экрана, Activated происходит когда мы воскрешаем наше приложение, т.е. когда приложение восстанавливает свою работу после выхода из него через кнопку Старт, Closing происходит при обычном выходе из приложения, а Deactivating происходит при выходе из приложения с помощью кнопки Старт. Все это значит, что у нас есть минимум по две возможности сохранить и восстановить настройки приложения.

Важно помнить, что если вы загружаете настройки при запуске приложения, то вам следует загружать их и при воскрешении. То же самое и про сохранение настроек. Представьте себе приложение, которое позволяет вам читать книги. У него есть довольно много настроек цветов и шрифтов. И вот, пользователь, просидев 20 минут, наконец, настроил все, нажал сохранить и вышел из приложения с помощью кнопки Старт. Когда он возвращается в приложение, он видит, что все его труды были напрасны, потому что кто-то из разработчиков забыл сохранить настройки при деактивации приложения.

От теории к практике

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

	// Code to execute when the application is launching (eg, from Start)
		// This code will not execute when the application is reactivated
		private void Application_Launching(object sender, LaunchingEventArgs e)
		{
			LoadSettings();
		}

		// Code to execute when the application is activated (brought to foreground)
		// This code will not execute when the application is first launched
		private void Application_Activated(object sender, ActivatedEventArgs e)
		{
			LoadSettings();
		}

		// Code to execute when the application is deactivated (sent to background)
		// This code will not execute when the application is closing
		private void Application_Deactivated(object sender, DeactivatedEventArgs e)
		{
			SaveSettings();
		}

		// Code to execute when the application is closing (eg, user hit Back)
		// This code will not execute when the application is deactivated
		private void Application_Closing(object sender, ClosingEventArgs e)
		{
			SaveSettings();
		}

Теперь методы LoadSettings и SaveSettings работают с объектом IsolatedStorageSettings, который является словарем. Определим публичное свойство в App.xaml.cs: Ниже приведен код обоих методов и свойства:

/// <summary>
		/// Цвет
		/// </summary>
		public Brush BackgroundBrush { set; get; }

		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


namespace day_8_isolated_storage
{
	public partial class MainPage : PhoneApplicationPage
	{
		Random rand = new Random();
		int numTaps = 0;
		PhoneApplicationService appService = PhoneApplicationService.Current;
		public MainPage()
		{
			InitializeComponent();
			UpdatePageTitle(numTaps);
			// Access App class for isolated storage setting
			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(256), (byte)rand.Next(256), (byte)rand.Next(256)));
			ContentPanel.Background = brush;
			// Save to App class for isolated storage setting
			(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)
		{
			// Load numTaps
			if (appService.State.ContainsKey("numTaps"))
			{
				numTaps = (int)appService.State["numTaps"];
				UpdatePageTitle(numTaps);
			}
		}
	}
}

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

День #9. Application Bar.

Реклама