s
Sesiya.ru

Системное программирование WindowsPhone 8

Информация о работе

Тема
Системное программирование WindowsPhone 8
Тип Курсовая работа
Предмет Программирование
Количество страниц 39
Язык работы Русский язык
Дата загрузки 2014-09-24 14:51:02
Размер файла 484.84 кб
Количество скачиваний 13
Скидка 15%

Поможем подготовить работу любой сложности

Заполнение заявки не обязывает Вас к заказу


Скачать файл с работой

Помогла работа? Поделись ссылкой

Белорусский национальный технический университет

Факультет информационных технологий и робототехники

Кафедра программного обеспечения вычислительной техники
и автоматизированных систем

КУРСОВОЙ ПРОЕКТ

по дисциплине «Системное программирование»
на тему: «WindowsPhone 8»




Исполнитель: студент ФИТР, 3 курс, гр. 107310

Руководитель проекта: доцент, к.т.н.



Минск - 2013
Белорусский национальный технический университет

Кафедра программного обеспечения вычислительной техники
и автоматизированных систем



ПОЯСНИТЕЛЬНАЯ ЗАПИСКА

к курсовому проекту

по дисциплине «Системное программирование»

на тему: «WindowsPhone 8»




Исполнитель:
Студент 3 курса 107310 группы

Руководитель:


Минск- 2013


СОДЕРЖАНИЕ
ВВЕДЕНИЕ 5
1 АНАЛИТИЧЕСКИЙ ОБЗОР СОСТОЯНИЯ ВОПРОСА 6
1.1 Информация о Windows Phone 6
1.3 Интерфейс Windows Phone 6
1.3 Эмулятор Windows Phone 7
1.4 Silverlight и XNA 9
1.4 Архитектура Windows Phone 8 9
2 ПОСТАНОВКА ЗАДАЧИ 10
3 ПРОЕКТИРОВАНИЕ 11
3.1 Интерфейс основного окна приложения 11
3.2 Получение данных о курсах валют 13
3.3 Хранение данных приложения 13
4 РЕАЛИЗАЦИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ 14
4.1 Логическая структура главного приложения 14
4.2 Физическая структура главного приложения 14
4.3 Работа с Isolated Storage 17
5 ТЕСТИРОВАНИЕ 20
ВЫВОДЫ 21
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 22
ПРИЛОЖЕНИЕ А 23
ПРИЛОЖЕНИЕ Б 28









ВВЕДЕНИЕ

Компания Microsoft известна как создатель операционной системы для мобильных устройств Windows Mobile. Внешне система напоминает интерфейс операционной системы Windows для настольных компьютеров, но ориентирована для использования в карманных компьютерах и смартфонах. Система выпускалась с середины 1990-х годов и развивалась в течение 20 лет.
Новая система для мобильных устройств получила название Windows Phone 7, или просто Windows Phone. Система использует некоторые преимущества Windows Mobile, но является полностью новой, с полностью новым интерфейсом, и использует иные подходы по сравнению с Windows Mobile. Система полностью ориентирована на использование в устройствах с сенсорным экраном и оптимизирована для пальце ориентированного ввода.
Устройства на платформе Windows Phone должны соответствовать определённым минимальным аппаратным требованиям. Результатом является тот факт, что одно и то же приложение должно работать одинаково на всех устройствах. Разработка приложений теперь имеет особенности, отличные от приложений для Windows Mobile, поэтому старые приложения не будут работать на новой платформе.
Одной из ключевых новинок является совершенно новый интерфейс, основанный на "Metro-стиле". Особенность этого подхода в том, что на первом месте стоит информация, а не её оформление. Все приложения для Windows Phone должны соответствовать Metro-стилю.
Все приложения для Windows Phone основаны на платформе .NET Framework, должны использовать технологию Silverlight или XNA и теперь могут быть легко портированы на другие платформы, например, настольные компьютеры или Xbox. Для разработки приложений используются бесплатные инструменты, которые входят в состав свободно распространяемого пакета Windows Phone SDK. Для того чтобы начать создавать приложения для Windows Phone, достаточно изучить некоторые основные принципы платформы и язык C#. Для опытных разработчиков переход на платформу Windows Phone не составит труда.
В первом разделе приведен обзор мобильной Windows Phone и средств разработки под эту ОС. Во втором разделе рассмотрена постановка задачи к курсовому проектированию. В третьем и четвёртом разделах рассмотрены основные моменты на этапах разработки и реализации программного обеспечения. В пятом разделе проведено тестирование работоспособности приложения. [1]

