.NET
Development for Windows Phone
C#
May 2013 20

Начало Windows Phone 8 Development: урок 2. Доступ к локальному хранилищу приложения

Original author: Bandar Alsharfi
Translation Tutorial
Начало Windows Phone 8 Development: урок 1. Макет приложения и обработчик событий
Начало Windows Phone 8 Development: урок 2. Доступ к локальному хранилищу приложения
Начало Windows Phone 8 Development: урок 3. Навигация по страницам и передача параметров
Начало Windows Phone 8 Development: урок 4. Связь с сервисами и привязка к данным

И так, приступим ко второму уроку. Надеюсь, он будет для Вас более интересным. Многим разработчикам под смартфоны интересен вопрос доступности хранилища на устройстве для их приложений, а так же его размеры и использование. Для каждого приложения существует своё изолированное локальное хранилище. Оно независимо от остальных приложений и ОС, и к нему имеет доступ только это приложение.

Сразу же встает два вопроса: возможность использовать SD карту и размер доступного пространства. На первый вопрос ответ — да, использовать SD карту можно. Ответ на второй вопрос — без ограничений. То есть все свободное пространство.

Что касается приложения, которое мы создадим в этом уроке, то оно будет использовать локальное хранилище для чтения/записи текстовых сообщений и счетчик. Счетчик будет увеличиваться при каждом запуске приложения, а так же будет показываться последнее, введенное Вами сообщение.

Внешний вид



image

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

image

Код
<!--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, так как будем передавать содержимое в них извне. А теперь рассмотрим что происходит при загрузке страницы.

Загрузка страницы



Перед добавлением логики, убедитесь, что добавлены необходимые пространства имен:

image

Код
using System.I0.IsolatedStorage;
using System.I0;
      namespace Lesson2 {
....



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

Ну и естественно передам значения в TextBlocks заменяя символы “##” в строке на значения переменных, используя функцию string.Replace.

image

Код
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 новым, предварительно обновив данные на актуальные. Сначала увеличиваем счетчик, а потом записываем сообщение.

image

Код
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 в переменную, и выводим пользователю текстовое сообщение про удачное сохранение.

image

Код
private void SaveNewMessage_Click(object sender, RoutedEventArgs e)
{
    message = NewMessage.Text;
    MessageBox.Show("Changes saved successfully");
}



Тестируем



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

image

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

image

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

image

image
+11
15.8k 78
Comments 6
Similar posts