Начало 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, и нет сообщений. Набираем новое и сохраняем.
После нажатия на Сохранить видим текстовое сообщение. После удачного сохранения вызывается инкремент счетчика, и приложение само закрывается.
Теперь запустим его снова. Все работает. Все обновляется.