1 АНАЛИТИЧЕСКИЙ ОБЗОР СОСТОЯНИЯ ВОПРОСА

1.1 Информация о Windows Phone

Windows Phone — мобильная операционная система, разработанная Microsoft, вышла 11 октября 2010 года. 21 октября начались поставки первых устройств на базе новой платформы. В России телефоны с Windows Phone начали продаваться 16 сентября 2011 года, первым из которых стал HTC 7 Mozart.
Операционная система является преемником Windows Mobile , хотя и несовместима с ней [11], с полностью новым интерфейсом и впервые с интеграцией сервисов Microsoft: игрового Xbox Live и медиа плеера Zune. Презентация системы состоялась в рамках мероприятия Mobile World Congress 2010, прошедшего в Барселоне [2].

1.2 Интерфейс Windows Phone

Windows Phone поддерживает технологию мультитач и имеет новый пользовательский интерфейс под названием Metro, принципы которого были ранее использованы в дизайне интерфейса Windows Media Center, Zune и Xbox. Также в Windows Phone нашли отражение идеи платформы смартфонов Microsoft KIN.
Microsoft переработала начальный экран: здесь больше нет статичных иконок — все они заменены на так называемые «живые плитки» которые отражают информацию в режиме реального времени без участия пользователя. «Живые плитки» прокручиваются по вертикали и могут служить как обычным ярлыком для приложения, так и ярлыком для контакта, заметки, веб-страницы, медиа контента и прочего. Большинство «плиток» имеют квадратную форму, но наряду с ними интерфейс операционной системы содержит и прямоугольные (фото, календарь), пример интерфейса системы Windows Phone приведен на рисунке 1.2.1:
Одно из нововведений интерфейса — «хабы» (англ. hubs) или, как описано на официальном сайте, «разделы». Всего в системе предустановлено 6 таких разделов, но производители телефонов могут создавать свои, например, HTC Hub, соответственно от компании HTC. Раздел «Контакты» объединяет всю информацию, касающуюся какого-либо определенного человека, в том числе его записи и комментарии в социальных сетях, а также фотографии, предоставляя централизованный доступ к таким сетям, как Facebook, Twitter, LinkedIn и Windows Live [2].


Рисунок 1.2.1 – Интерфейс системы Windows Phone

С Windows Phone 8 в разделе «Контакты» появилась возможность создавать «комнаты»: список определённых контактов, которым доступна та или иная информация. Раздел «Фото» объединяет фотографии пользователя, хранящиеся в памяти устройства, на компьютере и в интернете. С помощью этого раздела можно опубликовать фотографию в социальных сетях, пометить на ней человека, а также иметь доступ к последним фотографиям от друзей. Раздел «Игры» открывает доступ к играм и сервису Xbox Live, где можно посмотреть свои или чужие профили, аватары, достижения. Раздел «Музыка + видео» объединяет весь мультимедийный контент, хранящийся на пользовательском компьютере, музыкальные онлайн-сервисы, встроенное FM-радио и открывает доступ к сервисам Xbox Music и Xbox Video. Раздел «Store» позволяет покупать или загружать бесплатно приложения и игры, а раздел Office обеспечивает доступ к мобильной версии Office — Office Mobile, включая Word, Excel, OneNote, PowerPoint. С помощью офисного пакета пользователь имеет возможность открыть, создать и редактировать документы, а затем синхронизировать сделанные изменения с настольным компьютером, используя сервис SkyDrive. [2]




1.3 Эмулятор Windows Phone

В состав среды проектирования Windows Phone входит эмулятор, который позволяет использовать функции Windows Phone прямо в настольной системе. Если у вас есть компьютер, который поддерживает мультисенсорный ввод, вы можете использовать эту функцию в эмуляторе для проверки правильности обработки мультисенсорных жестов в ваших программах для Windows Phone.
Эмулятор является программной копией устройства Windows Phone, которая ведёт себя как реальный телефон. При этом, программы, работающие в эмуляторе, используют мощность компьютера, которая может быть намного больше, чем у процессора телефона. Эмулятор Windows Phone имеет вид, представленный на рисунке 1.3.1:



