Начало Windows Phone 8 Development: урок 1. Макет приложения и обработчик событий
Начало Windows Phone 8 Development: урок 2. Доступ к локальному хранилищу приложения
Начало Windows Phone 8 Development: урок 3. Навигация по страницам и передача параметров
Начало Windows Phone 8 Development: урок 4. Связь с сервисами и привязка к данным
И так, приступим ко второму уроку. Надеюсь, он будет для Вас более интересным. Многим разработчикам под смартфоны интересен вопрос доступности хранилища на устройстве для их приложений, а так же его размеры и использование. Для каждого приложения существует своё изолированное локальное хранилище. Оно независимо от остальных приложений и ОС, и к нему имеет доступ только это приложение.
Сразу же встает два вопроса: возможность использовать SD карту и размер доступного пространства. На первый вопрос ответ — да, использовать SD карту можно. Ответ на второй вопрос — без ограничений. То есть все свободное пространство.
Что касается приложения, которое мы создадим в этом уроке, то оно будет использовать локальное хранилище для чтения/записи текстовых сообщений и счетчик. Счетчик будет увеличиваться при каждом запуске приложения, а так же будет показываться последнее, введенное Вами сообщение.

Как Вы уже заметили, используется два TextBlocks для вывода сообщений и счетчика, и один TextBox для ввода нового сообщения. Макет как всегда использует XAML и мой любимый StackPanel:

В этот раз для TextBlocks мы задали свойства Name, так как будем передавать содержимое в них извне. А теперь рассмотрим что происходит при загрузке страницы.
Перед добавлением логики, убедитесь, что добавлены необходимые пространства имен:

При загрузке страницы в первую очередь необходимо убедиться, что файл в котором хранится счетчик и сообщения существует. Если он существует, то считываем необходимые данные и передаем их в глобальную переменную. Если же файла нет, то записываем в счетчике «0», а в сообщениях «Пусто»( No messages..!) нового файла. Я буду использовать файл с именем LS.txt (сокращение от Local Storage).
Ну и естественно передам значения в TextBlocks заменяя символы “##” в строке на значения переменных, используя функцию string.Replace.

Если приложение закрывается при нажатии на кнопки Назад или Пуск, мы заменяем файл LS.txt новым, предварительно обновив данные на актуальные. Сначала увеличиваем счетчик, а потом записываем сообщение.

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

Запускаем нажатием на F5 и ждем загрузки. После загрузки видим счетчик показывает 0, и нет сообщений. Набираем новое и сохраняем.

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

Теперь запустим его снова. Все работает. Все обновляется.


Начало Windows Phone 8 Development: урок 2. Доступ к локальному хранилищу приложения
Начало Windows Phone 8 Development: урок 3. Навигация по страницам и передача параметров
Начало Windows Phone 8 Development: урок 4. Связь с сервисами и привязка к данным
И так, приступим ко второму уроку. Надеюсь, он будет для Вас более интересным. Многим разработчикам под смартфоны интересен вопрос доступности хранилища на устройстве для их приложений, а так же его размеры и использование. Для каждого приложения существует своё изолированное локальное хранилище. Оно независимо от остальных приложений и ОС, и к нему имеет доступ только это приложение.
Сразу же встает два вопроса: возможность использовать SD карту и размер доступного пространства. На первый вопрос ответ — да, использовать SD карту можно. Ответ на второй вопрос — без ограничений. То есть все свободное пространство.
Что касается приложения, которое мы создадим в этом уроке, то оно будет использовать локальное хранилище для чтения/записи текстовых сообщений и счетчик. Счетчик будет увеличиваться при каждом запуске приложения, а так же будет показываться последнее, введенное Вами сообщение.
Внешний вид

Как Вы уже заметили, используется два TextBlocks для вывода сообщений и счетчика, и один TextBox для ввода нового сообщения. Макет как всегда использует XAML и мой любимый StackPanel:

Код
<!--contentPanel - place additional content here--> <StackPanel Grid.Row="1" Margin="12,0,12,0"> <TextBlock x:Nane="CounterBlock" HorizontalAlignment="Left" Padding="0,0,0,10" TextWrappings"Wrap" Text="You have accessed this page ## times." VerticalAlignment="Top"/> <TextBlock x:Nane="LastMessageBlock" HorizontalAlignment="Left" Padding="0,0,0,30" TextWrapping="Wrap" Text="Your last message was: ##." VerticalAlignment="Top"/> <TextBox Height="72" x:Name="NewMessage" TextWrapping="Wrap"/> <Button content="save New Message" x:Name="SaveNewMessage" /> </StackPanel>
В этот раз для TextBlocks мы задали свойства Name, так как будем передавать содержимое в них извне. А теперь рассмотрим что происходит при загрузке страницы.
Загрузка страницы
Перед добавлением логики, убедитесь, что добавлены необходимые пространства имен:

Код
using System.I0.IsolatedStorage; using System.I0; namespace Lesson2 { ....
При загрузке страницы в первую очередь необходимо убедиться, что файл в котором хранится счетчик и сообщения существует. Если он существует, то считываем необходимые данные и передаем их в глобальную переменную. Если же файла нет, то записываем в счетчике «0», а в сообщениях «Пусто»( No messages..!) нового файла. Я буду использовать файл с именем LS.txt (сокращение от Local Storage).
Ну и естественно передам значения в TextBlocks заменяя символы “##” в строке на значения переменных, используя функцию string.Replace.

Код
private int counter; private string message; private void PhoneApplicationPage_Loaded_1(object sender, RoutedEventArgs e) { using (var appStorage = IsolatedStorageFile.GetUserStoreForApplication()) { if (appStorage.FileExists("LS.txt")) { using (var file = appStorage.OpenFile("LS.txt", FileMode.Open)) { using (var reader = new StreamReader(file)) { counter = int.Parse(reader.ReadLine()); message = reader.ReadLine(); } } } else { using (var file = appStorage.OpenFile("LS.txt", FileMode.Create)) { using (var writer = new StreamWriter(file)) { writer.WriteLine("0"); writer.WriteLine("No messages..!"); } } } } CounterBlock.Text=CounterBlock.Text.Replace("##",counter.ToString()); LastMessageBlock.Text = LastMessageBlock.Text.Replace("##", message); }
Действия при закрытии приложения
Если приложение закрывается при нажатии на кнопки Назад или Пуск, мы заменяем файл LS.txt новым, предварительно обновив данные на актуальные. Сначала увеличиваем счетчик, а потом записываем сообщение.

Код
protected override void OnNavigatedFrom(System.Windows.Navigation.NavigationEventArgs e) { base.OnNavigatedFrom(e); using (var appStorage = IsolatedStorageFile.GetUserStoreForApplication()) { using (var file = appStorage.OpenFile("LS.txt", FileMode.Create)) { using (var writer = new StreamWriter(file)) { writer.WriteLine((counter+1).ToString(); writer.WriteLine(message); } } } }
Ну и в конце всего необходимо сохранить новое сообщение и выйти из приложения, вызвав событие OnNavigatedFrom.
Сохранение нового сообщения
Передаем содержимое TextBox в переменную, и выводим пользователю текстовое сообщение про удачное сохранение.

Код
private void SaveNewMessage_Click(object sender, RoutedEventArgs e) { message = NewMessage.Text; MessageBox.Show("Changes saved successfully"); }
Тестируем
Запускаем нажатием на F5 и ждем загрузки. После загрузки видим счетчик показывает 0, и нет сообщений. Набираем новое и сохраняем.

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

Теперь запустим его снова. Все работает. Все обновляется.