Рисунок 1.3.1 – Эмулятор Windows Phone

Эмулятор позволяет проверить реакцию программ на перемещение и поворот "виртуального" телефона на экране компьютера. Также можно предварительно записать последовательность движений, что позволит выполнять повторные тесты, используя те же движения или жесты.
Также возможна эмуляция местоположения. Можно выбрать на карте желаемое "местоположение" эмулятора телефона. Также можно ввести пути для перемещения телефона и затем воспроизвести их — так можно создавать поездки для тестирования приложений для определения местоположения. [2]
1.4 Silverlight и XNA

Приложения для Windows Phone можно создавать на основе технологии Silverlight или XNA. Если вы создаёте приложение, например, текстовый процессор, почтовый клиент или калькулятор, то вы можете использовать Silverlight. Silverlight предоставляет набор средств для создания таких программ. Если вы создаёте игру, то можете использовать XNA. XNA предоставляет средства для создания 2D и 3D игр с высокой производительностью.
Можно и наоборот — создать калькулятор в XNA или простую игру (например, головоломки со словами) в Silverlight. В частности, Silverlight идеально подходит для игр с небольшими требованиями по графике, либо использующих векторную графику, а не растровую, либо скорость которых зависит от реакции пользователя, а не таймера. А XNA бывает сложно использовать в тех задачах, где обычно применяется Silverlight. Реализация окна списка на XNA может быть интересной для некоторых разработчиков, но для многих программистов это довольно сложная задача.
Тип создаваемого приложения выбирается при создании нового проекта в Visual Studio. Приложение может совместно использовать средства Silverlight и XNA. Можно создать программу на Silverlight со страницей, содержащей игру на XNA. Можно создать меню и пользовательский интерфейс для игры в Silverlight, а игровой процесс — в XNA. Также можно добавить элементы Silverlight поверх запущенной игры XNA [3].

1.5 Архитектура Windows Phone


Рисунок 1.5.1 – Архитектура Windows Phone 8
2 ПОСТАНОВКА ЗАДАЧИ

В данном курсовом проекте необходимо разработать приложение для Windows Phone, которое представляет собой конвертер валют.
Приложение предоставляет пользователю следующие возможности:
1. Получение последних данных о курсах валют;
2. Выбор валют для конвертации;
3. Ввод количества конвертируемой валюты;
4. Возможность обмена конвертируемых валют местами для быстрого выполнения обратного обмена.
При старте приложение должно отображать последние сохранённые выбранные валюты для обмена.























3 ПРОЕКТИРОВАНИЕ ПО

3.1 Интерфейс основного окна приложения

Главное окно представляет собой набор элементов управления для выбора конвертируемых валют, количества конвертируемой валюты и строки для вывода результата обмена. Главное окно приложения изображено на рисунке 3.1.1.



Рисунок 3.1.1 – Главное окно приложения

На рисунке под номером 1 показано поле вовода количества валюты при нажатии на который вызывается цифровая клавиатура для ввода в которой пользователь должен ввести количество валюты. Поля 2 и 3 предназначены для выбора валют из списка, выборе которого отобразится диалог список из перечня доступных валют, изображённый на рисунке 3.1.2.
По нажатию на клавишу обмена(пункт 5) приложение отправит запрос на получение данных о курсах валют вычилсит и выведетет название желаемой валюты и количество полученое после конвертации в пунт 4.



Рисунок 3.1.2 – Список выбора валюты.

При нажати на меню пункт 6 мы увидим пункты меню: Обмен конвертирумемых валют местами и обновление курсов. Меню продемонстрировано на рисунке 3.1.3.



Рисунок 3.1.2 – Дополнительное меню

3.2 Получение данных о курсах валют

Для получения данных в приложении был использован сервис MSN Money. MSN Money предоставляет очень хорошую страницу, на которой мы можем увидеть текущие обменные курсы валюты по отношению к доллару США либо других валют из перечня.
Получать данные о курсах валют можно с помощью регулярных выражений.

3.3 Хранение данных приложения

Для сохранения информации в приложениях для Windows Phone используется изолированное хранилище (Isolated Storage). Изолированное хранение позволяет управляемым приложениям сохранять и восстанавливать информацию из локального хранилища. Именно это хранилище и было использовано для хранения данных. При получении данных о курсах они кэшируются в Isolated Storage и при запуске приложения оффлайн данные берутся из него.[1]




Рисунок 3.3.1 – Схема Isolated Storage

4 РЕАЛИЗАЦИЯ ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ

4.1 Логическая структура приложения

Логическую структуру приложения можно описать следующим образом:
1. Пользователь запускает приложение;
2. Приложение проверяет Isolated Storage на наличие последних сохранённых данных;
3. Если данные в Isolated Storage присутствуют, то будет возможен обмен оффлайн по сохранённым данным ранее;
4. Если Isolated Storage пуст, то приложение проверяет наличие соединения с интернетом для отправки запроса к MSN Money для получение данных;
5. Если соединение с интернетом присутствует, то приложение отправляет запрос на получение данных, затем сохраняет полученные данные в базе данных и отображает на главном окне приложения;
6. Если соединение с интернетом отсутствует, то отображается диалог с предложением пользователю включить интернет.

4.2 Физическая структура приложения



Рисунок 4.2.1 – Solution Explorer



Описание содержимого проекта преведено в Приложении А.

Для определения пользовательского интерфейса приложений в Windows Phone используется XAML-разметка. Пример определения интерфейса с помощью XAML-разметки приведён ниже:
Панель Stack Panel служит контейнером(панелью) для группировки элементов
<StackPanel x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
Текстовый блок предназначен для вывода текстовой информаци
<TextBlock Margin="12,0,0,-5" Style="{StaticResource PhoneTextSubtleStyle}">Amount</TextBlock>

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

<TextBox InputScope="TelephoneNumber" Text="{Binding Amount, Mode=TwoWay, ValidatesOnExceptions=True, NotifyOnValidationError=True}" />
<TextBlock Margin="12,10,0,-5" Style="{StaticResource PhoneTextSubtleStyle}">From</TextBlock>

Контрол ListPicker предназначеный для вывода списка валют.

<toolkit:ListPicker ItemsSource="{Binding Currencies}" SelectedItem="{Binding FromCurrency, Mode=TwoWay}" FullModeHeader="FROM CURRENCY" Style="{StaticResource CurrencyListPicker}" />

<TextBlock Margin="12,10,0,-5" Style="{StaticResource PhoneTextSubtleStyle}">To</TextBlock>

<toolkit:ListPicker ItemsSource="{Binding Currencies}" SelectedItem="{Binding ToCurrency, Mode=TwoWay}" FullModeHeader="TO CURRENCY" Style="{StaticResource CurrencyListPicker}" />

Следующая панель содержит текстовые поля для вывода информации о результате конвертирования валют, названии и количества полученной валюты:
<StackPanel>
<TextBlock Style="{StaticResource PhoneTextGroupHeaderStyle}" Text="{Binding ExchangedCurrency}"></TextBlock>
<TextBlock Margin="25, 0, 0, 0" Style="{StaticResource PhoneTextTitle1Style}" Text="{Binding ExchangedAmount}"></TextBlock>
<TextBlock Style="{StaticResource PhoneTextSubtleStyle}" Text="{Binding ExchangedTimeStamp}" TextWrapping="Wrap" TextAlignment="Right"></TextBlock>
</StackPanel>
</StackPanel>

Выпадающее меню

<phone:PhoneApplicationPage.ApplicationBar>
Кнопка конвертации валют:

<shell:ApplicationBar IsVisible="True" IsMenuEnabled="True">
<shell:ApplicationBarIconButton IconUri="/Images/appbar.money.usd.png" Text="Exchange" Click="ExchangeIconButton_Click" />
<shell:ApplicationBar.MenuItems>


Кнопка обновления курсов:

<shell:ApplicationBarMenuItem Text="update exchange rates" Click="UpdateExchangeRatesMenuItem_Click" />
<shell:ApplicationBarMenuItem Text="about" Click="AboutMenuItem_Click" />
</shell:ApplicationBar.MenuItems>
</shell:ApplicationBar>
</phone:PhoneApplicationPage.ApplicationBar>








Результат приведённой выше разметки продемонстрирован на рисунке 4.2.1:




Рисунок 4.2.1 – Элементы интерфейса пользователя, описаной выше XAML-разметки

Для удобства разработки Microsoft в комплекте с Visual Studio предоставило средство разработки дизайна - Microsoft Expression Blend. Это средство обеспечивает удобную многофункциональную работу над созданием пользовательских интерфейсов. Пример определения пользовательского интерфейса с помощью Microsoft Expression Blend показан на рисунке 4.2.2.



Рисунок 4.2.2 – Разработка пользовательского интерфейса с помощью Blend

4.3 Работа с Isolated Storage

Для работы с Isolated Storage в приложении используется класс StorageHelper. Он отвечает за сохранение и чтение информации из базы данных:
public class StorageHelper
{

public static T LoadXml<T>(string fileName) where T : class, new()
{
return LoadContract<T>(fileName, false);
}
public static T LoadContract<T>(string fileName, bool useBinary) where T : class, new()
{
T loadedObject = null;

try
{
using (var storageFile = IsolatedStorageFile.GetUserStoreForApplication())
{
using (var stream = new IsolatedStorageFileStream(fileName, FileMode.OpenOrCreate, storageFile))
{
using (var reader = (useBinary
? XmlDictionaryReader.CreateBinaryReader(stream, XmlDictionaryReaderQuotas.Max)
: XmlReader.Create(stream)))
{
if (stream.Length > 0)
{
var serializer = new DataContractSerializer(typeof(T));
loadedObject = serializer.ReadObject(reader) as T;
}
}
stream.Close();
}
}
}
catch
{
MessageBox.Show("Sorry, but something went wrong and I cant retrieve your saved settings.");

if (IsolatedStorageFile.GetUserStoreForApplication().FileExists(fileName))
IsolatedStorageFile.GetUserStoreForApplication().DeleteFile(fileName);
}

return loadedObject ?? new T();
}

public static void SaveXml<T>(string fileName, T objectToSave)
{
SaveContract(fileName, objectToSave, false);
}

public static void SaveContract<T>(string fileName, T objectToSave, bool useBinary)
{
try
{
using (var storageFile = IsolatedStorageFile.GetUserStoreForApplication())
{
using (var stream = new IsolatedStorageFileStream(fileName, FileMode.Create, storageFile))
{
using (var writer =
(useBinary ? XmlDictionaryWriter.CreateBinaryWriter(stream) : XmlWriter.Create(stream)))
{
var serializer = new DataContractSerializer(typeof(T));
serializer.WriteObject(writer, objectToSave);
writer.Flush();
}
}
}
}
catch (Exception x)
{
MessageBox.Show("Sorry, but something went wrong and I cant save your settings.
" + x.Message);

if (IsolatedStorageFile.GetUserStoreForApplication().FileExists(fileName))
IsolatedStorageFile.GetUserStoreForApplication().DeleteFile(fileName);
}
}
}



5 ТЕСТИРОВАНИЕ

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

Таблица 5.1 – Перечень аппаратных средств
№ Устройство Аппаратная конфигурация Программная конфигурация
1 Nokia Lumia 620 ОЗУ: 512 Mb
Внутренний накопитель: 4 Gb Windows Phone 8
2 Виртуальное мобильное устройство ОЗУ: 512 Mb
Внутренний накопитель: 512 Mb Windows Phone 8

Тестирование будет производиться по следующим пунктам:
1. Отправка запроса на получение курсов валют;
2. Запуск приложения без интернета;
3. Отправка запроса на обновление курсов валют для текущих настроек приложения.
Результаты тестирования приложения отображены в таблице А.1 приложения А.

В результатах тестирования ожидается:
1. Результат успешно отправится и данные отобразятся на экране
2. Конвертирование валют произойдет успешно без интернета и данные отобразятся корректно.
3. Последние данные будут сохранены в базу.




ВЫВОДЫ

В данном курсовом проекте был реализован программный продукт, называемый Currency Converter. Данный программный продукт позволяет быстро получить обменять валюты.
В процессе проектирования приложения были изучены следующие особенности разработки приложений для мобильных устройств на базе Windows Phone:
1. работа с XAML;
2. разработка пользовательских интерфейсов;
3. работа со вспомогательными библиотеками;
4. работа с удалённым web-сервисом;
5. работа с локальной Isolated Storage.

Данное приложение очень просто в использовании. Оно может использоваться как онлайн, так и при отсутствии интернета.
Дальнейшее развитие проекта возможно путём добавления новых функций.



















СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ

1. Основы разработки приложений для мобильных устройств на платформе Windows Phone // Иинтернет-университет информационных технологий [Электронный ресурс]. – 2013. – Режим доступа: http://www.intuit.ru/studies/courses/4817/1062/info– Дата доступа: 10.04.2013
2. Windows Phone // Свободная энциклопедия Википедия [Электронный ресурс]. – 2013. – Режим доступа: http://ru.wikipedia.org/wiki/Windows_Phone – доступа: 03.04.2013.
3. Windows Phone 7 Rocks! [Электронный ресурс]. – 2013. – Режим доступа: http://wp7rocks.com/posts/details/2711 – Дата доступа: 14.05.2013.
Основы разработки приложений для мобильных устройств на платформе Windows Phone // Иинтернет-университет информационных технологий [Электронный ресурс]. – 2013. – Режим доступа: http://www.intuit.ru/studies/courses/4817/1062/info– Дата доступа: 10.04.2013.
4. Andrew Whitechapel, Sean McKenna. – Windows Phone 8 Development Internals. Preview 2. – Microsoft Press, 2012. – 433с.
5. Windows Phone SDK. // Windows Phone Dev Center [Электронный ресурс]. — 2013. — Режим доступа: http://developer.windowsphone.com/en-us/downloadsdk— Дата доступа: 05.04.2013.
6. Методические указания по выполнению дипломного проекта для студентов специальностей 1- 40 01 01 «Программное обеспечение информационных технологий» и 1- 40 01 02 «Информационные системы и технологии, Бугай О.В., Бухвалова И.А., Ковальков А.Т., Попова Ю.Б., Разоренов Н.А. – Минск, 2008.
7. ГОСТ 19.701-90. Схемы алгоритмов, программ, данных и систем. Условные обозначения и правила выполнения. Для программной документации (устарели, заменяются ГОСТ 19.701-90).
8. ГОСТ 19.002-80. Схемы алгоритмов и программ. Правила выполнения.
9. ГОСТ 19.003-80. Схемы алгоритмов и программ. Обозначения условные графические.


ПРИЛОЖЕНИЕ А













КП–107310/04–ДО–2013

Изм. Лист № документа Подпись Дата
Разраб. Буйвидович Д.С. Архитектура операционной системы Windows Phone
Лит Лист Листов
Руковод. Разорёнов Н. А. Д 1 4
Консульт. Разорёнов Н. А. 1 40 01 02 БНТУ
г. Минск
Н.контр. Разорёнов Н. А.
Зав.каф. Гурский Н. Н.


















Изм. Лист № Документа Подпись Дата Схема Isolated Storage Лист
Разраб. Буйвидович Д.С. 2
Руковод. Разорёнов Н. А.











Изм. Лист № Документа Подпись Дата Интерфейс пользователя приложения Лист
Разраб. Буйвидович Д.С. 3
Руковод. Разорёнов Н. А.












Таблица А.1 – Тестовые случаи
№ Название
модуля/экрана Описание тестового случая Ожидаемые результаты Тестовый случай пройден?
Да/Нет Комментарии
1 Главное окно приложения Отправка запроса на получение курсов валют Запрос успешно отправлен, результат сохранён в базу данных и отображён на экране Да Отправка запроса прошла без ошибок, данные отображаются корректно
2 Запуск приложение без интернета Конвертирование валют произошло успешно, по данным полученным ранее Да Конвертация произошла без ошибок, данные отображаются корректно
3 Отправка запроса на обновление курсов валют для текущих настроек приложения Запрос успешно отправлен, результат сохранён в базу данных и отображён на экране Да Отправка запроса прошла без ошибок, данные отображаются корректно









Изм. Лист № Документа Подпись Дата Тестовые случаи Лист
Разраб. Буйвидович Д.С. 4
Руковод. Разорёнов Н. А.





1 Модуль автовыбора валют
2 Модуль сохранения данных
3 Модуль кэшировани обновлённых результатов
4 Базовая модель курсов
5 Модель обмена
6 Модель получения
7 Интерфейсы
8 Модуль автовыбора валют
9 Модуль обмена
10 Main View Model
10 Страница дизайна приложения


Изм. Лист № Документа Подпись Дата Solution Explorer Лист
Разраб. Буйвидович Д.С. 5
Руковод. Разорёнов Н. А.



ПРИЛОЖЕНИЕ Б

ИСХОДНЫЙ КОД ПРОГРАММНЫХ МОДУЛЕЙ



Модуль Main View Model.

using System;
using System.ComponentModel;
using System.Linq;
using System.Runtime.Serialization;
using System.Windows;
using CurrencyExchange.Helpers;
using CurrencyExchange.Models;

namespace CurrencyExchange.ViewModels
{
public class MainViewModel : INotifyPropertyChanged
{
private const string SettingFileName = "mainviewmodel.dat";

private ICurrencyExchangeService _currencyExchangeService;
private string _busyMessage = null;
private double _amount;
private ICurrency _fromCurrency;
private ICurrency _toCurrency;
private ICurrencyExchangeResult _result;

#region Properties

[IgnoreDataMember]
public static MainViewModel Instance { get; protected set; }

[IgnoreDataMember]
public ICurrencyExchangeService CurrencyExchangeService
{
get
{
return _currencyExchangeService;
}
set
{
if (_currencyExchangeService == value)
return;

_currencyExchangeService = value;

_fromCurrency = Currencies.FirstOrDefault(x => x.Name == "US Dollar") ?? Currencies[0];
_toCurrency = Currencies.FirstOrDefault(x => x.Name == "Euro") ?? Currencies[1];

RaisePropertyChanged("CurrencyExchangeService");
RaisePropertyChanged("Currencies");
}
}

[IgnoreDataMember]
public ICurrency[] Currencies
{
get
{
return _currencyExchangeService.Currencies;
}
}

[DataMember]
public string Amount
{
get
{
return _amount.ToString("0.00");
}
set
{
double amount;

if (double.TryParse(value, out amount))
{
if (_amount == amount)
return;

_amount = amount;

RaisePropertyChanged("Amount");
}
else
throw new Exception("Please enter a valid Amount");
}
}

[IgnoreDataMember]
public ICurrency FromCurrency
{
get
{
return _fromCurrency;
}
set
{
if (_fromCurrency == value)
return;

_fromCurrency = value;

RaisePropertyChanged("FromCurrency");
}
}

[IgnoreDataMember]
public ICurrency ToCurrency
{
get
{
return _toCurrency;
}
set
{
if (_toCurrency == value)
return;

_toCurrency = value;

RaisePropertyChanged("ToCurrency");
}
}

[IgnoreDataMember]
public ICurrencyExchangeResult Result
{
get
{
return _result;
}
protected set
{
if (_result == value)
return;

_result = value;

RaisePropertyChanged("Result");
RaisePropertyChanged("ExchangedCurrency");
RaisePropertyChanged("ExchangedAmount");
RaisePropertyChanged("ExchangedTimeStamp");
}
}

[IgnoreDataMember]
public string ExchangedCurrency
{
get
{
if (_result == null || _result.ExchangedCurrency == null)
return string.Empty;

return _result.ExchangedCurrency.Name;
}
}

[IgnoreDataMember]
public string ExchangedAmount
{
get
{
if (_result == null)
return string.Empty;

return _result.ExchangedAmount.ToString("N2");
}
}

[IgnoreDataMember]
public string ExchangedTimeStamp
{
get
{
if (_result == null)
return string.Empty;

return string.Format("Data freshness:
{0} at {1}",
_result.Timestamp.ToShortDateString(),
_result.Timestamp.ToShortTimeString());
}
}

[DataMember]
public int FromCurrencyIndex
{
get
{
return Array.IndexOf(Currencies, FromCurrency);
}
set
{
FromCurrency = Currencies[value];
}
}

[DataMember]
public int ToCurrencyIndex
{
get
{
return Array.IndexOf(Currencies, ToCurrency);
}
set
{
ToCurrency = Currencies[value];
}
}

[DataMember]
public CurrencyCachedExchangeRate[] CurrenciesCachedExchangeRates
{
get
{
return Currencies
.Select(x => new CurrencyCachedExchangeRate()
{
CurrencyIndex = Array.IndexOf(Currencies, x),
CachedExchangeRate = x.CachedExchangeRate,
CachedExchangeRateUpdatedOn = x.CachedExchangeRateUpdatedOn
})
.ToArray();
}
set
{
foreach (var currencyData in value)
{
if (currencyData.CurrencyIndex >= Currencies.Length)
continue;

var currency = Currencies[currencyData.CurrencyIndex];

currency.CachedExchangeRate = currencyData.CachedExchangeRate;
currency.CachedExchangeRateUpdatedOn = currencyData.CachedExchangeRateUpdatedOn;
}
}
}

[IgnoreDataMember]
public bool Busy
{
get
{
return !string.IsNullOrEmpty(BusyMessage);
}
}

[IgnoreDataMember]
public string BusyMessage
{
get
{
return _busyMessage;
}
set
{
if (_busyMessage == value)
return;

_busyMessage = value;

RaisePropertyChanged("BusyMessage");
RaisePropertyChanged("BusyVisibility");
}
}

[IgnoreDataMember]
public Visibility BusyVisibility
{
get
{
return Busy ? Visibility.Visible : Visibility.Collapsed;
}
}

#endregion

public MainViewModel()
{
CurrencyExchangeService = new MsnMoneyV2CurrencyExchangeService();
Amount = "100";
}

static MainViewModel()
{
Instance = Load();
}

public void ExchangeCurrency()
{
if (Busy)
return;

BusyMessage = "Exchanging amount...";

_currencyExchangeService.ExchangeCurrency(_amount, _fromCurrency, _toCurrency, true, CurrencyExchanged, null);
}

public void SwapCurrencies()
{
if (Busy)
return;

var tempCurrency = FromCurrency;

FromCurrency = ToCurrency;
ToCurrency = tempCurrency;
}

public void UpdateCachedExchangeRates()
{
if (Busy)
return;

BusyMessage = "Updating cached exchange rates...";

_currencyExchangeService.UpdateCachedExchangeRates(ExchangeRatesUpdated, null);
}

public static MainViewModel Load()
{
return StorageHelper.LoadContract<MainViewModel>(SettingFileName, true);
}

public void Save()
{
StorageHelper.SaveContract(SettingFileName, this, true);
}

private void CurrencyExchanged(ICurrencyExchangeResult result)
{
InvokeOnUiThread(() =>
{
Result = result;

BusyMessage = null;

if (result.Error != null)
{
if (System.Diagnostics.Debugger.IsAttached)
System.Diagnostics.Debugger.Break();
else
MessageBox.Show("An error has ocorred!", "Error", MessageBoxButton.OK);
}
});
}

private void ExchangeRatesUpdated(ICachedExchangeRatesUpdateResult result)
{
InvokeOnUiThread(() =>
{
BusyMessage = null;

Save();

if (result.Error != null)
{
if (System.Diagnostics.Debugger.IsAttached)
System.Diagnostics.Debugger.Break();
else
MessageBox.Show("An error has ocorred!", "Error", MessageBoxButton.OK);
}
});
}

private void InvokeOnUiThread(Action action)
{
var dispatcher = System.Windows.Deployment.Current.Dispatcher;

if (dispatcher.CheckAccess())
action();
else
dispatcher.BeginInvoke(action);
}

public event PropertyChangedEventHandler PropertyChanged;

private void RaisePropertyChanged(string propertyName)
{
if (PropertyChanged != null)
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}

#region Auxiliary Classes

public class CurrencyCachedExchangeRate
{
[DataMember]
public int CurrencyIndex { get; set; }

[DataMember]
public double CachedExchangeRate { get; set; }

[DataMember]
public DateTime CachedExchangeRateUpdatedOn { get; set; }
}

#endregion
}
}

© Copyright 2012-2020, Все права защищены.