Автор: Гарибов А.И.
Теги: информационные технологии вычислительная техника обработка данных микропроцессоры программирование программное обеспечение учебное пособие операционная система windows
ISBN: 978-5-4497-2242-3
Год: 2023
А.И.Гарибов
Основы разработки приложений
для мобильных устройств
на платформе Windows Phone
Учебное пособие
3-е издание (электронное)
Интернет-Университет Ай Пи Ар Медиа
Информационных Технологий
www.intuit.ru
Москва
2023
УДК 004
ББК 32.97
Гарибов, А.И.
Основы разработки приложений для мобильных устройств на платформе Windows
Phone : учебное пособие / А.И. Гарибов. — 3-е изд. (эл.) — Москва : Национальный
Открытый Университет «ИНТУИТ» : Ай Пи Ар Медиа, 2023. — 456 с. — Текст :
электронный.
ISBN 978-5-4497-2242-3
В учебном пособии рассматриваются основные принципы и средства разработки
и публикации приложений для мобильных устройств, работающих на платформе Windows
Phone 7.5, с использованием технологий Silverlight и XNA. Описывается структура приложений,
основанных на дизайне Metro, и применение программных инструментов среды Visual Studio
2010 для их создания. Особое внимание уделяется технологии Silverlight, используемой для
создания интерфейса приложений, принципам организации и использования баз данных
с помощью технологии LINQ, технологиям сетевого взаимодействия приложений с различными
сетевыми сервисами, технологии XNA для создания 2D и 3D-игр для мобильных устройств
Windows Phone. Также рассматриваются вопросы, касающиеся многозадачности, использования
функций телефона в приложениях и публикации разработанных приложений на портале
Windows Phone Marketplace.
Учебное пособие предназначено для студентов, обучающихся по направлениям
подготовки, связанным с информатикой и информационными технологиями, а также для всех,
кто интересуется вопросами разработки приложений для мобильных устройств.
Учебное электронное издание
Технический редактор АД. Талмаева
Обложка С.С. Сизиумова, Я.А. Кирсанов, фотобанк «Лори»
Подписано к использованию 29.06.2023.
© ООО «ИНТУИТ.РУ», 2013-2016
© Гарибов А.И., 2013-2016
© Оформление электронного издания.
ООО Компания «Ай Пи Ар Медиа», 2023
Содержание
Введение 4
1. Общие сведения о платформе Windows Phone 7.5 7
2. Пакет Windows Phone SDK и эмулятор Windows Phone 37
3. Введение в Silverlight 42
4. Создание простого приложения Silverlight 73
5. Управление решениями в Visual Studio 82
6. Отладка приложения 114
7. Использование нескольких проектов в одном решении 117
8. Создание приложений Silverlight 121
9. Обработка ошибок ввода данных 183
10. Привязка данных 187
11. Использование различных режимов ориентации 196
12. Отображение списков данных 203
13. Многостраничные приложения 210
14. Хранение данных приложений 217
15. Изолированное хранилище 254
16. Взаимодействие приложения с базой данных 260
17. Средства Windows Phone для работы с сетью 262
18. Использование сетевых ресурсов в приложении 316
19. Создание приложений XNA 323
20. Создание приложения XNA 360
21. Совместное использование Silverlight и XNA 364
22. Использование системных функций в приложениях 368
23. Реализация быстрого переключения приложений 406
24. Задачи запуска и задачи выбора 414
25. Фоновая обработка 424
26. Публикация приложений в Windows Phone Marketplace 432
27. Подготовка приложения для размещения на портале
Windows Phone Marketplace 443
Общий глоссарий 448
3
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Введение
Компания Microsoft известна как создатель операционной системы для
мобильных устройств Windows Mobile. Внешне система напоминает
интерфейс операционной системы Windows для настольных
компьютеров, но ориентирована для использования в карманных
компьютерах и смартфонах. Система выпускалась с середины 1990-х
годов и развивалась в течение 20 лет.
Система Windows Mobile содержит такие программы как календарь,
органайзер, браузер Internet Explorer Mobile и мобильную версию
популярного офисного пакета Microsoft Office. Отличительными
элементами интерфейса являются начальный экран "Сегодня", в котором
отображается текущая дата, информация о владельце, предстоящие
встречи, новые сообщения и задачи; панель задач, в которой выводится
текущее время, вариант звукового профиля, заряд батареи, а также
кнопка "Пуск", при нажатии на которую раскрывается меню со списком
программ и служебными ссылками как в настольной версии Windows.
Операционная система имеет схожие черты с настольными версиями
Windows, среди которых — аналогичная файловая структура и запуск
приложений в режиме многозадачности. Однако, одним из главных
преимуществ Windows Mobile является возможность разработки
программ для мобильной платформы сторонними производителями,
которой не было у многих мобильных операционных систем.
Новая система для мобильных устройств получила название Windows
Phone 7, или просто Windows Phone. Система использует некоторые
преимущества Windows Mobile, но является полностью новой, с
полностью новым интерфейсом, и использует иные подходы по
сравнению с Windows Mobile. Система полностью ориентирована на
использование в устройствах с сенсорным экраном и оптимизирована
для пальцеориентированного ввода.
Устройства на платформе Windows Phone должны соответствовать
определённым минимальным аппаратным требованиям. Результатом
является тот факт, что одно и то же приложение должно работать
одинаково на всех устройствах. Разработка приложений теперь имеет
особенности, отличные от приложений для Windows Mobile, поэтому
4
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
старые приложения не будут работать на новой платформе.
Одной из ключевых новинок является совершенно новый интерфейс,
основанный на 'Metro-стиле". Особенность этого подхода в том, что на
первом месте стоит информация, а не её оформление. Все приложения
для Windows Phone должны соответствовать Metro-стилю. Кроме этого,
в Windows Phone существенно ограничена многозадачность, а также
имеются и другие отличия от предыдущих систем.
Все приложения для Windows Phone основаны на платформе .NET
Framework, должны использовать технологию Silverlight или XNA и
теперь могут быть легко портированы на другие платформы, например,
настольные компьютеры или Xbox. Для разработки приложений
используются бесплатные инструменты, которые входят в состав
свободно распространяемого пакета Windows Phone SDK. Для того
чтобы начать создавать приложения для Windows Phone, достаточно
изучить некоторые основные приниципы платформы и язык C#. Для
опытных разработчиков переход на платформу Windows Phone не
составит труда.
Ожидается, что приложения для Windows Phone 7 можно будет
использовать и в следующих версиях, поэтому разработка приложений
для этой платформы является актуальной и востребованной.
Предисловие
Технология мобильной связи пришла в народные массы в 1990-х годах,
а в 2000-х получила широкое распространение. Изначально мобильная,
или сотовая связь предназначалась для телефонных звонков и для
отправки коротких SMS-сообщений. Сотовые телефоны практически
полностью вытеснили такие устройства, как пейджеры.
Однако, современные телефоны могут не только звонить. Уже в начале
2000-х стали популярными телефоны с возможностью выхода в
Интернет с помощью технологий WAP и GPRS. Технология WAP имеет
существенные ограничения, которые не позволяют просматривать
большинство Интернет-сайтов, так как ориентирована на WAP-сайты
без графического оформления. Технология GPRS позволяет не только
просматривать Интернет-страницы в мобильном телефоне, но и
5
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
использовать телефон в качестве модема, но скорость подключения к
Интернету изначально была невысокой.
Со временем, технологии мобильной связи, в том числе и мобильного
Интернета, довольно быстро развивались. На сегодняшний день во
многих городах операторы сотовой связи используют технологии
мобильной связи третьего поколения, или 3G. Скорость работы в
Интернете существенно возросла и сейчас исчисляется мегабитами в
секунду. Не отстали в развитии и мобильные телефоны, которые по
функциональности теперь сравнимы с компьютерами. Из года в год
производители выпускают телефоны с улучшенными аппаратными
средствами, увеличивается размер экрана, добавляются полезные
функции и создаются приложения — всё это в целом повышает
удобство использования мобильных устройств, а гибкая ценовая
политика делает эти устройства доступными для широкого круга
пользователей. Поэтому мобильные телефоны и их старшие "братья"
смартфоны являются востребованными устройствами.
6
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Общие сведения о платформе Windows Phone 7.5
Windows Phone 7.5 является новой платформой для мобильных
устройств. Телефоны Windows Phone могут взаимодействовать с другими
системами, разработанными компанией Microsoft. В этой главе вы
познакомитесь с ключевыми особенностями платформы Windows Phone и
с экосистемой Windows Phone.
Презентацию к данной главе Вы можете скачать здесь - h ttp://
old.intuit.ru/department/se/devmobwphn/1/01.pptx.
1.1. Платформа Windows Phone
В наше время компьютеры принимают участие практически во всех
сферах жизни. Мобильные телефоны не являются исключением.
Устройство на платформе Windows Phone можно считать компьютером,
который может делать телефонные звонки, а не просто телефоном,
который может запускать программы.
Характеристики устройств на платформе Windows Phone сходны с
компьютерами: мощный процессор, локальное хранилище данных,
высокопроизводительная трёхмерная графика и много оперативной
памяти. Управление устройством и запущенными на нём программами
осуществляет своя операционная система, которую можно сравнить с
операционной системой Windows для настольных компьютеров: она
запускается при включении компьютера, и по окончании работы
выключает компьютер.
Серия Windows Phone 7 существенно отличается от предыдущих версий
устройств под управлением операционной системы Windows Mobile. В
Windows Mobile можно было создавать программы и запускать их на
более ранних версиях операционной системы, но при этом не
использовалась среда Silverlight или XNA. Номер 7 в названии продукта
означает 7-ое воплощение платформы операционной системы Windows
Mobile. Это не значит, что она основана на операционной системе
Windows 7, но программу для Windows Phone можно запустить на
компьютере под управлением Windows. Поддержка Silverlight и XNA не
разрывает связей с прошлым, а является сбалансированным сочетанием
преемственности и нововведений.
7
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Аппаратные требования для устройств на Windows Phone 7 являются
довольно серьёзными для мобильных устройств. Все устройства
Windows Phone должны соответствовать определённым минимальным
требованиям, но производители телефонов могут выпускать устройства
с большим объёмом памяти, более быстрым процессором, аппаратной
клавиатурой и большим экраном. При этом, в устройстве может не быть
аппаратной клавиатуры — у большинства устройств она будет
экранной. При создании программ на XNA разработчикам придётся
привыкать к подобным изменениям в аппаратной части. Однако, в
состав платформы входят несколько устройств, особенно полезных при
разработке игр, например, акселерометр и сенсорный экран.
Процессор Windows Phone
Центральный процессор (CPU) компьютера является устройством,
который выполняет всю работу. При запуске программы центральный
процессор отвечает за выборку данных из памяти, изменение и возврат
данных. Самой распространённой характеристикой скорости работы
компьютера является тактовая частота процессора. В состав
центрального процессора входят часы, которые при работе
отсчитывают такты. За один такт центральный процессор может
выполнить одну часть низкоуровневой операции: выборка инструкции
из памяти, выполнение вычисления и т.д.
Чем выше тактовая частота, тем быстрее работает процессор. Тактовая
частота процессоров современных настольных компьютеров находится
в пределах 3 ГГц (приблизительно 3 тысячи миллиарда раз в секунду).
Это означает, что один такт длится приблизительно одну наносекунду.
За это время сигнал может преодолеть расстояние примерно 30 см.
Время, за которое сигналы могут пройти через схему, является
серьёзным ограничивающим фактором.
Частота процессора в Windows Phone составляет около 1 ГГц. Можно
предположить, что скорость Windows Phone примерно равна третьей
части скорости компьютера. Но на практике это неверно по нескольким
причинам.
Во-первых, тактовая частота не сопоставима между процессорами
8
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
компьютера и мобильного устройства. Процессор компьютера может за
пять тактов сделать то, на что процессору Windows Phone нужно десять
тактов. Процессор компьютера может выполнять аппаратно многие
операции (например, операции с плавающей точкой), для выполнения
которых процессору Windows Phone обычно требуется вызов
подпрограммы, что будет выполняться намного медленнее.
Во-вторых, в компьютере может быть несколько процессоров. Это не
значит, что компьютер может работать быстрее, но процессоры могут
обработать больше данных за одно время. В состав устройств Windows
Phone входит только один процессор.
Наконец, в компьютере практически не ограничено электропитание.
Центральный процессор компьютера может работать на максимальной
скорости столько времени, сколько нужно. При этом, возникает
проблема, связанная с тем, что процессор должен всё время
охлаждаться. Чем быстрее работает процессор, тем больше энергии он
потребляет. Если бы процессор телефона работал бы всё время на
максимальной скорости, то срок службы аккумулятора был бы очень
коротким. Операционная система телефона ускоряет и замедляет
процессор в зависимости от того, какие операции он должен
выполнить в данный момент. Хотя в телефоне быстрый процессор, он
используется на полную мощность, только когда телефон должен
выполнить действия, требующие очень быстрой реакции.
Таким образом, при создании программы для Windows Phone
вычислительная мощность процессора не является неограниченным
ресурсом. Программисты для Windows Phone должны помнить, что
приложения должны быть удобными в использовании и не должны
приводить к быстрой разрядке аккумулятора телефона.
Операционная система Windows Phone
Операционная система Windows Phone 7 не основана на операционной
системе Windows 7 для настольных компьютеров. Операционная
система Windows Phone является развитием системы Windows CE
(Compact Edition), которая была специально разработана для работы на
портативных компьютерных системах и оптимизирована в части
9
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
производительности и сохранении срока службы аккумулятора
устройства. Однако, программа будет работать в Windows Phone так же,
как и на компьютере.
Графический экран
Экран Windows Phone имеет высокое разрешение и содержит большое
количество пикселей. Он позволяет использовать графику высокого
качества и позволяет выводить на экран большое количество текста. Чем
больше пикселей будет на экране, чем выше качество изображения,
которое можно вывести на экран. Однако, чем больше пикселей в
изображении, тем больше памяти нужно для того чтобы сохранить
изображение, и компьютер должен выполнить больше операций для
перерисовки изображение на экране. Это особенно важно для
мобильного устройства, так как увеличение работы аппаратных средств
означает больший расход энергии и сокращает срок службы
аккумулятора. Выбор разрешения экрана — это компромисс между
сроком службы аккумулятора, стоимостью его изготовления и яркостью
экрана (чем меньше пиксели, тем ниже яркость экрана).
В текущей версии Windows Phone разрешение экрана составляет 800*480
пикселей. Его можно использовать в альбомной или книжной
ориентации. В телефоне есть акселерометр, который определяет, в каком
положении находится телефон. Операционная система Windows Phone
может скорректировать изображение в соответствии с ориентацией
телефона.
Разработчик может задавать, какую ориентацию экрана поддерживает
приложение. По умолчанию приложения Siiverlight отображаются в
портретном режиме, но можно сделать так, чтобы они самостоятельно
приспосабливались к изменениям ориентации экрана. Специально для
обнаружения изменения ориентации предусмотрены новые события, а
некоторые изменения обрабатываются автоматически. Разработчики
игр обычно задают конкретную ориентацию экрана пользователя.
Программы на XNA по умолчанию используют альбомный режим, но
это свойство легко переопределить.
Разработчики приложений для телефонов часто сталкиваются с
10
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
проблемой, связанной с большим количеством размеров экрана
различных устройств. Обычно программу нужно настраивать под
каждый доступный размер экрана. Аппаратные средства Windows Phone
могут масштабировать экран приложения под физический размер экрана
устройства. Такая возможность может повысить быстродействие в
играх и позволяет создавать игры, которые будут выглядеть одинаково
на любом устройстве.
Графический процессор Windows Phone
В самых первых компьютерах всю работу выполнял непосредственно
центральный процессор. К числу выполняемых задач относится и
вывод изображения на экран. Позже всю работу по выводу
изображений на экран стало выполнять специализированное
устройство для управления экраном — графический процессор (GPU).
Усовершенствованные графические процессоры поддерживают
трёхмерную графику и могут выполнять операции над числами с
плавающей точкой и над матрицами. Они также содержат пиксельные
шейдеры, которые могут быть запрограммированы для обработки
изображений в каждой точке экрана с высокой скоростью, включая
отрисовку добавление эффектов освещения и размытости и др.
До недавнего времени графические процессоры были только в
настольных компьютерах и игровых приставках, но теперь они
появились и в мобильных телефонах. Платформа Windows Phone
содержит чип для обработки графики, который используется для
создания 3D эффектов на экране телефона и также может
использоваться в среде проектирования игр XNA для создания быстрых
3D игр.
Сенсорный экран
Старые портативные устройства использовали резистивные сенсорные
экраны. Когда пользователь прикасается к резистивному экрану, его
пластмассовая поверхность сгибается и воздействует на нижний
уровень. Точка касания определяется на основе информации об
изменении электрического сопротивления на границе контакта.
11
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Резистивные сенсорные экраны дёшевы в изготовлении и хорошо
работают со стилусом. Однако такой принцип работы затрудняет
обнаружение нескольких одновременных касаний. Также трудно сделать
резистивный экран из твёрдого материала, например, стекла, поскольку
экран должен согнуться для возникновения контакта, определяющего
точку ввода.
Емкостной сенсорный экран работает по-другому Последовательность
проводников под экранной поверхностью фиксирует изменение
ёмкости, которое происходит при касании. На основе этой информации
аппаратные средства сенсорного экрана решают, в каком месте экрана
произошёл сенсорный ввод. Стоимость изготовления емкостных
сенсорных экранов выше, чем резистивных, поскольку требуют наличия
дополнительных аппаратных средств для обработки входных сигналов,
но схемы датчиков можно разместить на обратной стороне стеклянного
экрана, чтобы сделать экран более жёстким. Емкостной сенсорный
экран не так точен, как резистивный при использовании стилуса, но
емкостной экран может обнаружить несколько одновременных касаний
экрана.
Во всех устройствах Windows Phone сенсорный экран емкостного типа
может отслеживать, как минимум, четыре касания. Переход к
мультисенсорному вводу является важным шагом в развитии
мобильных устройств. Пользователь может управлять программным
обеспечением, используя мультисенсорные жесты. Операционная
система Windows Phone имеет средства для распознавания жестов,
которые можно использовать в программах.
Камера
Практически во всех мобильных устройствах есть камеры — и Windows
Phone не исключение. Телефон снабжён камерой с разрешением от 5
мегапикселей и вспышкой, что сравнимо с разрешением цифрового
фотоаппарата. 5-мегапиксельные изображения могут быть напечатаны
на фотобумаге в формате 13*18 см в хорошем качестве.
Приложения для Windows Phone могут управлять камерой и
использовать её для создания снимков или видеопотоков. Приложения
12
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
также могут напрямую получить доступ к видеопотоку и добавлять к
воспроизведению дополнительные объекты или обнаруживать
определённые элементы, такие как штрих-коды или лица на
фотографиях. Пользователь может сохранять сделанные снимки в
телефоне в качестве мультимедийного контента. Программы могут
открывать эти изображения и работать с ними.
Устройства для определения местоположения и
перемещения
Устройство Windows Phone может определить своё местоположение. В
его состав входит устройство системы глобального позиционирования
(GPS), которое получает спутниковые сигналы для определения
местоположения телефона. Поскольку GPS хорошо работает только в
открытом пространстве, телефоны также используют другие методы
определения местоположения (A-GPS): информация о местоположении
ближайшей вышки сотовых операторов и/или местоположение
используемой точки доступа Wi-Fi-подключения. Методы A-GPS
помогают определить местоположение при нахождении в зданиях и
закрытых территориях.
Операционная система Windows Phone предоставляет методы, которые
программы могут использовать для определения местоположения
устройства. Среда разработки содержит эмулятор GPS, для того чтобы
можно было проверить, как программы используют информацию о
местоположении.
Акселерометр — это аппаратное устройство для измерения ускорения.
Акселерометр измеряет ускорение, которое является физической
величиной, обозначающей изменение скорости. Также акселерометр
реагирует на изменение гравитации. Программы могут получать
значение вектора в трёхмерном пространстве, который определяет
положение телефона относительно земли. Акселерометр также может
обнаруживать резкие перемещения телефона, что можно использовать
для управления в играх.
Телефон также содержит электронный компас, с помощью которого
программа может определить, в каком направлении указывает телефон.
13
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Это может быть полезно для создания приложений "расширенной
реальности".
Механический гироскоп — это устройство, которое всегда указывает в
определённом направлении. Windows Phone содержит его электронный
вариант, который позволяет определить, когда телефон перемещают или
поворачивают в разные стороны. Программы могут использовать
акселерометр, чтобы определить положение телефона в пространстве,
но гироскоп даёт намного более точную информацию и может также
предоставить информацию о скорости перемещения или вращения.
Когда программа использует много датчиков, трудно проверить, как
программы реагируют на определённую последовательность движений
и действий. К счастью, Windows Phone предоставляет единый
программный объект, который объединяет информацию с различных
датчиков и предоставляет программам возможность определять
ориентацию и перемещение телефона. Можно создать собственную
последовательность действий, которую можно воспроизвести в
эмуляторе Windows Phone при тестировании программы.
Аппаратные кнопки
Все программы Windows Phone используют стандартный
пользовательский интерфейс. Дизайн телефона предусматривает
несколько аппаратных кнопок, которые должны быть в каждом
устройстве и должны выполнять одну и ту же функцию независимо от
конструкции и модели телефона.
• Пуск — позволяет начать выполнение нового действия. При
нажатии на кнопку Пуск открывается окно со списком программ, в
котором можно выбрать и запустить установленную программу.
При этом, работающее приложение приостанавливает свою
работу. Операционная система Windows Phone "помнит", какое
приложение было остановлено, чтобы можно было вернуться к
нему позже.
• Назад — позволяет вернуться к предыдущей странице
приложения. Она также используется для остановки приложения
и возврата к запущенному ранее приложению. Например, можно
14
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
запустить приложение для отправки электронного письма во
время просмотра веб-сайта, и после отправки сообщения нажать
кнопку Назад, чтобы вернуться в браузер. В пределах приложения
для работы с почтой при нажатии на кнопку Назад происходит
переход к её предыдущему экрану. Как только сообщение
отправлено, можно нажать кнопку Назад, находясь на главном
экране программы электронной почты, чтобы вернуться к экрану
со списком программ и запустить другую программу. Кнопка
Назад также используется для вызова списка запущенных в
телефоне приложений. Если нажать и держать её ("длинное
нажатие'), то телефон откроет список всех активных приложений,
между которыми можно переключаться.
• Блокировка — позволяет заблокировать телефон и выключить
экран для сохранения заряда батареи телефона. Когда
пользователь снова нажимает кнопку Блокировка или кнопку
Пуск, телефон отобразит экран блокировки. Телефон можно
настроить на автоматическую блокировку после нескольких минут
бездействия. Приложению может быть разрешено продолжить
работу при блокировке устройства. Это полезно в приложениях
для навигации, в которых программа должна остаться активной,
но оказывает влияние на время работы телефона от аккумулятора.
• Поиск — позволяет начать новый поиск. Действия при нажатии
кнопки Поиск зависят от того, что в это время делает
пользователь. Если нажать кнопку Поиск во время просмотра веб¬
страницы, то он откроется меню веб-поиска. Если нажать кнопку
Поиск, когда активно приложение Контакты, будет осуществляться
поиск контактов.
• Камера — запускает приложение Камера, в котором можно
сделать фотоснимок. При этом, запущенная в это время программа
останавливается.
То, как используются эти кнопки, имеет значение для программ.
Программа должна учитывать, что она в любой момент может быть
выгружена из памяти. Например, если пользователь решит сделать
фотоснимок, играя в игру, то игра будет приостановлена и может быть
удалена из памяти. После того как пользователь сделает снимок,
пользователь должен иметь возможность возобновить игру.
Программы, выполнение которых должно быть остановлено, получают
15
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
предупреждающее сообщение, и операционная система Windows Phone
предоставляет несколько способов сохранения информации о
состоянии.
Не во всех устройствах Windows Phone есть аппаратная клавиатура для
ввода текста, но все устройства могут использовать для этого
сенсорный экран.
Память и хранилище
Считается, что чем больше памяти в компьютере, тем он "лучше"
работает. Существует две разновидности памяти: оперативная и
внутренняя память. Оперативная память (RAM) — это пространство в
компьютере, где выполняются программы. Внутренняя память
используется для хранения программ и данных в устройстве.
В настольном компьютере память выражается количеством RAM
(Random Access Memory — память произвольного доступа) и
количеством места на жёстком диске. В современном настольном
компьютере, в среднем 2 Гб RAM и 500 Гб места на жёстком диске.
Можно считать, что сжатая музыкальная дорожка использует
приблизительно 6 Мб, высококачественное изображение —
приблизительно 3 Мб, и один час видео хорошего качества займёт около
1 Гб.
Минимальное требование к устройствам Windows Phone — 256 Мб
оперативной и 8 Гб внутренней памяти, что соответствует одной
восьмой части объёма оперативной памяти и приблизительно одной
пятидесятой части памяти для хранения данных по сравнению с
настольным компьютером. Операционная система Windows Phone
оптимизирована для работы с небольшим объёмом памяти. Однако, при
создании программ нужно быть уверенным, что программы не
исчерпают доступные ресурсы.
Сетевые подключения
Мобильные телефоны Windows Phone имеют несколько возможностей
16
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
подключения к сети:
• Wi-Fi — все устройства Windows Phone поддерживают
беспроводную сеть. Wi-Fi предоставляет высокоскоростное
сетевое подключение, но работает, только если телефон находится
близко к точке доступа к сети;
• 3G — мобильные сети третьего поколения, обладают чуть
меньшей производительностью по сравнению с Wi-Fi. Скорость в
сетях 3G часто изменяется. Доступ 3G также может быть
ограничен с точки зрения объёма данных, которые разрешено
передавать мобильному устройству;
• GPRS — во многих областях сеть 3G не доступна. В этом случае
телефон может использовать мобильную сеть GPRS, скорость
которой существенно ниже, чем 3G.
Сетевые подключения работают по протоколу TCP/IP. К сожалению,
сетевое покрытие не является повсеместным, и программы в телефоне
должны продолжать работу при отсутствии сетевого подключения, а
также при изменении скорости подключения.
Windows Phone также предоставляет поддержку сети Bluetooth. Она
используется только для подключения внешних устройств, таких как
наушники и автомобильные аудиосистемы, существующая версия
Windows Phone не позволяет программам получить к ней доступ.
Особенности платформы Windows Phone
Аппаратные средства Windows Phone являются очень мощными для
мобильного устройства, но они всё ещё ограничены возможностями
мобильного использования и временем работы от батареи.
Пользователи, привыкшие работать с высокоскоростными устройствами
с богатым графическим пользовательским интерфейсом, ожидают, что
их телефон предоставит им такие же возможности.
При создании программ для устройства Windows Phone нужно
стремиться к тому, чтобы программы при работе максимально
эффективно использовали доступные средства платформы.
17
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Возможности мобильных устройств позволяют создавать по-
настоящему новые приложения. Инструменты для создания программ
предоставляют большие возможности для создания полезных и удобных
в использовании приложений.
1.2. Экосистема Windows Phone
Устройство Windows Phone разрабатывалось не просто как отдельное
устройство. Оно является частью экосистемы, которая содержит много
других систем программного обеспечения, работающих совместно и
предоставляющих пользователям различные возможности.
Программное обеспечение для управления
мультимедиа Zune
Устройство Windows Phone можно подключить к компьютеру с помощью
программного обеспечения Zune. Оно предоставляет возможность
управлять мультимедийным контентом и передавать его из компьютера
в телефон и обратно. Программное обеспечение Zune также может
обновлять встроенное программное обеспечение Windows Phone до
новых версий. Zune также является связующим звеном между средой
проектирования Visual Studio и самим телефоном.
Программы могут использовать мультимедийный контент, загружаемый
на телефон через программное обеспечение Zune. Программы могут
загружать изображения и воспроизводить музыку и видео, сохранённые
в телефоне. Также можно создавать программы воспроизведения
музыки, которые работают в фоновом режиме наряду с другими
запущенными программами.
Сервисы Windows Live и Xbox Live
Владелец Windows Phone может зарегистрировать телефон с помощью
учётной записи Windows Live. Если учётная запись Windows Live связана
с учётной записью Xbox Live, то игровой профиль импортируется на
устройство, и пользователи могут принять участие в мобильных играх,
18
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
используя тот же самый идентификатор, что и на консоли.
Карты Bing
Телефон содержит аппаратные средства, которые позволяют ему
определять своё местоположение. Служба карт Microsoft Bing
предоставляет карты, которые покрывают большую часть земли.
Программа Windows Phone может использовать сетевое подключение,
чтобы связаться со службой карт Bing и загрузить карты и виды с
воздуха. С помощью Silverlight можно управлять отображением карт, что
позволяет программам использовать отображение местоположения.
Службы уведомлений Windows
Хотя телефон использует различные технологии подключения к сети,
бывают случаи, когда телефон не может подключиться к сети. Windows
Phone предоставляет службу уведомлений, которая позволяет
программам получать уведомления из сети, даже когда программы не
активны. Уведомления сохраняются и управляются службой
уведомлений, которая их буферизует, если телефон не подключён к сети
при поступлении уведомления.
Например, система продаж должна сообщить клиенту, когда
зарезервированный товар будет в наличии. Приложение для заказа в
телефоне может зарегистрироваться в службе уведомлений, и затем
сервер управления складом может использовать сервер уведомлений,
чтобы сообщить клиенту о доступности товара. Эту систему также
можно использовать в играх, если один игрок хочет отправить
приглашение в игру другому игроку.
Windows Phone и Windows Azure
Windows Azure — это набор "облачных" служб, которые предоставляет
Microsoft. Вместо того, чтобы использовать свой собственный
компьютер для хранения данных и обработки информации о
19
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
пользователях, можно арендовать пространство и процессоры в облаке.
Если ваше сетевое приложение становится очень популярным, то вам
не нужно покупать больше компьютеров и подключать их — вместо
этого вы только расширяете используемый вами облачный ресурс.
Серверные приложения. Облачные службы также полезны, если нужно
выполнить большое количество действий однократно или очень редко.
Вместо содержания большого количества компьютеров для выполнения
подобной работы можно просто передать эту работу в облако. Можно
создать серверное приложение на C# и протестировать его на
эмуляторе облака перед его загрузкой для работы в реальное облако.
Клиентские приложения могут использовать эти службы с помощью
различных сетевых технологий.
Хранилище базы данных. Хотя в устройстве Windows Phone можно
создать базу данных, часто полезно использовать удалённую базу
данных, подключение к которой может осуществляться через сеть. Это
облегчает использование большого количества хранилищ данных,
которые можно обновить централизованно. Можно создать базы
данных в облаке и использовать их из приложений Windows Phone.
BLOB-хранилище. BLOB обозначает двоичный объект большого
размера. BLOB может быть чем угодно: текстом книги, фильмом или
сканом отчёта. Windows Azure предоставляет хранилище, в котором
приложение может сохранять и получать BLOB-данные.
Службы аутентификации. Всякий раз, когда пользователь хочет
получить доступ к ресурсу, возникает необходимость аутентификации.
Провайдер ресурса должен убедиться, что пользователь —
действительно тот, за кого себя выдаёт. Особенно эта проблема касается
портативных устройств, таких как телефоны. Создание инструмента для
аутентификации является очень трудоёмкой работой. Windows Azure
предоставляет возможность разместить службу аутентификации в
облаке.
Использование экосистемы
В наше время телефон является не просто телефоном. Приложения в
20
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
телефоне могут работать совместно с удалёнными службами, которые
доступны через сетевое подключение. Другие компоненты телефона
также используют эту возможность. В телефон встроен клиент
Facebook, приложение для работы с камерой; из хранилища
изображений можно загрузить рисунки в Windows Live SkyDrive или
Facebook.
Также можно использовать сетевые подключения телефона для
создания клиент—серверных приложений. Для этого нужно создать две
программы: одна будет работать в Windows Phone, а другая может быть
запущена на любом компьютере, подключённом к Интернету, или даже в
"облачной" системе.
1.3. Выполнение программ в Windows Phone
Переключение приложений Windows Phone
Экран мобильного устройства недостаточно большой для отображения
сразу двух программ, поэтому нет необходимости выполнять
одновременно несколько программ. Поэтому вместо одновременной
работы нескольких приложений в Windows Phone реализован механизм
переключения приложений.
Когда пользователь запускает приложение, телефон не выполняет
никакое другое приложение. Запущенные в этот момент приложения
останавливают свою работу и ждут своей очереди. При этом,
пользователь может быстро переключаться между активными
приложениями.
Следует учесть, что в любой момент времени программа может
прервать свою работу и освободить ресурсы системы для другой
программы. Если пользователь снова вызовет остановленное
приложение, оно должно продолжить работу с того же самого места.
Операционная система Windows Phone использует технологию
"быстрого переключения приложений", когда приложение сохраняется в
памяти, пока оно ожидает своего вызова. В этой ситуации у программы
остаются нетронутыми вся область память и ресурсы до тех пор, пока
21
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
программа не возобновит работу. Поскольку пространство для
приложений ограничено, приложение будет удаляться из памяти, если
свободной памяти больше не останется. Приложение, которое должно
быть снова загружено в память, потратит чуть больше времени для
возобновления работы.
Фоновые задачи
Ограничения использования процессора и срока службы аккумулятора
затрудняют выполнение нескольких процессов в телефоне. Windows
Phone позволяет приложениям выполнять фоновые задачи.
Фоновая задача может начать работу, когда основное приложение не
запущено. Фоновые задачи запускаются в управляемой среде. Если в
телефоне выполняется несколько активных фоновых задач, это не
оказывает сильного влияния на работу телефона. Фоновые задачи могут
использоваться для воспроизведения музыки в фоновом режиме,
передачи файлов, периодических обновлений и обработки большого
объёма данных.
Фоновые задачи не видны пользователям телефона, хотя пользователи
могут видеть, что они работают, и управлять активными задачами.
Фоновая задача может выдать пользователю предупреждение о
событии, отправив уведомление или обновив изображение на "живой
плитке". В этом случае пользователь может запустить приложение,
чтобы получить подробную информацию.
Windows Phone и управляемый код
Раньше для выполнения программы в компьютере требовалось просто
запустить её. Файл, содержащий инструкции программы, загружался в
память, и затем компьютер последовательно выполнял инструкции.
Такой подход является простым, но чреват проблемами.
Первая проблема состоит в том, что для компьютерных систем разных
типов требуются разные файлы инструкций. Раньше производители
компьютеров выпускали аппаратные средства, которые понимали
22
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
особый набор бинарных инструкций, и не было возможности взять
программу, созданную для аппаратных устройств одного типа, и затем
запустить её в устройстве другого типа.
Вторая проблема состоит в том, что если инструкции написаны
неграмотно или содержат опасный код, компьютер всё равно их
выполняет. Неграмотные инструкции в файле, который загружается в
память, снижают быстродействие аппаратных средств компьютера.
Опасные инструкции могут заставить программу повреждать другие
данные в компьютере.
Промежуточный язык Microsoft (MSIL — Microsoft Intermediate Language).
В Microsoft .NET эти проблемы решаются введением промежуточного
языка для описания действий, которые программа должна выполнить.
При компиляции программы на C# компилятор создаёт файл,
содержащий инструкции на этом промежуточном языке. При запуске
программы эти инструкции снова компилируются — на этот раз в
низкоуровневые инструкции, понятные целевому аппаратному
обеспечению. Во время процесса компиляции инструкции проверяются
на безопасность, и при работе программы их выполнение
отслеживается исполняющей средой.
Программы на Microsoft .NET составляются из отдельных компонентов,
называемых сборками. Сборка содержит код MSIL вместе с любыми
ресурсами, которые использует код, например, изображения, звуки и др.
Сборка может быть либо исполняемым файлом, который можно
запустить, либо библиотекой, которая предоставляет приложению
ресурсы. Windows Phone может работать с исполняемыми файлами и
библиотеками на C#, созданными любым .NET-совместимым
компилятором. Можно написать часть кода приложения на другом
языке, например Visual Basic, C++ или F#. Программные библиотеки,
созданные на этих языках, можно использовать в приложениях для
телефона.
Идея .NET состоит в том, чтобы предоставить единую основу для
выполнения кода, который не зависит от аппаратного обеспечения или
языка программирования. Стандарты для .NET определяют
формирование типов данных и синтаксис языков C# и Visual Basic.NET.
Компиляция "на лету". Когда нужно запустить программу, требуется как-
23
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
то преобразовать MSIL-код (который не зависит от компьютерного
оборудования) в инструкции машинного кода, которые может
выполнить процессор конкретного компьютера. Этот процесс
компиляции называют компиляцией "на лету" (JIT — Just-in-time),
потому что машинный код для целевого устройства компилируется из
инструкций на промежуточном языке непосредственно перед их
выполнением. Подход, при котором программа запускается в
управляемой среде, называется управляемым кодом. Компиляция
происходит непосредственно перед запуском программы: пользователь
телефона выбирает программу из стартовой страницы, MSIL-код
загружается из хранилища, и затем происходит компиляция.
Недостаток этого подхода состоит в том, что, вместо того чтобы просто
запустить файл, компьютер должен выполнить дополнительную работу.
Он должен загрузить MSIL-код, скомпилировать его в машинный код и
следить за тем, какие действия выполняет программа при работе. К
счастью, современные процессоры (включая процессор платформы
Windows Phone) могут выполнять эти действия без заметного снижения
производительности.
Преимущество заключается в том, что один и тот же промежуточный
файл кода может быть загружен и выполнен на любом устройстве, в
котором работает система .NET. Можно запустить одну и ту же
программу на мобильном устройстве, компьютере под управлением
Windows или Xbox 360 — даже при том, что у этих платформ абсолютно
разные операционные системы и оборудование.
Другое преимущество состоит в том, что этот процесс загрузки может
включать средства проверки подлинности программ. .NET
предоставляет механизмы, которыми используются для подписи
программ с помощью криптографических методов, которые затрудняют
несанкционированное изменение программы или создание
"поддельных" версий вашего кода. Разработчики приложений для
массового использования используют уникальный ключ для
шифрования для подписи создаваемых приложений.
Наконец, использование промежуточного языка означает возможность
использования нескольких языков программирования. Хотя основными
программными инструментами для Windows Phone являются Visual Studio
24
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
и C#, можно использовать скомпилированный код, созданный на
любом языке программирования, который содержит .NET-компилятор.
Если есть готовые программы на C++, или даже на F#, можно
использовать библиотеки кода этих программ в приложениях для
Windows Phone. Однако, в первую очередь для создания программ
используется язык C# и технологии Silverlight или XNA.
Управляемый код. Программы для Windows Phone запускаются в
управляемой среде, которая работает в операционной системе.
Программам не предоставляется прямой доступ к аппаратным
средствам, что не позволяет создавать программы, которые приводят к
неправильной работе телефона.
Как следует из вышесказанного, в описанном подходе есть свои
преимущества и недостатки. Преимущество состоит в том, что
достаточно изучить только один язык программирования (C#), чтобы
создавать приложения для нескольких платформ. Созданные программы
защищены от потенциальных угроз повреждения со стороны других
программ, и можно быть уверенным, что работа программного
обеспечения защищена от внешних воздействий.
Недостаток заключается в том, что всё это происходит за счёт
дополнительной работы системы, в которой запускаются приложения.
Кроме загрузки программы в память и выполнения её инструкций
осуществляется проверка её подлинности и компиляция "на лету" в
машинные инструкции. В результате, пользователю придётся при
запуске приложения некоторое время ожидать появления первого окна
программы. К счастью, мощность Windows Phone снижает эти задержки,
но очень большие программы лучше разделить на отдельные части,
чтобы они загружались постепенно.
1.4. Разработка приложений для Windows Phone
Приложения для Windows Phone создаются точно так же, как и
приложения для настольных компьютеров под управлением Windows.
Для этого используется интегрированная среда разработки (IDE —
Integrated Development Environment) Visual Studio. Можно отлаживать
запущенную в устройстве Windows Phone программу так же легко, как и
программу для компьютера. Также можно создавать решения, которые
25
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
совместно используют компоненты настольной системы, Windows
Phone, и даже платформы Xbox.
Эмулятор Windows Phone
В состав среды проектирования Windows Phone входит эмулятор,
который позволяет использовать функции Windows Phone прямо в
настольной системе. Если у вас есть компьютер, который поддерживает
мультисенсорный ввод, вы можете использовать эту функцию в
эмуляторе для проверки правильности обработки мультисенсорных
жестов в ваших программах для Windows Phone.
Эмулятор является программной копией устройства Windows Phone,
которая ведёт себя как реальный телефон. При этом, программы,
работающие в эмуляторе, используют мощность компьютера, которая
может быть намного больше, чем у процессора телефона. Эмулятор
Windows Phone имеет вид, представленный на рис. 1.1.
26
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 1.1. Эмулятор Windows Phone
Эмулятор позволяет проверить реакцию программ на перемещение и
поворот "виртуального" телефона на экране компьютера. Также можно
предварительно записать последовательность движений, что позволит
27
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
выполнять повторные тесты, используя те же движения или жесты.
Также возможна эмуляция местоположения. Можно выбрать на карте
желаемое "местоположение" эмулятора телефона. Также можно ввести
пути для перемещения телефона и затем воспроизвести их — так можно
создавать поездки для тестирования приложений для определения
местоположения.
Программный доступ к средствам Windows Phone
Платформа Windows Phone предоставляет библиотеки ресурсов
программного обеспечения, которые позволяют программам
использовать имеющиеся в устройстве функции. Программы могут
использовать камеру телефона, совершать телефонные звонки и
отправлять SMS-сообщения. Также они могут использовать средства
для определения местоположения телефона для создания
геолокационных приложений и приложений для навигации.
Приложения могут вызывать функции телефона, используя задачи
запуска, которые позволяют программе вызывать другие приложения, и
задачи выбора, которые могут выбирать системные объекты и
передавать их в приложение.
Приложения телефона могут использовать протокол TCP/IP для
подключения к серверам в Интернете. Программы могут использовать
веб-сервисы и устанавливать REST-подключения к узлам. В текущей
версии операционной системы отсутствует поддержка прямых
подключений к другим телефонам с помощью сокетов.
Silverlight и XNA
Приложения для Windows Phone можно создавать на основе технологии
Silverlight или XNA. Если вы создаёте приложение, например, текстовый
процессор, почтовый клиент или калькулятор, то вы можете
использовать Silverlight. Silverlight предоставляет набор средств для
создания таких программ. Если вы создаёте игру, то можете
использовать XNA. XNA предоставляет средства для создания 2D и 3D
28
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
игр с высокой производительностью.
Можно и наоборот — создать калькулятор в XNA или простую игру
(например, головоломки со словами) в Silverlight В частности, Silverlight
идеально подходит для игр с небольшими требованиями по графике,
либо использующих векторную графику, а не растровую, либо скорость
которых зависит от реакции пользователя, а не таймера. А XNA бывает
сложно использовать в тех задачах, где обычно применяется Silverlight.
Реализация окна списка на XNA может быть интересной для некоторых
разработчиков, но для многих программистов это довольно сложная
задача.
Тип создаваемого приложения выбирается при создании нового
проекта в Visual Studio. Приложение может совместно использовать
средства Silverlight и XNA. Можно создать программу на Silverlight со
страницей, содержащей игру на XNA. Можно создать меню и
пользовательский интерфейс для игры в Silverlight, а игровой процесс —
в XNA. Также можно добавить элементы Silverlight поверх запущенной
игры XNA.
Хранение данных в Windows Phone
Часто приложениям нужно сохранять данные. Некоторые данные
являются простыми, например, данные конфигурации, такие как размер
экрана. Другие элементы будут сложными, например, список рекордов
или контрольная точка в игре. Также может понадобиться сохранять
больше информации, которая должна быть структурирована, например
база данных клиентов или продуктов. Windows Phone предоставляет
подходящее хранилище для данных.
Изолированное хранилище. Изолированное хранилище называют так,
потому что область для хранения данных одного приложения
изолирована от остальных приложений. Когда программа установлена в
Windows Phone, ей предоставляется доступ к месту хранения, полностью
изолированному от других. Такое хранилище позволяет сохранять
настройки программы в виде пар ключ—значение. Приложения также
могут создавать целые иерархии файлов в пределах своего участка
изолированного хранилища.
29
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Программа Isolated Storage Explorer может использоваться для просмотра
папок и файлов в изолированном хранилище при разработке
приложения, чтобы вы могли удостовериться, что они содержат
правильные данные.
Локальная база данных. Базой данных называют коллекцию данных,
которыми управляет программа. Базы данных используются для
создания программ, которые сохраняют и управляют большими
объёмами данных. В Windows Phone есть встроенный сервер базы
данных. Он позволяет создавать приложения, которые хранят
структурированные данные.
Приложению Windows Phone предоставляется доступ к локальной базе
данных SQL, где они могут хранить большое количество
структурированных данных. Приложение может создавать запросы,
используя библиотеки LINQ (интегрированный язык запросов),чтобы
извлечь и изменить данные в базе данных. Фактически файл базы
данных находится в изолированном хранилище приложения.
Средства разработки
Необходимые для разработки приложений инструменты являются
свободно распространяемыми. Можно загрузить Windows Phone SDK и
начать писать приложения для Windows Phone буквально в течение
нескольких минут. Те разработчики, которые приобрели Visual Studio
2010, могут использовать все средства для разработки приложений для
мобильных устройств, установив дополнительно плагин Windows Phone
SDK. Windows Phone SDK доступен на сайте : http://create.msdn.com- http://
create.msdn.com. Для создания интерфейса приложений Silverlight можно
использовать бесплатную версию Expression Blend, которая поставляется
вместе с Windows Phone SDK.
Приложения для компьютеров обычно не ограничиваются
производительностью центрального процессора. Мощность
процессоров в компьютерах и ноутбуках означает, что довольно
неэффективный код все ещё будет пригодным. Однако, для Windows
Phone важно, чтобы программы были быстрыми и эффективными,
насколько это возможно, и в то же время не сильно разряжали батарею.
30
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Windows Phone SDK содержит средства для анализа
производительности, которые собирают информацию о том, как
программы используют аппаратные ресурсы. Это позволяет
определить, какие методы в программе необходимо оптимизировать для
повышения их быстродействия.
Windows Phone Marketplace
Программы для Windows Phone можно продавать и устанавливать через
портал партнёрских решений для Windows Phone — Windows Phone
Marketplace. Все программы, размещённые в Marketplace, отвечают
минимальному набору требований надёжности, эффективности и
нормам этики.
Если вы хотите продать созданное вами приложение, вы должны быть
зарегистрированным разработчиком и предоставить свою программу
для одобрения. Регистрация разработчика стоит $99, но студенты могут
зарегистрироваться бесплатно по программе Dreamspark. Разработчики
могут зарегистрировать свои устройства Windows Phone как устройство
разработчика. Visual Studio может загружать приложения в устройство
разработчика и позволяет отлаживать программы, работающие на
физическом устройстве.
Вы можете распространять бесплатные приложения так же, как и
платные. Зарегистрированный разработчик может бесплатно
разместить в Marketplace до 100 бесплатных приложений. Если вы
хотите распространить более 100 бесплатных приложений, вы должны
заплатить по $20 за каждое дополнительное бесплатное приложение.
Вы можете также создать приложения, у которых есть
"демонстрационный" режим, которые могут быть преобразованы в
"полную" версию после их покупки. Программа может определить,
работает она в полном или демонстрационном режиме.
Когда вы предоставите приложение для продажи в Marketplace, оно
пройдет процесс одобрения, чтобы удостовериться, что оно безопасно
для использования и работает так, как ожидается. Если процесс
одобрений завершится неудачей, то вам выдадут диагностический отчёт.
Перед тем как загрузить своё приложение, вы должны прочесть
31
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
требования для сертификации.
Средство тестирования. Windows Phone SDK содержит средство для
тестирования, которое может использоваться для предварительного
тестирования приложения перед тем, как оно будет загружено в
Marketplace. Это средство автоматически синхронизируется с
процессом одобрения Marketplace, и если процесс изменится, то
инструмент будет обновлён в соответствии с этими изменениями.
Средство тестирования работает автоматически и выполняет такие же
тесты, что и команда тестирования. Это увеличивает шансы на то, что
поданное приложение будет одобрено с первого раза.
Закрытые бета-версии. Один из способов определить качество
приложения или игры состоит в том, чтобы предоставить его группе
людей и узнать их мнение. Можно создать специальную версию
продукта и предоставить возможность скачать её до 100 пользователям.
Тестеры могут использовать программу в течение 90 дней, и за это
время предоставить свой отзыв о программе.
Краткие итоги
1. Windows Phone является мощной вычислительной платформой.
2. Все устройства Windows Phone соответствуют базовым
требованиям спецификации. Требования включают определённый
размер экрана, ёмкостный сенсорный ввод, который может
отследить, как минимум, четыре касания, поддержку GPS,
ускоритель трёхмерной графики, камеру высокого разрешения и
достаточный объём памяти для хранения данных и программ.
3. Устройство Windows Phone подключается к компьютеру через
программное обеспечение Zune, которое предоставляет
компьютеру систему управления мультимедиа контентом и
позволяет синхронизировать его с телефоном.
4. Система Windows Phone может использовать сетевые службы для
получения уведомлений, определения местоположения и
выполнения поиска.
5. При разработке программы для Windows Phone программное
обеспечение Zune используется для передачи программ в
устройство для проведения тестирования. Программное
обеспечение Zune также используется для обновления
32
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
встроенного программного обеспечения телефона.
6. Операционная система Windows Phone поддерживает
многозадачность, но для повышения производительности
активным может быть только одно приложение. Однако,
приложения могут создать свои собственные "фоновые агенты",
которые могут выполнить определённые задачи, когда
приложение не запущено. Windows Phone также поддерживает
Быстрое переключение приложений, который позволяет быстро
возобновить работу запущенных приложений.
7. Windows Phone запускает программы, скомпилированные в
"промежуточный код" (MSIL). MSIL-код компилируется в
телефоне непосредственно перед запуском программы. Сами
программы запускаются управляемой среде, которая не позволяет
им напрямую использовать оборудование телефона.
8. Приложения для Windows Phone можно создавать на основе
технологий Silverlight и XNA на языке C# в среде Visual Studio
2010. Программисты могут использовать эмулятор Windows
Phone, который работает на компьютере под управлением
Windows и эмулирует работу среды Windows Phone.
9. Программы имеют доступ ко всем функциям телефона и могут
совершать звонки, отправлять SMS-сообщения и т.д.
10. Windows Phone SDK может использоваться для создания
приложений для Windows Phone и доступен на сайте: http://
create.msdn.com. Однако, чтобы установить приложения в
телефоне, вы должны быть зарегистрированы как разработчик
приложений для Windows Phone. Это стоит $99 в год, но для
студентов регистрация бесплатна по программе Microsoft
Dreamspark. Зарегистрированный разработчик может продавать
свои приложения на Windows Phone Marketplace.
Вопросы
1. Каковы аппаратные требования к устройствам Windows Phone?
2. В чём преимущество использования сенсорного экрана
емкостного типа по сравнению с резистивным?
3. Какие устройства Windows Phone позволяют телефону определять
своё местоположение?
33
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
4. Какие аппартные кнопки есть у устройств Windows Phone и какие
функции они выполняют?
5. Какие типы сетевых подключений поддерживаются в Windows
Phone?
6. С какими программами и службами может взаимодействовать
Windows Phone?
7. В чём идея "быстрого переключения приложений"?
8. Каковы отличия фоновых задач от программ?
9. Как выполняется компиляция и запуск программы в Windows
Phone?
10. Для чего используется эмулятор Windows Phone?
11. Как приложение может использовать функции телефона?
12. Для чего используются технологии Silverlight и XNA?
13. Какие средства для хранения данных есть в Windows Phone?
14. Какие инструменты можно использовать для создания
приложений для Windows Phone?
15. Для чего нужен Windows Phone Marketplace?
Упражнения
Ваша компания планирует создать приложение для адвокатов.
Приложение должно хранить и управлять информацией о времени,
которое тратит их персонал на работу с клиентами. Менеджер вашей
компании побеседовал с потенциальными покупателями продукта и
предоставил следующую информацию.
• Система будет использоваться юридическим штатом, чтобы
поминутно отслеживать действия сотрудников.
• Первоочередные задачи системы — предоставление актуальной
информации, её надёжное хранение и простота использования.
• Программа будет подключаться к нашим серверам тайм-
менеджмента и загружать расписания работы и информацию о
клиентах в телефон в начале каждого дня.
• В течение рабочего дня пользователи будут вводить информацию
о своих действиях, и в конце дня телефон должен загружать эту
информацию обратно на сервер.
• Периодически будут возникать неотложные случаи, которым
необходимо уделять внимание, и наша система должна отправлять
34
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
сообщение сотрудникам о возникновении подобных ситуаций.
• Иногда персонал будет участвовать во встречах за пределами
офиса, и при этом система также должна отслеживать их
действия.
• Ваша компания планирует использовать в телефонах ещё
несколько приложений, включая юридический словарь и
интерактивную юридическую систему. Новое приложение должно
работать одновременно с этими программами.
• Мы также хотели бы использовать телефонные устройства в
качестве диктофона, чтобы делать аудио- и видеозаписи встреч с
клиентами с высоким качеством. К записям будут добавляться
теги, и они будут загружаться на наши сервера. Записи будут
занимать примерно 100 Мб данных за один час.
• Наше приложение должно работать совместно с другими
приложениями в устройстве, которые клиенты могут загрузить.
• Компания иногда должна отправлять информационное
"сообщение дня" с корпоративного веб-сайта. Приложение
должно принимать и выводить эти сообщения на экран. В идеале,
это должно происходить, даже когда приложение не запущено.
• В будущем может понадобиться отслеживать местоположение тех
сотрудников, которые выезжают за пределы офиса.
Ваш менеджер попросил вас исследовать платформу Windows Phone как
потенциальное устройство для выполнения поставленных задач. Вы
должны предоставить ответы на следующие вопросы:
1. Могут ли возникнуть какие-либо проблемы при использовании
телефона для решения этих задач?
2. На основе какой технологии следует создать приложение: Silverlight
или XNA?
3. Какой тип сетевого подключения должен использоваться для
распределения расписания и получения отчётов?
4. Следует ли ограничить владельцев телефонов возможностью
запуска только одного нашего приложения?
5. Достаточно ли в телефоне памяти для хранения данных для
обслуживания 10 встреч в день?
6. Есть ли в Windows Phone какие-либо особенности, которые можно
использовать для дальнейшего улучшения приложения?
7. Есть ли у платформы какие-либо ограничения, которые в будущем
35
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
могут привести к изменениям технических характеристик
устройств?
8. Какой язык программирования вы предлагаете использовать для
разработки приложения? Можно ли использовать некоторые
библиотеки для обработки данных, которые некоторое время
назад были написаны на Visual Basic .NET?
9. Есть ли какие-то особые требования для создания и выполнения
фоновых задач в телефоне?
10. Можно ли передать какие-то операции в облачный сервер?
При ответе на каждый вопрос вы должны определить подходящие
средства и возможности платформы Windows Phone.
36
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Пакет Windows Phone SDK и эмулятор Windows Phone
Цель работы: знакомство с процессом получения и установки пакета
Windows Phone SDK, изучение возможностей эмулятора Windows Phone.
Основные теоретические сведения
Visual Studio 2010
Чтобы разрабатывать приложения для Windows Phone, потребуется Visual
Studio 2010 c Service Pack 1 редакции Professional или выше. Если у вас
нет Visual Studio 2010, при установке инструментария разработки для
Windows Phone автоматически будет установлена бесплатная версия
Visual Studio 2010 Express for Windows Phone, которая специально
предназначена для разработки приложений под Windows Phone.
Обе версии интегрированных средств разработки Visual Studio
предоставляют разработчику полноценные возможности по отладке на
устройстве и эмуляторе такие же, какие есть у разработчиков
приложений под настольную версию Windows.
Обратите внимание, что для того, чтобы отлаживать приложения на
физическом устройстве, помимо устройства и кабеля для его
подключения к компьютеру разработчика, на компьютере со средствами
разработки необходимо иметь установленную программу Zune (http://
zune.net). Также перед развёртыванием приложения и отладкой,
требуется зарегистрировать устройство в качестве устройства
разработчика и "разблокировать"' его с помощью утилиты Windows Phone
Developer Registration Tool, которая устанавливается вместе с Windows
Phone SDK.
Windows Phone SDK
Этот пакет, доступный для скачивания на сайте : http://create.msdn.com,
содержит всё необходимое для того, чтобы начать разработку
приложений. На текущий момент
37
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
последняя версия инструментария доступна в версии Windows Phone
SDK 7.1.1 и позволяет разрабатывать свои приложения и публиковать
их в Windows Phone Marketplace. Windows Phone SDK содержит
следующие компоненты:
• Windows Phone SDK
• Windows Phone Emulator
• Windows Phone SDK 7.1 Assemblies
• Silverlight 4 SDK and DRT
• Windows Phone SDK Extensions for XNA Game Studio 4.0
• Expression Blend SDK for Windows Phone 7
• Expression Blend SDK for Windows Phone OS 7.1
• WCF Data Services Client for Windows Phone
• Microsoft Advertising SDK for Windows Phone
Если у вас не установлена версия Visual Studio 2010 редакции
Professional, Expression Blend 4 или XNA Game Studio 4.0, в процессе
установки также будут установлены:
• Visual Studio 2010 Express for Windows Phone
• Expression Blend 4 for Windows Phone
• XNA Game Studio 4.0
Expression Blend и Expression Blend for Windows Phone
Expression Blend — это интерактивный визуальный дизайнер для XAML,
технологии описания интерфейса для приложений Silverlight и Windows
Presentation Foundation (WPF). Это отличное средство разработки,
которое позволяет просто манипулировать слоями, анимацией, стилями
и шаблонами. Это базовое средство разработки на XAML. Специальная
версия программы для создания дизайнов приложений под Windows
Phone, под названием Expression Blend 4 for Windows Phone доступна для
разработчиков бесплатно. Она закачается и установится в процессе
установки Windows Phone SDK, если у вас на компьютере нет полной
версии Expression Blend. Подробнее об Expression Blend 4 можно
прочитать на MSDN: http://msdn.microsoft.com/ru-
ru/library/cc296227.aspx.
38
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
XNA Game Studio 4.0
XNA Game Studio — это программное окружение, которое позволяет
разрабатывать в Visual Studio игры для Windows Phone, консоли Xbox
360 и компьютеров на базе Windows. Включает в себя XNA Framework,
представляющий собой набор библиотек на управляемом коде для
разработки игр. Подробнее можно прочитать на MSDN: http://
msdn.microsoft.com/ru-ru/library/bb200104.aspx.
Windows Phone Emulator
Несмотря на то, что Windows Phone Emulator не содержит полного
набора приложений доступных на реальном устройстве, он
предоставляет мощную среду, позволяющую практически полностью
разработать приложение в эмуляторе.
Эмулятор Windows Phone не поддерживает проигрывание
медиаконтента Zune. Эмулятор поставляется только с одним
встроенным приложением Internet Explorer 9 с поддержкой HTML5.
При этом, эмулятор позволяет тестировать звонки и отсылку SMS
сообщений, поддерживает несколько одновременных касаний при
использовании соответствующих мониторов, поддерживает симуляцию
камеры, геолокационных сервисов и акселерометра, а также позволят
делать снимки экрана.
Управление эмулятором Windows Phone с помощью клавиатуры
компьютера
Работать в эмуляторе Windows Phone можно с помощью мыши или
клавиатуры компьютера. Однако, клавиатура компьютера по
умолчанию недоступна. Чтобы задействовать клавиатуру, нужно нажать
кнопку Page Up или Pause/Break, а для отключения клавиатуры —
кнопку Page Down или Pause/Break. Если задействована аппаратная
клавиатура, недоступно изменение ориентации экрана эмулятора.
39
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Дополнительные материалы
Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/ff402563.
Задание к работе
1. Проверьте, установлена ли на вашем компьютере среда Microsoft
Visual Studio 2010. Для этого можно использовать панель
управления. Если среда Visual Studio не установлена, то при
установке пакета будет установлена среда Visual Studio 2010 Express
for Windows Phone.
2. Если среда Microsoft Visual Studio 2010 установлена, проверьте,
установлен ли пакет обновления 1 (SP1). Если нет, то загрузите его
с сайта http://www.microsoft.com/downloads/ru-ru/details.aspx?
FamilyID=75568aa6-8107-475d-948a-ef22627e57a5 и установите
перед установкой Windows Phone SDK. В этом случае инструменты
для создания приложений для Windows Phone будут добавлены к
существующей версии Visual Studio.
3. Загрузите с сайта для разработчиков приложений для Windows
Phone пакет Windows Phone SDK. Для этого выполните следующие
действия (обратите внимание, что в будущем последовательность
действий может измениться):
1. с помощью любого Интернет-браузера откройте сайт: http://
create.msdn.com - http://create.msdn.com;
2. нажмите ссылку Download the free tools;
3. нажмите ссылку Download the SDK;
4. в раскрывающемся списке выберите подходящий язык
(например, Русский);
5. ознакомьтесь с инструкциями по установке, после чего
нажмите ссылку Загрузить напротив имени файла
vm_web2.exe.
4. Запустите файл vm_web2.exe и следуйте указаниям программы
установки.
5. Запустите эмулятор Windows Phone. Для этого в меню Пуск
выберите пункт Все программы -> Windows Phone SDK 7.1 ->
Windows Phone Emulator. Обратите внимание, что в списке
приложений на стартовом экране присутствует только Internet
40
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Explorer.
6. Нажмите на значок стрелки, указывающей вправо, которая
находится в правом верхнем углу эмулятора. Откроется список
всех установленных приложений. Обратите внимание, что кроме
значка программы Internet Explorer в списке присутствует значок
Настройки.
7. Нажмите пункт Настройки. Откроется окно с двумя вкладками:
система и приложения. Переключиться между вкладками можно,
"пролистывая" экран влево и вправо.
8. Исследуйте доступные настройки системы. Для перехода к
предыдущему пункту и для выхода в главный экран используйте
кнопку Назад эмулятора. Обратите внимание на настройку язык
клавиатуры: с её помощью можно настроить клавиатуру на
возможность ввода текста на языке, отличном от используемого
по умолчанию.
9. Подведите курсор мыши к правому краю окна эмулятора. Появится
панель инструментов эмулятора. Исследуйте, для чего
предназначены кнопки панель инструментов.
10. Откройте программу Internet Explorer. Откройте в нём любую
страницу Интернета. Исследуйте поведение аппаратных кнопок
Назад, Пуск и Поиск.
11. Составьте отчёт о проделанной работе.
41
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Введение в Silverlight
Пользовательский интерфейс определяет, как выглядит программа.
Программы обычно содержат такие элементы пользовательского
интерфейса, как кнопки, текстовые поля, метки и изображения, с
которыми работает пользователь. Одна из задач программиста
заключается в создании дизайна и реализации поведения приложения,
чтобы предоставить пользователю возможность работать с программой
и получать результаты. В этой главе вы узнаете о том, что такое Silverlight и
как с его помощью создать пользовательский интерфейс для программ.
Презентацию к данной главе Вы можете скачать здесь - h ttpy/old.intuit.ru/
department/se/devmobwphn/3/02.pptx.
3.1. Проектирование программы Silverlight
Не всегда программисты при создании приложений занимаются созданием
интерфейса. Часто компании поручают эту задачу дизайнерам.
Программисты же должны добавить к дизайну программный код, который
выполнит необходимую работу. Silverlight позволяет разделить процесс
создания интерфейса и процесс создания программногокодаприложения.
Это позволяет программисту набросать начальный пользовательский
интерфейскоторый впоследствииможетизменитьдизайнер,сделавегоболее
привлекательным. Программист также может взять законченный дизайн
пользовательского интерфейса и затем запрограммировать поведение
каждого элемента.
Средства разработки
Проектировщикипользовательскогоинтерфейсаиспользуют инструменты
Expression Blend, а программисты — Visual Studio для созданиякода.Система
Silverlight предоставляет возможность объединить дизайн
пользовательского интерфейса и код. Хороший подходомдляпрограммиста
является использование шаблона "'заполнителя", который позволяет
запрограммироватьповедение
42
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
программы и позднее внести в приложение окончательный дизайн.
Windows Phone SDK (Software Development Kit — набор средств для
разработки программного обеспечения)ключает версии Visual Studio и
Expression Blend, которые можно использовать для создания кода и
дизайна приложения.
Metro-стиль
С точки зрения дизайна Windows Phone использует концепцию, которая
в руководствах по проектированию называется Metro-стиль. В нем
заложены принципы, которые определяют, как выглядят элементы
управления, и устанавливают ряд критериев, которым должны
соответствовать приложения Windows Phone. Эти особенности стиля
отражены во встроенных компонентах, которые могут использовать
программы.
Приложения, использующие кнопки, текстовые поля и другие
элементы, которые поставляются с Visual Studio, автоматически будут
придерживаться требований стиля. Это большая помощь тем, кто не
очень хорошо умеет проектировать дизайн. Конечно, можно полностью
переопределить свойства поставляемых компонентов, но при создании
приложений для Windows Phone лучше этого избегать. Существует
руководство по Metro-стилю, которое доступно по адресу: http://
msdn.microsoft.com/ru-ru/library/hh202915.aspx.
В этой главе мы будем использовать средства проектирования Silverlight в
составе Visual Studio. Они не дают всех возможностей создания
продвинутого графического интерфейса, которые предоставляет
Expression Blend, но для простых программ этих средств вполне
достаточно.
Элементы и объекты Silverlight
С точки зрения программирования каждый элемент на экране является
программным объектом. Объект включает поведение и данные. Если бы
43
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
мы создавали приложение для управления банковскими счетами, то мы
могли бы создать такой класс для хранения информации о счете:
public class Account
{
private decimal balance;
private string name;
public string GetName()
{
return name;
}
public bool SetName(string newName)
{
// в финальной версии здесь можно проверить корректность имени
name = newName;
return true;
}
// другие методы get и set
}
В этом классе хранится информация о количестве денег на банковском
счете (в свойстве balance) и имя владельца счета (в свойстве name). Для
создания новой записи можно использовать ключевое слово new:
Account rob = new Account();
rob.SetName('Rob");
Этот код создает новый экземпляр класса Account с именем rob. Затем
задается имя владельца счета — "Rob". Использование объектов — это
отличный способ представления сущностей, информацию о которых
нужно хранить и обрабатывать. С помощью объектов также можно
описать элементы на экране. Область отображаемого на экране текста
также имеет свойства: позиция на экране, цвет текста, сам текст и др.
На рис. 3.1 представлен интерфейс простой программы Сумматор,
которая находит сумму двух чисел. Числа вводятся в текстовые поля, и
при нажатии на кнопку сумма результат выводится в нижнее текстовое
44
А.И. Гарибов
поле.
Основы разработки приложений для мобильных устройств на платформе Windows Phone
СУММАТОР
сложение
сумма
Рис. 3.1. Экран программы Сумматор
Каждый отдельный элемент на экране относится к классу UIElement,
который представляет элементы пользовательского интерфейса. Экран
45
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
этого приложения содержит семь элементов:
1. Маленький заголовок СУММАТОР. Этот элемент называется
название приложения (Application Title).
2. Большой заголовок сложение. Этот элемент называется название
страницы (Page Title).
3. Верхнее текстовое поле, в которое можно ввести число.
4. Текстовый элемент, содержащий символ "+".
5. Нижнее текстовое поле, в которое можно ввести другое число.
6. Кнопка, при нажатии на которую происходит сложение.
7. Текстовое поле, которое при нажатии на кнопку отображает
результат.
Для каждого элемента задается положение на экране, размер текста и
другие свойства. Можно изменить цвет текста в текстовом поле,
выровнять его по левому краю, по правому краю или по центру поля, а
также задать другие свойства.
Указанные элементы имеют один из типов:
1. TextBox — позволяет пользователю вводить текст.
2. TextBlock — текстовый блок, который только отображает
информацию.
3. Button — кнопка, при нажатии которой вызывается событие.
Свойства этих элементов можно разделить на два типа: свойства,
которые должны быть у всех элементов, например положение на
экране, и свойства, которые являются специфичными для
определенного типа элемента. Например, только для элемента TextBox
можно задать позицию курсора для ввода текста. Можно представить
все элементы в иерархической структуре, как показано на рис. 3.2.
46
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 3.2. Структура классов элементов Silverlight
Такую иерархическую структуру создали проектировщики Silverlight.
Класс UIElement является классом, который может отображаться на
экране как визуальный объект и принимать данные, которые вводит
пользователь. На телефоне ввод информации выполняется
преимущественно с сенсорного экрана.
47
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
От класса UIElement наследуется класс FrameworkElement, который
содержит всю информацию, характерную для всех отображаемых
элементов. Все остальные классы наследуются от него. Наследники
имеют все свойства родительского класса и добавляют собственные.
Такая иерархия классов имеет ряд преимуществ. Если нужен
собственный тип текстового поля, можно расширить класс TextBox и
добавить в него нужные свойства и методы. При этом, система Silverlight
будет обрабатывать все эти элементы так же, как и обычные текстовые
поля, поскольку новые элементы сохраняют все свойства и поведение
исходного класса.
Необходимо помнить, что при изменении элементов на экране и
создании и управлении элементами на самом деле мы изменяем
свойства объектов. При проектировании пользовательского интерфейса
Silverlight мы задаем значения свойствам элементов, которые
используются для отображения элементов на экране.
Панель инструментов и графический конструктор
Создать приложение для Windows Phone очень легко. При создании
нового проекта Silverlight открывается пустая страница окна дизайнера,
на которую можно добавлять элементы с панели инструментов. Можно
создать интерфейс программы, просто перетаскивая элементы с панели
инструментов в окно дизайнера.
48
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 3.3. Окно дизайнера Visual Studio
На рис. 3.3 показан результат перетаскивания элемента TextBox с панели
инструментов в окно страницы Windows Phone. Если мы теперь
запустим программу, то увидим на экране эмулятора Windows Phone
страницу приложения с текстовым полем.
Процесс создания интерфейса страницы приложения для Windows Phone
такой же, как и приложения Windows Forms. Поскольку все средства
управления уже разработаны в стиле Metro, создаваемые приложения
автоматически становятся похожими на "правильные" Metro-
приложения.
49
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Управление именами элементов в Visual Studio
После добавления элементов на экран рекомендуется дать элементам
имена. Среда проектирования даст каждому элементу имена по
умолчанию, например, TextBox1, которые лучше изменить на
осмысленные, подобрав каждому элементу имя на основе его
назначения.
Для того чтобы изменить свойства элементов, нужно щелкнуть по
элементу в окне дизайнера и затем найти нужное свойство в области
свойств в Visual Studio.
50
А.И. Гарибов
Свойстве
Основы разработки приложений для мобильных устройств на платформе Windows Phone
■ А X
Тех Шок ffirstNunnberTeKtEax
У С войстаа Собьп нп
21Щ
Поиск
к !
л Общее
-
DstaContext
□
Пр низка...
4
Style
п
Ресурс..,
A
Text
♦
ТехШох
Ез Enacted
□
Ж
MaxLength
□
0
4 Макет
Widtti
♦
460
H eight
♦
72
HorizontalAlignme,,
♦
Left
VETtiralAlignment
♦
Тор
Margin
♦
0,6,0,0
!v
F
Padding
р
г
E
Min Width
□
0
MinHeifht
□
0
MaxWidth
р
Infinity
MexHeight
□
Infinity
HorizontalContent,.
р
Center
VerticalCortentAli..,
□
Center
FlowCh lection
□
LeftToftight
Grid.Colymn
□
0
Grid.Colum
nSpan
р
1
Grid .Row
□
0
1
Gnd.Ro.v5p
ап
р
1
Кисти
Текст
Рис. 3.4. Область свойств элемента TextBox
На рис. 3.4 изображена область свойств для верхнего элемента TextBox
на странице. Имя элемента отображается в верхней части окна.
Изменим имя этого текстового поля на firstNumberTextBox. При этом,
изменение значения свойства Name переопределит имя переменной,
51
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
связанной с этим элементом:
TextBox firstNumberTextBox;
Visual Studio отслеживает объявления фактических переменных, которые
представляют создаваемые отображаемые элементы, и нам не нужно
думать о том, где хранятся соответствующие объявления этих
переменных.
Свойства в элементах Silverlight
После переименования переменной, представляющей текстовое поле,
можно настроить ее свойства: ширину, отступы от краев и т.д. Значения
свойств отражают текущую позицию и размер элемента на экране. Если
перетащить элемент за его край, значения свойств изменятся. Если
изменить значения в окне Свойства, то элемент в окне дизайнера
автоматически изменит положение. Точно также происходит и при
создании приложения Windows Forms. Любые изменения в окне
дизайнера приводят к изменению содержимого объекта.
Свойства в Silverlight и свойства в C#. Когда мы говорим о свойствах
элементов Silverlight на странице (например, текст в поле TextBox), мы
фактически говорим о значениях свойств в классе, которые содержатся в
элементе TextBox. Другими словами, если программа содержит такое
объявление:
resultTextBlock.Text = "0";
запустится метод Set объекта resultTextBlock, который устанавливает
текст элемента TextBlock в соответствующее значение.
Классы и свойства в C#. Классы в C# могут содержать данные (имя
владельца банковского счета) и поведение (методы GetName и SetName,
которые позволяют программе узнавать имя и изменить это имя).
Данные в классе представляются в виде свойств, с которым работать
проще, чем использовать методы Get и Set. Они активно используются в
элементах управлении Silverlight.
Свойство — это член класса, который содержит значение. Можно
52
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
использовать переменные для хранения значений, но нужно сделать их
публичными (public), чтобы их можно было использовать в
приложениях. Например, банк может захотеть отслеживать
информацию о сотрудниках. Один из параметров, значение которого
может понадобиться отслеживать, — возраст владельца банковского
счета. Можно объявить в классе публичное поле:
public class Account
{
public int Age;
}
Класс Account содержит общедоступное поле Age. Можно получить
доступ к этому полю по его имени:
Account s = new Account();
s.Age = 21;
Проблема заключается в том, что в поле для хранения возраста можно
записать недопустимое значение:
s.Age = -100210232;
Поскольку поле является общедоступным, нет возможности
воспрепятствовать подобному действию.
Создание методов get и set. Чтобы контролировать использование
полей, можно создать методы get и set и сделать их общедоступными.
Они предоставляют возможность управлять доступом к полю. При
этом, поле Age лучше сделать закрытым (private), чтобы к нему нельзя
было получить прямой доступ за пределами класса.
public class Account
{
private int age;
public int GetAge()
{
return this.age;
}
53
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
public void SetAge(int inAge)
{
if ((inAge > 0) && (inAge < 120))
{
this.age = inAge;
}
}
}
Теперь можно контролировать доступ к нашему полю, но для этого
нужно написать много дополнительного кода. Для того чтобы получить
доступ к значению возраста, необходимо вызвать созданные методы:
Account s = new Account();
s.SetAge(21);
Console.WriteLine("Возраст: ” + s.GetAge());
Использование свойств
Свойства позволяют сделать управление данными более простым.
Свойство Age можно объявить следующим образом:
public class Account
{
private int ageValue;
public int Age
{
set
{
if ((value > 0) && (value < 120))
ageValue = value;
}
get
{
return ageValue;
}
}
54
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
}
Здесь значение возраста является свойством. В свойстве объявлены
секции для записи и чтения его значения. Описанные в этих секциях
действия эквиваленты описанным ранее методам. При этом, свойства
используются так же, как и обычные поля:
Account s = new Account();
s.Age = 21;
Console.WriteLine("Возраст: ” + s.Age);
Когда свойству Age присваивается значение, вызывается код секции set.
Ключевое слово value обозначает значение, которое присваивается
свойству. При чтении значения свойства Age происходит вызов кода
секции get. Такой подход сочетает преимущества использования методов
и позволяет работать со свойствами так же просто, как и с полями
класса.
Проверка правильности данных в свойствах. При попытке задать
недопустимое значение возраста (например, 150), приведенный выше
код выполнит проверку допустимости и отклонит это значение (никто
старше 120 лет не может иметь счет в нашем банке), оставив прежнее
значение возраста. Единственный способ узнать, было ли свойству
присвоено значение, заключается в проверке значения свойства после
этой операции:
Account s = new Account();
int newAge = 150;
s.Age = newAge;
if (s.Age != newAge)
Console.WriteLine("Значение возраста не было установлено");
Приведенный код пытается присвоить возрасту недопустимое значение
150, после чего проверяется, было ли это значение установлено. Если
бы для присваивания значения использовался метод Set, он мог бы
вернуть значение false в случае неудачи, а при использовании свойства
пользователь должен выполнить чуть больше дополнительной работы.
Различные способы считывания значения свойства. Свойства
позволяют выполнять и другие полезные действия.
55
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
public int AgeInMonths
{
get
{
return this.ageValue * 12;
}
}
Здесь описано новое свойство AgeInMonths. Оно предназначено только
для чтения, так как не содержит секции set. Оно возвращает значение
возраста в месяцах, используя то же самое значение, что и свойство
Age. Это означает, что можно использовать несколько различных
способов для получения одного и того же значения. Можно создать
свойства только для чтения без возможности их изменения напрямую, а
также свойства только для записи, хотя последние используются редко.
Свойства визуальных элементов. Свойства имеет смысл использовать в
описании банковского счета, где нужно защитить данные в объектах. Но
в программе Silverlight можно ввести любой текст в элемент TextBlock, и
вроде бы нет нужды проверять допустимость вводимого значения.
Выполнение этого кода замедлит процесс ввода значения. Так, сделав
значение Text публичной строкой, программа содержала бы меньше кода
и работала быстрее.
Но при этом, когда мы изменяем текст в элементе TextBlock, мы хотим,
чтобы текст на странице Silverlight также изменился, например, когда
программа Сумматор выведет на экран результат. Если бы программа
просто изменила значение поля, система Silverlight никак не могла бы
узнать, что сообщение на экране должно быть обновлено.
Однако, если Text сделать свойством, при обновлении значения
элемента TextBlock запустится соответствующий метод, который может
обновить хранимое значение текстового поля и вызвать метод для
обновления экрана, чтобы отобразить новое значение. Свойства
предоставляют возможность управления объектом при изменении его
значения. Простая операция:
resultTextBlock.Text = "0";
может привести к выполнению нескольких сотен операций C#,
56
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
поскольку сохранение нового значения в элементе TextBlock приводит к
запуску операций для обновления изображения на экране.
Дизайн страницы на Silverlight
Мы можем завершить страницу программы Сумматор, перетаскивая
нужные элементы на экран и устанавливая их свойства. Первым делом
после перетаскивания элемента на страницу рекомендуется определить
имя этого элемента. Признаком плохого стиля программы является
страница, содержащая много элементов с именами типа Button1, Button2
и т-д-
Разработка страницы является несложной задачей, которая сводится к
перетаскиванию элементов на страницу и настройке свойств каждого
элемента. Средства Silverlight позволяют добавить к элементам
графические свойства, которые могут сделать их прозрачными, добавить
изображения к их фону и даже сделать их анимированными.
3.2. Язык XAML
Проектирование дизайна на Silverlight состоит из манипуляций с
элементами с помощью дизайнера Visual Studio и присваивания
значений нужным свойствам элементов. Выполняя эти действия,
можно создать любой пользовательский интерфейс. интерфейс
приложения на Silverlight описывается с помощью языка XAML.
XAML означает "расширяемый язык разметки приложений" (eXtensible
Application Markup Language). Silverlight использует XAML для описания
внешнего вида страницы.
XAML определяет четкую границу между внешним видом приложения
(свойства отображаемых элементов) и поведением приложения (какие
действия выполняют элементы приложения).
Такое разделение является хорошей идеей, поскольку нельзя
гарантировать, что хороший программист будет хорошим дизайнером.
Обычно над созданием приложений работают и дизайнеры, и
программисты. При этом возникает проблема разделения работы между
57
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
ними: программист не может ничего делать, пока дизайнер не закончит
создание всех страниц приложения.
XAML решает эту проблему. Как только будут изложены требования
пользовательского интерфейса (сколько текстовых полей, сколько
кнопок, что будет на каждой странице и т.д.), проектировщик может
продолжать работу над внешним видом страниц, в то время как
программист может сосредоточиться на написании программного кода.
Файлы XAML содержат описание элементов пользовательского
интерфейса, и дизайнер может работать над их внешним видом и
расположением на странице, в то время как программист дополняет их
программным кодом. Программисту не нужно передавать дизайнеру
файлы с кодом, так как они отделены от дизайна, и наоборот.
Содержимое файла XAML. Файл XAML для страницы содержит
конструкции, которые описывают все элементы на странице. Каждое
описание содержать набор свойств. Строка XAML, которая описывает
элемент TextBox, может выглядеть так:
<TextBox Height="72" HorizontalAlignment='Left" Margin="8,19,0,0"
Name="firstNumberTextBox" Text="0" VerticalAignment=Top" Width^^O"
TextAlignment="Center" />
Если сравнить информацию в области свойств со значениями
атрибутов в коде XAML, можно установить их соответствие: имя
элемента TextBox — firstNumberTextBox, ширина — 460 и т.д. Страница
и область свойств синхронизируют значения, так как они используют
один и тот же XAML-файл страницы. При перемещении элементов по
странице редактор обновляет XAML; область свойств считывает
данные из этого файла и обновляет его значения.
XAML является декларативным языком. Он создан, чтобы быть
понятным для людей, поэтому у всех выше указанных свойств
понятные имена. Можно отредактировать текст XAML-файла в Visual
Studio для изменения внешнего вида страницы в дизайнере и значений
свойств. Непосредственное редактирование кода на языке XAML для
опытных программистов часто происходит намного быстрее, чем
перетаскивание элементов по экрану и редактирование в окне свойств.
Это особенно полезно, если нужно добавить большое количество
однотипных элементов. Для облегчения редактирования XAML-кода
58
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Visual Studio предоставляет поддержку Intellisense.
При компиляции программы XAML-файл преобразуется в файл,
содержащий низкоуровневые инструкции, которые создают
необходимые элементы для работы программы. Объявление элементов
страницы в файле XAML означает, что управление ими будет
осуществляться через объекты, которые может использовать программа.
Под понятием расширяемый язык разметки подразумевается, что можно
использовать правила языка для создания конструкций, которые
описывают что-либо. Английский язык для этого хорошо походит. Он
состоит из букв и знаков препинания, которые являются символами
текста английского языка. Также в языке есть правила (их называют
грамматикой), которые определяют, как составить слова и предложения.
Существуют различные виды слов. Есть существительные, которые
описывают предметы, и глаголы, которые описывают действия. Когда
появляется что-то новое, мы придумываем новые слова для того, чтобы
описать это.
Языки, основанные на XML (eXtensible Markup Language —
расширяемый язык разметки), являются расширяемыми в том смысле,
что мы можем придумать новые слова и фразы, которые подчиняются
правилам языка, и использовать эти новые конструкции для описания
того, что нам нужно. Их называют языками разметки, потому что они
часто используются для описания расположения элементов на
странице. Слово "разметка" первоначально использовалось при печати.
Практически самым известным языком разметки является HTML — язык
разметки гипертекста (HyperText Markup Language), который
используется во всемирной паутине для описания формата веб-страниц.
Программисты часто создают свои собственные форматы хранения
данных, используя XML. В качестве примера рассмотрим фрагмент
XML-файла, в котором представлен список рекордов:
<?xml version="1.0" encoding="us-ascii" ?>
<HighScoreRecords count="2">
<HighScore game="Breakout">
<playername>Rob Miles</playername>
<score>1500</score>
</HighScore>
59
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
<HighScore game="Space Invaders">
<playername>Rob Miles</playername>
<score>4500</score>
</HighScore>
</HighScoreRecords>
В этом файле элемент HighScoreRecords содержит два элемента
HighScore: один для игры Breakout и один для игры Space Invaders. Оба
элемента HighScore содержатся внутри элемента HighScoreRecords. У
каждого элементов есть атрибут, который определяет название игры, и
два вложенных элемента: имя игрока playername и количество
набранных очков score. Этот текст довольно легко понять.
В самой первой строке файла указана версия стандарта XML и
используемая кодировка символов. XAML использует правила
расширяемого языка разметки, чтобы создать язык, который описывает
компоненты на странице экрана.
<TextBox Height="72" HorizontalAlignment='Left" Margin="8,19,0,0"
Name="firstNumberTextBox" Text="0" VerticalAlignment='Top" Widtt^^O"
TextAlignment="Center" />
Если посмотреть на описание элемента TextBox, можно увидеть, что
создатели языка XAML просто создали имена полей, которые
соответствуют их требованиям.
XML-схема. Стандарт XML также содержит описания, как создать схему,
которая описывает особый формат документа. Например, в схеме для
информации о рекордах можно указать, что элемент HighScore должен
содержать элемент PlayerName, атрибут Score и необязательный атрибут
Date, в котором может храниться информация о дате установленного
рекорда.
Система стандарта формата и схемы означает, что разработчики могут
легко создавать форматы данных для конкретных целей. Этому
способствует факт, что существует много инструментальных средств,
которых помогают создавать документы и схемы. Среда .NET даже
предоставляет программам возможность сохранения объектов в виде
отформатированных XML-документов. Даже файл решения Visual Studio
хранится как XML-документ.
60
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Язык XAML на страницах приложений. В XAML-файле можно описать
целую страницу экрана Windows Phone. При создании нового проекта
Windows Phone автоматически создается новая страница с несколькими
элементами. При добавлении на страницу элементов увеличивается и
размер файла, поскольку для каждого элемента создается его описание.
Некоторые элементы являются контейнерами — они могут содержать
другие компоненты, например, элемент Grid может содержать набор
других элементов и располагать их в виде сетки. XAML-код также
может включать описания анимации и преобразований, которые можно
применять к элементам на странице для создания
усовершенствованных пользовательских интерфейсов.
При этом, в XAML не существует понятия наследования: нельзя создать
элемент XAML, который наследуется от другого. Элементы Silverlight
представляются в виде объектов, которые являются частью иерархии
классов, но когда они записаны в файле XAML, они все представляются
элементами, которые находятся на одном уровне иерархии.
С помощью XAML можно создать довольно сложный дизайн для
программ. Также существует специальный инструмент Expression Blend
для графических дизайнеров, который содержит расширенные средства
для создания графических интерфейсов.
3.3. Пример создания приложения Silverlight для
Windows Phone
Для того чтобы приложение выполняло какие-то действия, нужно
добавить код программы на языке C#, который выполнит необходимую
работу Когда Visual Studio создает файл XAML, который описывает
страницу приложения Windows Phone, вместе с ним создается файл кода.
В этот файл можно поместить код, который заставит приложение
работать. Созданный файл уже содержит начальный код, который может
выглядеть так:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
61
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
namespace PhoneApp1
{
public partial class MainPage : PhoneApplicationPage
{
// Конструктор
public MainPage()
{
InitializeComponentO;
}
}
}
Большую часть файла занимают инструкции using, которые позволяют
программе напрямую обращаться к классам без необходимости
указывать полный путь к ним. Например, вместо того чтобы записать
System.Windows.Controls.Button, можно написать просто Button, потому
что файл содержит строку
using System.Windows.Controls;
Единственный метод в программе — конструктор класса MainPage,
который вызывается при создании класса. В конструкторе вызывается
метод InitializeComponent, который создает экземпляры визуальных
элементов. Этот код автоматически создает Visual Studio на основе
XAML-файла, который описывает структуру страницы. Код этого
метода не рекомендуется изменять напрямую, поскольку это может
привести к ошибкам при выполнении программы.
Не нужно беспокоиться о том, как создаются и выводятся на экран
визуальные объекты. Достаточно использовать высокоуровневые
62
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
инструменты или научиться писать XAML-код для создания интерфейса
страниц.
Создание приложения
Рассмотрим процесс создания интерфейс для нашей программы для
сложения чисел. После того как мы добавим все необходимые элементы
и запустим приложение, мы можем выполнить в нем некоторые
действия. Мы можем ввести числа в текстовые поля и нажать на кнопку
сумма (рис. 3.5).
63
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 3.5. Экран программы Сумматор с открытой экранной
клавиатурой
Если прикоснуться к элементу TextBox, появится экранная клавиатура, с
помощью которой можно ввести числа в поля. Если мы прикоснемся к
64
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
другой области экрана, клавиатура исчезнет. Однако, при нажатии на
кнопку сумма мы не получим результат, поскольку приложение "не
знает", что оно должно выполнять вычисления.
Вычисление результата
Необходимо создать программный код для выполнения необходимых
вычислений и вывода на экран результата:
private void calculateResultQ
{
float v1 = floatParse(firstNumberTextBox.Text);
float v2 = float.Parse(secondNumberTextBox.Text);
float result = v1 + v2;
resultTextBlock.Text = resuft.ToStringQ;
}
Объекты TextBox работают со значением свойства Text, доступным для
чтения и записи. При записи значения в свойство Text текст в текстовом
поле изменится, а при считывании значения этого свойства программа
получает значение, которое было введено в это поле.
Текст имеет строковый тип, который нужно преобразовать в числовое
значение, для того чтобы можно было выполнить операцию сложения.
Для этого используется метод Parse, который принимает в качестве
параметра строку и возвращает записанное в строке число. Метод Parse
есть у каждого из числовых типов (int, float, double и т.д.). Наша
программа Сумматор может работать как с целыми, так и с дробными
числами. Метод Parse класса float преобразует введенные в текстовые
поля значения в численный тип и складывает их.
После этого, метод преобразует полученное значение в строку и
записывает ее в свойство Text элемента resuftTextBlock. Метод ToString
противоположен Parse. Он возвращает текст, который описывает
содержание объекта. Для типа float метод возвращает численное
значение, записанное в строке.
65
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
В результате, мы получили код, который выполняет вычисления и
получает результат. Теперь нужно, чтобы этот код выполнялся, когда
пользователь нажимает на кнопку сумма.
События и программы
Во времена консольных приложений программа всегда запускалась с
самого начала, работала некоторое время и затем завершала свою
работу. Но теперь в нашем распоряжении есть богатые
пользовательские интерфейсы с большим количеством кнопок и других
элементов для взаимодействия с пользователями. В этой ситуации
очень трудно написать программу, которая проверяла бы
последовательно каждый элемент интерфейса, чтобы увидеть,
попытался ли пользователь его использовать. Вместо этого, система
ожидает от этих визуальных элементов каких то действий.
Использование событий существенно облегчает создание программ.
Программа не должна проверять каждый элемент на экране, чтобы
узнать, выполнил ли пользователь над ним какие-то действия — вместо
этого программа просто отвечает на генерируемые события.
Чтобы заставить события работать, языку программирования нужен
способ представления ссылки на метод объекта, для чего в C#
используется механизм делегатов. Можно создать тип делегата, который
может обратиться к определенному методу, и создать экземпляр этого
делегата, который обращается к методу в объекте. Делегаты являются
мощным и полезным механизмом.
События в Silverlight
В C# событие отправляется объекту посредством вызова метода этого
объекта. В нашей программе Сумматор когда пользователь нажимает на
кнопку сумма, программа должна вызвать нужный метод, например,
метод calculateResult.
Можно использовать редактор Visual Studio: чтобы связать метод с
событием щелчка кнопки мыши, нужно дважды щелкнуть по этой
66
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
кнопке в окне дизайнера. При этом, Visual Studio устанавливает свойства
кнопки в XAML, для того чтобы связать кнопку с методом страницы.
Кроме этого, создается пустая версия этого метода-обработчика, и среда
переносит курсор к этому методу, чтобы можно было сразу начать
добавлять код, который должен выполняться при нажатии кнопки.
Теперь нужно просто добавить следующий код, который выполнит
необходимые действия:
private void calculateResultQ
{
float v1 = float.Parse(firstNumberTextBox.Text);
float v2 = float.Parse(secondNumberTextBox.Text);
float result = v1 + v2;
resultTextBlock.Text = resuit.ToString();
}
private void equalsButton_Click(object sender, RoutedEventArgs e)
{
calculateResultQ;
}
Созданному обработчику событий Visual Studio автоматически
присваивает имя, которое формируется из имени элемента, в конец
которого добавляется текст _Click. Таким образом, по этому имени
можно легко определить, каким образом он вызывается.
Теперь программа работает. Однако, если пользователь введет в
текстовое поле нечисловое значение, то программа сгенерирует
исключение.
Управление свойствами событий
Чтобы узнать, как происходит вызов событий, для начала рассмотрим
свойства кнопки сумма нашего приложения. Для этого нужно нажать на
кнопку в редакторе Visual Studio, и мы увидим информацию о ее
67
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
свойствах (рис. 3.6).
Рис. 3.6. Область свойств элемента Button
В области свойств есть две вкладки: Свойства и События. При нажатии
на вкладку События на экран выводятся события, которые может
сгенерировать этот элемент, и связанные с событиями методами (рис.
37).
68
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 3.7. События элемента Button
В этом окне событие Click связано с методом equalsButton_Click. Если
нужно прекратить связь метода с событием Click, то достаточно удалить
название обработчика в этом окне. Если попытаться подставить вместо
указанного имени метода произвольную строку, то программа не будет
скомпилирована, если метода с указанным именем не существует.
До сих пор мы руководствовались принципом, что отображаемые
свойства Visual Studio связывает с файлом XAML, который описывает
компоненты на экране. Мы можем проверить, что это так, рассмотрев
описание кнопки в файле XAML для страницы MainPage:
<Button Content="equals" Height="72" HorizontalAlignment='Left" Margin="158
Name="equalsButton" VerticalAlignment='Top" Width="160"
69
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Click="equalsButton_C]ick" />
Описание кнопки теперь содержит элемент, который связывает событие
Click с названием метода. Следует отметить, что, если в файле XAML
указано, что кнопка связана с методом, которого не существует,
программа не сможет правильно работать.
Краткие итоги
1. Silverlight предоставляет возможность создавать пользовательские
графические интерфейсы.
2. Пользовательский интерфейс Silverlight состоит из визуальных
элементов: текстовые поля, кнопки и другие.
3. Интегрированная среда разработки Visual Studio содержит окно
дизайнера, которое используется для добавления элементов
пользовательского интерфейса Silverlight на страницы приложения.
4. С точки зрения программного обеспечения, каждый элемент
пользовательского интерфейса представлен особым типом
объекта в иерархии классов, которая является частью Silverlight.
5. Дизайнеры могут изменять значения свойств элементов, изменяя
эти элементы в окне дизайнера Visual Studio или изменяя значения
свойств этих элементов.
6. Свойства используемых в программе элементов Silverlight хранятся
в текстовых файлах в формате XAML. Эти файлы обновляются
средствами проектирования и используются для создания
программных объектов, используемых в решении.
7. XAML (расширяемый язык разметки приложений) основан на
языке XML и определяет все свойства элементов дизайна на
странице. Он позволяет отделить дизайн и свойства элементов от
программного кода.
8. XML (расширяемый язык разметки) является основой для
создания языков для описания сущностей.
9. Элементы могут генерировать события, которые могут быть
связаны с методами программы на C#. Имя метода указывается в
XML-описании для элемента.
10. Методы, связанные с событиями, содержат бизнес-логику
приложения.
70
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Вопросы
1. Какие средства разработки можно использовать для создания
интерфейса приложений?
2. Что такое Metro-стиль?
3. Для чего предназначены свойства и методы?
4. Как создать интерфейс страницы приложения Silverlight?
5. Как можно изменить внешний вид элементов Silverlight на
странице приложения?
6. Для чего используется язык XAML?
7. Как обрабатывать события в приложении Silverlight?
Упражнения
Упражнение 1. Пользовательский интерфейс программы Калькулятор
времени
Ваша компания решила создать приложение для адвокатов. Приложение
должно хранить и управлять информацией о времени, которое тратит
их персонал на работу с клиентами. В настоящее время адвокаты
записывают в отчет количество минут, которые они потратили на
работу с клиентом, и эти отчеты обрабатываются вручную. После того
как адвокатам выдали телефоны на платформе Windows Phone, было
решено создать простой Калькулятор времени, который они смогут
использовать для расчета времени.
Адвокаты будут вводить время запуска и время окончания (в часах и
минутах), и программа должна выводит на экран количество минут
между этими отметками времени.
Ваш менеджер попросил Вас разработать пользовательский интерфейс
Silverlight для этого приложения:
1. Определите, какие элементы интерфейса Silverlight нужно
разместить на главной странице приложения.
2. Нарисуйте схему расположения элементов на форме.
3. Создайте "Руководство пользователя" для приложения.
4. Попытайтесь определить все возможные случаи ввода
71
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
недопустимых значений.
5. Добавьте описание действий приложения в случае ввода
недопустимых данных.
6. Создайте набор тестовых данных и результатов, которые должна
выдать программа, и оформите их в виде таблицы. Количество
тестов должно быть не менее 10.
Упражнение 2. Пользовательский интерфейс калькулятора времени
Один из менеджеров по продукции считает, что телефон должен
отправлять детализированную информацию о каждом временном
интервале в корпоративную систему так, чтобы информация о
проведенном времени могла обновляться автоматически. Менеджер
решил, что нужно отправлять следующую информацию:
• дата и время начала работы;
• дата и время окончания работы;
• название компании-клиента;
• местоположение клиента, если встреча происходит не в
помещении компании клиента;
• оценка качества работы, поставленная клиентом — целое число в
диапазоне от одного до пяти.
На сервер нужно отправлять отчеты, содержащие указанную
информацию о каждой рабочей встрече.
1. Создайте пример XML-файла, содержащий описания трех встреч.
2. Удостоверьтесь, что файл содержит записи о встречах в
помещении компании-заказчика, а также записи о встречах за
пределами компании.
72
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Создание простого приложения Silverlight
Цель работы: изучение визуальных элементов Silverlight для
проектирования интерфейса приложения.
Основные теоретические сведения
Среда разработки
После установки средств разработки Windows Phone SDK в диалоговом
окне Создать проект в Visual Studio появятся группы проектов для
Silverlight for Windows Phone:
После установки разработчику доступны следующие шаблоны
приложений Silverlight for Windows Phone:
• Windows Phone Application
• Windows Phone Databound Application
• Windows Phone Class Library
• Windows Phone Panorama Application
• Windows Phone Pivot Application
• Windows Phone Silverlight and XNA Application
• Windows Phone Audio Playback Agent
• Windows Phone Audio Streaming Agent
• Windows Phone Scheduled Task Agent
Windows Phone и Metro-дизайн
Платформа Windows Phone — не просто очередная платформа для
мобильных устройств. Она содержит в себе не только технологическую
составляющую, но и полностью проработанную концепцию дизайна
интерфейса и взаимодействия с пользователем под названием Metro-
дизайн или стиль Metro.
Если вы дизайнер или в вашей команде есть выделенный дизайнер, вы
можете воспользоваться всей мощью инструментария Expression Blend 4
73
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
или Expression Blend for Windows Phone, которая поставляется вместе с
Windows Phone SDK, но можно обойтись средствами, доступными в
Visual Studio.
Элементы Silverlight для приложений для Windows Phone разработаны с
учётом требований Metro-дизайна, поэтому все встроенные элементы
управления выполнены в Metro-дизайне. По умолчанию, приложения,
созданные из шаблонов из поставки Windows Phone SDK, работают,
выглядят и используют стили и шрифты в соответствии с Metro-
дизайном.
С другой стороны, возможностей стилизации элементов управления и
приложений, основанных на XAML, которые представляет Silverlight,
вполне достаточно, чтобы сделать своё приложение неповторимым и
узнаваемым, оставаясь в рамках стиля Metro.
Шаблоны приложений
Среди шаблонов проектов имеются три шаблона, представляющих
собой три основных стиля приложения для Windows Phone:
• Windows Phone Application
• Windows Phone Pivot Application
• Windows Phone Panorama Application
74
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 4.1. Шаблоны приложений для Windows Phone
Windows Phone Application — это аналог простого диалогового
приложения, у которого один основной экран, через который
происходит основное взаимодействие с пользователем.
Windows Phone Pivot Application — это некий аналог приложения с
закладками, где заголовок каждой закладки определяет содержимое.
Стандартный вариант использования — каждая закладка представляет
собой одни и те же, в целом, данные, но в разных представлениях и/или
с разной фильтрацией. Например, календарь, почтовый клиент и
настройки телефона. Шаблон использует элемент управления Pivot.
Windows Phone Panorama Application — приложение-панорама, в котором
зоны взаимодействия с пользователем также разделены на панели, но
доступны они через горизонтальную прокрутку; фоновое изображение
установлено сразу на всю панораму, она имеет общий заголовок,
который прокручивается медленнее, чем панели; контент соседней
панели справа виден при отображении текущей. Например, таким
образом реализованы хабы в Windows Phone: Контакты, Marketplace,
Фото, Музыка+видео и др. Шаблон использует элемент управления
Panorama.
Создание простого приложения
В диалоге Создать проект Visual Studio выберем Visual C#, Silverlight for
Windows Phone и шаблон Приложение Windows Phone.
75
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 4.2. Диалоговое окно Создать проект
В диалоге выбора целевой операционной системы выберем Windows
Phone OS 7.1
Рис. 4.3. Список доступных версий операционной системы Windows
Phone
7(7
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
После создания проекта, окно Visual Studio примет следующий вид:
Рис. 4.4. Окно Visual Studio с новым приложением для Windows Phone
Рассмотрим структуру проекта в обозревателе решений Visual Studio:
77
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 4.5. Обозреватель решений Visual Studio
По умолчанию новый проект содержит следующие файлы:
• AppManifest.xml — файл манифеста, необходимый для генерации
XAP файла, в который упаковывается приложение для
развёртывания на телефоне;
• AssemblyInfo.cs — ещё один конфигурационный файл, в котором
определяются некоторые метаданные главной сборки
приложения;
• WMAppManifestxml — файл метаданных, который содержит
разнообразные настройки приложения: заголовок, задание первой
страницы, пути к значкам, определение необходимых системных
78
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
возможностей и т.д.;
• App.xaml — файл ресурсов приложения. Здесь располагаются
глобальные ресурсы или глобальные события (которые происходят
при запуске приложения). Этот файл также является точкой входа
приложения;
• App.xaml.cs — файл отделённого кода для App.xaml. Здесь можно
обрабатывать события и ошибки уровня приложения;
• ApplicationIcon.png — картинка, которая будет значком приложения
в телефоне. Этот файл является первым, что увидят пользователи
при работе с приложением;
• Backgrounding — картинка, которая используется, когда
приложение закреплено на стартовом экране телефона;
• MainPage.xaml — главная страница приложения. Эта страница
представляет интерфейс, который видит пользователь при запуске
приложения;
• MainPage.xaml.cs — файл кода страницы MainPage.xaml;
• SplashScreenImage.jpg — картинка, которая отображается во время
загрузки приложения.
Файлы XAML определяют интерфейс приложения. На самом деле это
просто XML файлы с языком разметки XAML.
Несмотря на то, что это самый простой проект, он содержит все
ключевые элементы, которые содержат все остальные шаблоны и типы
проектов.
Обратите внимание, что часть настроек, представленных в виде
конфигурационных файлов, могут редактироваться в визуальном
интерфейсе редактирования настроек приложения.
Основные элементы управления
Чтобы создать простое приложение Silverlight для Windows Phone,
необходимо разместить на странице приложения визуальные элементы
пользовательского интерфейса. Визуальные элементы можно разделить
на несколько групп:
1. Элементы для ввода данных пользователем:
79
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
0 TextBox — используется для ввода как короткого, так и
многострочного текста;
° PasswordBox — специальный элемент для ввода пароля,
скрывает ввод пользователя;
° CheckBox — представляет собой элемент управления
"флажок". Может быть установлен или снят, опционально
можно включить поддержку "неопределённого" состояния;
° RadioButton — позволяет пользователю выбрать только
один вариант из нескольких. Сгруппированные элементы
управления (один GroupName) позволяют выбрать только
один вариант из группы;
° Slider — позволяет пользователю выбрать из нескольких
последовательных вариантов. Позиция соотносится со
значением свойства Value;
2. Элементы для указания выполнения действий:
° Button — кнопка, при нажатии пользователем генерирует
событие Click;
0 HyperlinkButton — кнопка, отображающая ссылку. При
нажатии переходит на ссылку, указанную в свойстве
NavigateUri;
3. Элементы для вывода данных на страницу приложения:
° TextBlock — позволяет отобразить простой текст, без
возможности редактирования;
° Image — позволяет вывести на экран изображение;
о ListBox — отображает список элементов, которые может
выбрать пользователь;
° ProgressBar — отображает текущий прогресс
пользователю;
4. Элементы для разметки страницы:
0 ScrollViewer — добавляет возможность прокручивания
дочерним элементам;
° Border — предоставляет другому элементу управления
рамку и/или фоновое изображение;
° StackPanel — позволяет располагать дочерние элементы
в один ряд по горизонтали или вертикали с автоматическим
выравниванием;
° Grid — является контейнером для других элементов
управления. Позволяет располагать и упорядочивать
80
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
дочерние элементы управления с привязкой к сетке;
° Canvas — определяет область, в рамках которой можно
явно расположить дочерние элементы с помощью
координат относительно области;
5. Специализированные элементы:
° Map — отображает карту Bing;
0 MediaElement — позволяет воспроизводить звуки или
видео;
° WebBrowser — отображает веб-страницу на языке HTML.
Дополнительные материалы
Windows Phone 7.5 Training Kit:
LabsYYourF irstWP 7Application\YourF irstWP 7App.html\html\
DocSet_386d610c-7ea0-473f-b375-e10429dfd675.html.
Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/hh202915.
Задание к работе
1. Определите, какую функцию будет выполнять создаваемое вами
приложение для Windows Phone (например, вычисление значения
функции, зависящей от нескольких переменных). Приложение
должно принимать данные от пользователя и при нажатии на
кнопку выводить на экран результаты.
2. Откройте среду Visual Studio и создайте проект приложения
Silverlight.
3. Откройте панель элементов. Определите назначения визуальных
элементов Silverlight.
4. Используйте необходимые элементы для создания интерфейса
страницы приложения в соответствии с выбранной функцией.
5. Запустите программу и проверьте правильность её работы.
6. Составьте отчёт о проделанной работе. Включите в отчёт
описание используемых элементов Silverlight и их свойств, а также
листинги программы.
81
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Управление решениями в Visual Studio
Для создания программ для Windows Phone используется среда Visual
Studio. В этой главе вы рассмотрите процесс создания и управления
проектами Windows Phone. Также вы узнаете, как запускать и отлаживать
программы для Windows Phone, используя эмулятор Windows Phone. Это
позволяет тестировать свои программы без необходимости иметь само
устройство. Кроме этого, вы узнаете, как Visual Studio управляет
файлами решений.
Презентацию к данной главе Вы можете скачать здесь - http://old.intuit.ru/
department/se/devmobwphn/5/03.pptx.
5.1. Проекты и решения в Visual Studio
Создание программ. При создании программы мы пишем ряд
инструкций на языке программирования высокого уровня. При
разработке приложений для Windows Phone большинство разработчиков
используют язык C#, но все основные принципы и интерфейс для
программирования приложений (API — Application Programmer Interface)
так же реализуются в языке Visual Basic .NET.
Компилятор — это программа, которая преобразует высокоуровневые
инструкции, создаваемые программистом, в инструкции более низкого
уровня для выполнения на компьютере. В среде Microsoft .NET
компилятор выдает код на промежуточном языке (MSIL),который при
запуске программы компилируется в машинный код.
Чтобы создать рабочую программу, нужен, как минимум, файл с
исходным кодом программы на языке C# (текстовый файл с
расширением .cs) и компилятор. Компилятор преобразует исходный
файл в исполняемый файл (двоичный файл с расширением .exe),
который может использовать система .NET для выполнения программы
на любой платформе. Использование MSIL означает, что один и тот же
исполняемый файл можно запускать на разных аппаратных платформах.
.NET SDK. Если вы хотите создавать программы для Windows, но не
хотите загружать полную версию Visual Studio, вы можете загрузить
компилятор .NET и необходимые библиотеки на сайте
82
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
http://msdn.microsoft.com/ru-ru/netframework/aa569263.aspx.
При установке .NET Framework можно использовать компилятор,
работающий из командной строки, который может преобразовать
исходные файлы на C# в исполняемые, используя консольные команды,
например:
csc MyProg.cs
Эта команда скомпилирует файл MyProg.cs и создаст файл с именем
MyProg.exe. Компилятор командной строки также доступен после
установки Visual Studio.
Можно использовать эти инструменты для создания очень больших
программ, но это довольно тяжелая работа. Для этого нужно создать
большие сложные команды для компилятора, и каждый раз при
создании новой версии программы нужно перекомпилировать каждый
исходный файл. Кроме этого, нужно самостоятельно управлять всеми
дополнительными файлами, которые нужны для работы программы. И
когда дело доходит до отладки программы, единственное сообщение,
которое выдаст система, — это текстовое сообщение об аварийном
завершении работы программы.
Windows Phone SDK. Вам не нужно загружать .NET SDK, если вы хотите
создавать приложения Windows Phone с помощью Visual Studio. Для этого
нужно только загрузить последнюю версию Windows Phone SDK с сайта
http У/create.msdn. com.
Windows Phone SDK установит сразу все необходимые инструменты для
создания приложений для Windows Phone: интерактивную среду
разработки, эмулятор Windows Phone и другие инструменты.
Инструменты также можно использовать для создания настольных
приложений и игр XNA для компьютеров под управлением Windows и
Xbox 360. Если в вашем компьютере установлена другая версия Visual
Studio 2010, после установки Windows Phone SDK в нее будут добавлены
новые типы проектов и инструменты.
Visual Studio. Visual Studio предоставляет единую среду для создания,
редактирования и запуска программ. Она управляет проектами и
решениями, которые объединяют все файлы программы, и позволяет
83
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
управлять их содержимым. Также среда предоставляет инструменты для
отладки программ. Visual Studio используется для создания приложений
для компьютеров так же, как и для устройств Windows Phone.
После установки Windows Phone SDK значок Microsoft Visual Studio 2010
появится в списке программ.
Среда Visual Studio содержит большое количество кнопок, меню и
инструментов, с которыми можно работать. Информацию об их
назначении можно получить в справочной системе.
В рамках Visual Studio рассматриваются термины проект и решение. Они
используются для организации создаваемых программ и систем. Visual
Studio не может запустить любой код программы, который не входит в
состав проекта или решения. Для начала можно использовать один из
встроенных шаблонов для разных типов проектов.
Простой проект Visual Studio
Проект является контейнером для набора программных файлов и
ресурсов, которые создают файл сборки. Самый простой проект
содержит единственный файл программы. Можно создать проект,
выбрав в главном меню Файл -> Создать проект.... Откроется
диалоговое окно Создать проект (рис. 5.1).
84
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 5.1. Диалоговое окно Создать проект
В диалоговом окне Создать проект показан список всех возможных
шаблонов проектов, которые поставляются с Visual Studio (на рис. 5.1
представлено окно Visual C# 2010 Express с установленным пакетом
XNA Framework SDK, в другой редакции Visual Studio набор проектов
может различаться). Шаблон — это заданный набор файлов, папок и
ресурсов, который используется в приложениях определенного типа.
Также можно создать собственные шаблоны проектов.
Если выбрать шаблон Консольное приложение, Visual Studio создаст
минимальный проект, который содержит единственный файл
программы с именем Program.cs. Этот файл содержит примерно такой
код:
using System;
using SystemCoilections.Generic;
using System.Linq;
using System. Text;
85
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
namespace SimpleProject
{
class Program
{
static void Main(string[] args)
{
}
}
}
Если запустить эту программу, Visual Studio скомпилирует класс Program
и затем запустит приложение, вызвав метод Main. Так работают
программы на C#. В результате сборки этой программы будет создан
файл Program.exe, который является программой для компьютера под
управлением Windows.
Создание программы из нескольких исходных файлов. Часто требуется
создать программу из нескольких файлов с классами. Это могут быть
отдельные файлы или часть библиотеки с кодом на языке C#, созданные
другими программистами. В обозревателе решений Visual Studio можно
добавить к проекту новый класс, например, Library.cs.
Созданный файл Library.cs теперь является частью проекта, и при
построении проекта Visual Studio скомпилирует этот файл вместе с
файлом Program.cs. Однако, в результате будет создан единственный
исполняемый файл с именем Program.exe. Поэтому только в одном из
этих файлов может быть метод Main, иначе компилятор не сможет
определить, какой из этих классов должен начать работу. Класс Library
изначально будет пустым:
using System;
using System.Collections.Generic;
using System.Linq;
using System. Text;
namespace SimpleProject
{
class Library
{
8(5
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
}
}
Можно создать экземпляры этого класса в методе Main:
namespace SimpleProject
{
class Program
{
static void Main(string[] args)
{
Library l = new Library ();
}
}
}
Пространства имен и проекты. Классы Library и Program находятся в
пространстве имен SimpleProject. Часто бывает удобно помещать
различные части системы в отдельные пространства имен. Это
особенно важно, если программы создают разные люди. Если
программист, который пишет код библиотеки, решает, что имя Save
подходит для создаваемого им метода, другой программист, который
работает над другим модулем той же самой программы, также может
использовать имя Save и для своего метода.
Пространства имен является логическим способом группирования
элементов. У них нет никакой привязки к физическому расположению
кода. Можно поместить класс библиотеки в отдельное пространство
имен просто, просто изменив его имя:
using System;
using SystemCollections.Generic;
using System.Linq;
using System. Text;
namespace SimpleLibrary
{
class Library
{
}
87
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
}
Класс Library теперь находится в пространстве имен SimpleLibrary. Но
попытка собрать проект приведет к возникновению ошибок (рис. 5.2).
Рис. 5.2. Окно с информацией об ошибках компиляции программы
Метод Main класса Program пытается создать экземпляр класса Library.
Этот класс больше не находится в пространстве имен SimpleProject, и
таким образом, возникают ошибки. К счастью, поле Описание списка
ошибок подсказывает, что возможно пропущена директива using. Можно
решить проблему, добавив директиву using, чтобы указать компилятору
на необходимость просмотра пространства имен SimpleLibrary, если
нужно найти класс:
using SimpleLibrary;
namespace SimpleProject
{
class Program
{
static void Main(string[] args)
{
Library l = new Library();
}
}
}
Другой способ решения проблемы — использовать полностью
определенные имена для получения доступа к ресурсам библиотеки:
SimpleLibrary.Library l = new SimpleLibrary.Library();
Необходимо помнить о том, что мы просто создаем имена элементов в
88
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
проекте, но не определяем, где они сохраняются. При построении
проекта Visual Studio будет просматривать все исходные файлы проекта
для поиска необходимых элементов.
Добавление ресурсов в проект
Если программа должна использовать ресурсы (например, изображение
для заставки программы), их также нужно добавить в проект. Можно
добавить растровое изображение таким же образом, как и новый класс.
После добавления изображения оно появится в обозревателе решений
(рис. 5.3).
Рис. 5.3. Список файлов проекта в обозревателе решений
Теперь решение содержит файл растрового изображения с именем
Bitmap1.bmp. Можно выбрать способ управления этим содержимым в
Visual Studio, изменив свойства этого объекта.
Свойства ресурсов. Как и у всех объектов, которыми управляет Visual
Studio, у ресурсов проекта тоже есть свойства. Можно работать с
свойствами ресурсов так же, как и со свойствами других объектов, —
используя область свойств (рис. 5.4).
89
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 5.4. Свойства файла изображения
Представленные на рисунке настройки указывают Visual Studio при
построении проекта скопировать изображение в тот же каталог, в
котором создается файл с программой. В этом случае программа сможет
открыть этот файл и использовать его при выполнении программы:
Bitmap b = new Bitmap("BitmapLbmp");
Этот код загрузит растровое изображение в переменную b класса Bitmap.
Таким образом, можно легко добавлять в проект ресурсы.
Внедрение ресурсов в приложение. В предыдущем примере настройки
указывают, чтобы рисунок был сохранен в том же каталоге, что и
программа. Этот подход предполагает, что при установке программы
файлы с изображениями будут скопированы в папку с исполняемым
файлом программы.
Вместо этого можно встроить этот ресурс прямо в файл программы при
ее построении. Когда программа будет создана, ее исполняемый файл
будет содержать изображение. Это можно сделать, изменив свойства
ресурса (рис. 5.5).
90
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 5.5. Свойства изображения, внедряемого в исполняемый файл
Свойству Действие при построении файла Bitmap2.bmp присвоено
значение Внедренный ресурс. Теперь изображение сохраняется внутри
файла программы. Использовать этот ресурс немного сложнее, но будет
гарантировано работать независимо от того, где программа
установлена, поскольку при этом не используются дополнительные
файлы:
Assembly assembly;
Stream imageStream;
assembly = AssemblyGetExecutingAssemblyO;
imageStream = assembly.GetManifestResourceStream("SimpleProjed:.Bilmap2.t
Bitmap b = new Bitmap(imageStream);
Этот код загрузит изображение из встроенного ресурса и сохранит его в
переменной b. Обратите внимание, что при получении ресурса из
сборки кроме имени ресурса нужно также указать ее пространство имен.
Файлы сборки и исполняемые файлы
91
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
При сборке проекта Visual Studio создает не просто программу —
выходной объект является сборкой. Сборка является контейнером, в
котором могут размещаться различные объекты, включая код
программы. При запуске программы среда .NET открывает сборку и
ищет класс, содержащий Main, который среда запускает. Файл проекта
сообщает Visual Studio, что нужно поместить в сборку.
Сборки библиотек. Существуют два вида сборок — исполняемые файлы
и библиотеки. При создании нового проекта можно выбрать шаблон
для создания библиотеки. В этом случае будет создан новый проект,
который будет содержать только классы библиотеки, т.е. никакой класс в
сборке не будет содержать метод Main. Сборка библиотеки
компилируется в файл с расширением .dll, что расшифровывается как
динамически подключаемая библиотека. Классы библиотеки
загружаются в памяти динамически во время работы программы.
Когда программа ссылается на метод класса библиотеке, этот класс будет
загружен в память, и ЛТ-компилятор преобразует метод в машинный
код, который сможет выполняться. Если класс вообще не используется,
он не загружается в память. Использование динамических библиотек
позволяет сохранить память за счет небольшой дополнительной работы
при выполнении программы.
Динамические библиотеки можно использовать в других программах
без необходимости использования исходного кода этих библиотек.
Системные библиотеки и ссылки. Программа, работающая в среде .NET,
во время работы использует системные ресурсы. Если программе нужно
отправить сообщение на консоль, она может вызвать для этого метод
системы:
System.Console.WriteLine("Hello World");
Эти методы хранятся в системных библиотеках, которые являются DLL-
файлами, созданными Microsoft и распространяемыми как часть
системы .NET. Файл сборки содержит ссылки на файлы библиотеки, с
которыми он работает. Список ссылок можно увидеть в Visual Studio в
области обозревателя решений (рис. 5.6).
92
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 5.6. Список ссылок проекта в обозревателе решений
Раздел Ссылки проекта содержит список всех ресурсов, которые
использует приложение. При создании проекта определенного типа
Visual Studio добавляет ссылки на ресурсы, которые требуются для
построения проекта. Этим списком можно управлять самостоятельно.
Например, для использования акселерометра в приложении для
Windows Phone необходимо добавить ссылку на пространство имен
MicrosoftDevices.Sensors.
Отметим, что при добавлении ссылки на ресурс он не обязательно
станет частью проекта — сборка должна иметь возможность
использовать этот ресурсу при работе. Если ресурс не будет доступен во
время выполнения, то произойдет аварийное завершение работы
программы. Ресурсы имеют номер версии. Если в систему будет
добавлена новая версия библиотеки, любые более старые программы
смогут использовать предыдущую версию.
Построение программы. При построении программы Visual Studio
собирает все необходимые для построения сборки ресурсы и использует
их для создания файла. Полученная сборка сохраняется в виде
исполняемого файла в папке, путь к которой задается в настройках
93
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
приложения. Этот файл также может работать и на другом компьютере
с установленной средой .NET. При построении отладочной версии
Visual Studio также создает базу данных с отладочной информацией,
которая предоставляет информацию об исходном коде.
Решения Visual Studio
Для создания исполняемой сборки достаточно одного проекта. Также
Visual Studio позволяет создать несколько отдельных файлов со сборками
и использовать их в одном приложении. Файл решения является
контейнером, который может содержать проектные файлы. При
создании нового проекта фактически создается решение, которое
содержит проект.
Создание решения с несколькими проектами. Новые проекты можно
добавить к решению, щелкнув правой кнопкой мыши по решению и
выбрав во всплывающем меню пункт Добавить -> Создать проект.... В
открывшемся окне можно выбрать любой из представленных шаблонов
проекта и создать новый проект, который будет являться частью
решения (рис. 5.7)
Рис. 5.7. Решение Visual Studio с двумя проектами
94
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
На рисунке к решению добавлен новый проект библиотеки
DisplayLibrary. Библиотека будет скомпилирована в DLL-файл, который
будет храниться в папке для этого проекта. Этой библиотекой могут
пользоваться любые проекты, которые добавят ссылку на DLL-файл.
Связывание проектов. В настоящее время проекты в нашем решении
никак не связаны. Если в проекте SimpleProject нужно использовать
ресурсы проекта DisplayLibrary, в первый проект нужно добавить ссылку
на второй проект. После этого можно добавить директиву using в
исходный код программы:
using DisplayLibrary;
После этого, при построении проекта SimpleProject в каталоге с
выходными файлами программы теперь создается еще и DLL-файл
проекта DisplayLibrary.
Решения с несколькими проектами. Можно поместить в одно решение
несколько проектов разных типов. Например, можно создать игру XNA
для Windows Phone, Xbox 360 и компьютера под управлением Windows,
используя единственный файл решения. Для каждого из этих устройств
можно создать отдельный файл проекта. Игровой движок может быть
реализован в четвертом проекте, который нужно использовать в
остальных проектах.
Можно создать приложение Silverlight, которое подключается к веб¬
службе; при этом можно поместить и проект приложения Silverlight и
проект веб-службы в одно решение.
Проекты решения и выполняемые ими задачи должны быть определены
в начале разработки. Если решение содержит несколько проектов,
можно назначить один из них запускаемым проектом, который будет
выполняться первым при запуске проекта.
Решения Windows Phone
Существует много видов решений для Windows Phone, которые можно
создать в Visual Studio: приложение Silverlight, приложение XNA и
приложение, использующее совместно Silverlight и XNA. Также есть
95
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
проекты для создания дополнительных элементов решений Windows
Phone, например, фоновые задачи.
Решение Silverlight для Windows Phone. Решение для Windows Phone,
содержащее проект приложения на Silverlight, может иметь структуру,
представленную на рис. 5.8.
Рис. 5.8. Структура проекта приложения Silverlight для Windows Phone
Решение Silverlight для Windows Phone содержит файл MainPage.xaml,
который описывает внешний вид главного экрана. Также оно содержит
изображения, которые используются для вывода на экран значка
приложения и заставки, которыми будет управлять программа. Если
добавить новые страницы к приложению Silverlight, то они будут
добавлены к проекту в виде XAML-файлов и файлов отделенного кода.
Проект также содержит ссылки на все системные библиотеки, которые
использует телефон.
Решение XNA для Windows Phone. Технология XNA Framework создана
для того, чтобы создавать игры. Она предоставляет целый игровой
движок, в который можно поместить свою игру и добавить внешний
вид. Она позволяет управлять ресурсами и легко добавлять в игру
изображения, текстуры и звуки.
При создании решения XNA, используя шаблон Visual Studio, фактически
создается сразу два проекта (рис. 5.9). Один из них содержит
исполняемый код, а другой содержит все используемые игрой ресурсы.
9(9
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Идея состоит в том что, если игра должна работать на нескольких
платформах, достаточно просто добавить к решению новые проекты.
Они могут совместно использовать один проект ресурсов.
Рис. 5.9. Решение игры XNA для Windows Phone
На рисунке представлено решение новой игры XNA. Если добавить в
проект ресурсы, например, изображения, то они будут сохранены в
проекте ресурсов WindowsPhoneGameContent, который может
использовать любой проект игры в этом решении.
Совместное использование Silverlight и XNA. Решение, совместно
использующее XNA и Silverlight, содержит три проекта (рис. 5.10).
Проект Silverlight фактически содержит приложение игры XNA,
работающей на одной из страниц приложения Silverlight. Однако,
решению нужна библиотека компонентов XNA, а также проект ресурсов
XNA. Visual Studio автоматически создает все необходимые проекты, их
нужно просто заполнить кодом.
97
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 5.10. Решение игры XNA для Windows Phone
Создание решения Windows Phone
Процесс создания приложений для Windows Phone такой же, как и
создание консольных приложений. При выборе шаблона Visual Studio
создает проекты и исходные файлы, соответствующие этому шаблону.
Для создания нового проекта в меню Visual Studio нужно выбрать Файл -
> Создать проект.... Откроется диалоговое окно Создать проект (рис.
5.11).
98
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 5.11. Список шаблонов проектов приложений Silverlight для
Windows Phone
В левой части диалогового окна отображается список всех доступных
проектов. Если в системе установлен Windows Phone SDK, в этом списке
будут пункты Silverlight for Windows Phone и XNA Game Studio 4.0. В
центральной части окна отображается список доступных проектов для
выбранной группы.
Также можно использовать шаблон для создания проекта, который
нужно добавить к существующему приложению Windows Phone.
Например, можно добавить Агент запланированных заданий Windows
Phone. Этот проект позволяет добавить запланированную задачу к
приложению, чтобы она могла выполнять работу с некоторым
интервалом времени, когда пользователь не использует приложение.
Для начала попробуем создать простое приложение на основе шаблона
Приложение Windows Phone. Можно создать такое же приложение и без
использования шаблона — просто создав проекты и исходные файлы и
корректируя их настройки — но шаблоны упрощают этот процесс.
99
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
В нижней части окна нужно ввести имя приложения. Рекомендуется
оставить установленным флажок Создать каталог для решения — в этом
случае Visual Studio создаст папку с именем приложением и поместит в
нее все файлы решения и папки проекта.
При нажатии на кнопку OK Visual Studio спросит, для какой версии
платформы нужно создать приложение (рис. 5.12).
Рис. 5.12. Список доступных версий операционной системы Windows
Phone
Первая версия Windows Phone называлась Windows Phone 7. Последняя
на текущий момент версия Windows Phone имеет номер 7.5, но в
инструментальных средствах и в операционной системе эта версия
имеет номер 7.1. Это может вызвать некоторую путаницу, однако можно
привести следующее объяснение:
• ОС Windows Phone 7.0 — оригинальная версия телефона с
ограниченным набором функций. Однако этот набор функций
доступен во всех телефонах;
• ОС Windows Phone 7.1 — обновленная версия, которая включает
новые функции, доступные только в телефонах последней версии
Windows Phone.
Многие из разделов этого курса используют новые возможности
Windows Phone 7.5 (работающий под управлением операционной
100
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
системы Windows Phone 7.1), поэтому необходимо выбрать пункт ОС
Windows Phone 7.1.
Visual Studio создаст пустое рабочее приложение Windows Phone
Silverlight. В него можно добавить визуальные элементы и поведение. В
пустом рабочем приложении Silverlight среди прочих содержатся четыре
файла: App.xaml и App.xaml.cs, MainPage.xaml и MainPage.xaml.cs. Файлы
App.xaml и MainPage.xaml — это файлы XAML, тогда как App.xaml.cs и
MainPage.xaml.cs — это файлы C#. Такой принцип именования файлов
подразумевает, что два файла С#-кода являются файлами отделенного
кода, связанными с двумя XAML-файлами. Они содержат код для
поддержки разметки. Это основная концепция Silverlight.
Запуск приложений Windows Phone
Для того чтобы начать процесс компиляции приложения в Visual Studio
нужно просто нажать клавишу F5 на клавиатуре или выбрать в главном
меню пункт Отладка -> Начать отладку. Visual Studio создаст сборку,
добавит в нее все необходимые для работы программы ресурсы и
запустит программу.
В отличие от компиляции и построения приложения для Windows тот
же процесс для приложений для Windows Phone является более
сложным. Программа не запустится на компьютере — вместо этого ее
нужно передать в устройство Windows Phone или эмулятор. Кроме того,
любые ресурсы, необходимые для работы программы (например,
ресурсы, которые не встроены в сборку), должны быть доступны
программе в целевом устройстве. Эта проблема решается путем
использования контейнерного файла, в который размещается само
приложение и все необходимые ресурсы.
На рис. 5.13 представлен выходной каталог для программы Сумматор. В
нем содержатся все ресурсы и файл AddingMachine.dll с кодом
программы. Среди прочих файлов присутствует файл с расширением
XAP — этот файл является контейнером, который содержит все
приложение.
101
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
AddingMachine.dll
1.0.0.0
Ad ding. Machine
AddingMachine.xap
Файл "XAP"
14,0 КБ
AppManife:t.xaml
^ Файл раз.метки Windows
X“''1L 361 байт
WM Ар p M a n if ect.xm I
Документ XML
1,65 КБ
AddingMachine.pdb
Файл "PDB"
| 19,5 КБ
□ Applicationkon.png
Рисунок PNG
J 1,83 КБ
□ Background.png
Рисунок PNG
J 3,43 КБ
Рис. 5.13. Список файлов программы, созданных в результате
компиляции проекта
XAP-файл. Файл XAP является архивным файлом (его формат такой же,
как и у ZIP-файлов), который содержит все файлы приложения.
На рис. 5.14 представлено содержимое XAP-файла для приложения
Сумматор. Этот файл нужно передать в устройство Windows Phone, где
он должен работать. При запуске приложения на выполнение в Visual
Studio этот файл создается и передается в устройство или эмулятор.
Целевое устройство распаковывает этот файл и запускает приложение.
Если программа состоит из нескольких библиотек и содержит
изображения и звуковые файлы, все они будут помещены в XAP-файл.
AddingMachine.dll
Расширение приложения
11,0 КБ
Applicationlcon.png
Рисунок PNG
1,83 КБ
AppManife:t.xaml
^ Файл рааметки Windows
11 361 байт
SplashScreenImage.jpg
Рисунок JPEG
9,19 КБ
Background.png
Рисунок PNG
3,43 КБ
WMAp р М a n if e:t.xm I
Документ XML.
1,65 КБ
Рис. 5.14. Список файлов программы, которые размещаются в XAP-
файле
102
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Таким образом, вся программа для Windows Phone представляется в виде
XAP-файла, который должен быть загружен в телефон.
5.2. Отладка программ
Отладка является важным этапом создания приложений. Среда
проектирования приложений для Windows Phone позволяет легко
отлаживать программы. При отладке можно просмотреть значения
переменных на любом шаге и получить представление о том, насколько
правильно работает программа. Программы можно отлаживать на
физическом устройстве или в эмуляторе.
Использование эмулятора Windows Phone
Эмулятор Windows Phone дает возможность проверить правильность
работы программ. Эмулятор работает так же, как и физическое
устройство.
Можно развернуть программу в эмуляторе или в физическом
устройстве. Выбрать физическое устройство или эмулятор для
выполнения программы можно с помощью раскрывающегося списка
справа от кнопки запуска программы (рис. 5.15).
Рис. 5.15. Список целевых устройств, которые можно использовать для
запуска программы
Если выбрать пункт Windows Phone Device, и при этом физическое
устройство не будет подключено, при попытке выполнения программы
Visual Studio выдаст ошибку.
В эмуляторе Windows Phone можно использовать мышь для щелчка по
элементам. Если в компьютере есть мультисенсорный монитор и
103
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
операционная система Windows 7, можно использовать
мультисенсорные функции пользовательского интерфейса.
Чтобы остановить выполнение программы, нужно нажать на кнопку
эмулятора Назад (кнопка со стрелкой влево) или закрыть окно
эмулятора.
В состав эмулятора входят не все встроенные программы, которые есть
в физическом устройстве. Среди встроенных функций присутствуют
только программа Internet Explorer, возможность изменения некоторых
настроек системы, включая доступные языки клавиатуры телефона, и
эмуляция некоторых функций устройства, а такие программы как
Калькулятор, Календарь и интерфейс Zune отсутствуют.
Эмулятор не может работать с такой же скоростью как аппаратные
средства Windows Phone. Фактическая скорость приложения ограничена
в эмуляторе так, чтобы эмулятор в некоторой степени соответствовал
физическому устройству. Однако, имеет смысл предварительно
запустить разрабатываемое приложение в физическом устройстве,
чтобы определить, как оно будет работать на самом деле.
Когда Visual Studio развертывает приложение в эмуляторе Windows
Phone, оно остается там, пока эмулятор не будет перезагружен.
Приложение можно запустить повторно, щелкнув по его значку.
Отладчик Visual Studio
Функции отладчика интегрированы в среду Visual Studio. Можно
запускать программы прямо в Visual Studio. Можно добавить в
программу точки останова. Когда программа дойдет до точки останова,
Visual Studio приостановит отладку программы и позволит просмотреть
значения переменных в коде программы. Можно добавлять точки
останова и при отладке программ, работающих на физическом
устройстве. Можно даже устанавливать и удалять контрольные точки,
во время работы программы.
Добавление точки останова. Точки останова добавляются одинаково
при создании любой программы в Visual Studio: нужно щелкнуть мышью
104
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
в левом поле напротив строки, в которой нужно установить точку
останова. При этом, строка будет выделена цветом. Повторное нажатие
в поле уберет точку останова. Когда программа дойдет до этой строки,
ее работа приостановится, и можно будет просмотреть значения
переменных перед выполнением команды в выделенной строке. Для
этого можно навести указатель мыши на нужную переменную в коде
программы.
Пошаговое выполнение программы. Можно выполнить одну строку
программы, нажав клавишу F11 или аналогичную кнопку на панели
инструментов. Каждый раз при нажатии на эту кнопку программа
выполнит одну строку кода программы и перейдет к следующей.
Пошаговое выполнение программы осуществляют три клавиши
клавиатуры (или аналогичные кнопки на панели инструментов):
• F11 — выполнение одной строки программы. Если эта строка
будет методом, отладчик выполнит одну строку этого метода. Это
действие называется "шаг с заходом";
• F10 — выполнение одной строки программы. Если эта строка
будет методом, отладчик выполнит метод целиком. Это действие
называется "шаг с обходом". Эта возможность позволяет не
выполнять пошаговую отладку метода;
• Shift + F11 — выполнение всех действий программы до конца
текущего метода и выход из него. Это действие называется "шаг с
выходом".
Управление выполнением программы
Visual Studio поддерживает связь с работающей в устройстве
программой. Отладчик позволяет управлять выполнением программы.
Запуск или возобновление выполнения программы. Для того чтобы
запустить программу или продолжить ее выполнение после остановки
нужно нажать клавишу F5.
Приостановка выполнения программы. Приостановить выполнение
программы полезно, если программа выполняется дольше, чем
105
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
ожидается, и есть подозрение, что программа "зависла". Чтобы
приостановить выполнение программы, нужно нажать клавиши Ctrl +
Alt + Break. Также для приостановки выполнения программы можно
установить точки останова.
Остановка программы. Клавиши Shift + F5 можно использовать для
прекращения работы программы после выполнения текущей операции.
Остановку программы нужно использовать с осторожностью, поскольку
существует опасность потери или повреждения данных, с которыми
работает программа.
Управление точками останова. В Visual Studio есть окно со списком точек
останова в программе. Его можно вызвать, выбрав в главном меню
пункт Отладка -> Окна -> Точки останова. В этом окне можно
установить свойства точки остановки. Можно указать, чтобы точка
останова срабатывала после определенного количества заходов, или
при выполнении определенного условия. Это полезно в случае,
например, если программа завершается неудачей после пятидесятой
итерации цикла.
Окно интерпретации. Окно интерпретации можно вызвать, выбрав в
главном меню пункт Отладка -> Окна -> Интерпретация. В этом окне
можно просмотреть и изменить значения переменных, а также получить
значение произвольного выражения.
Краткие итоги
1. Среда проектирования Visual Studio используется для создания
приложений для Windows Phone. Существует бесплатная версия
этого инструмента.
2. Приложения Microsoft .NET состоят из сборок. Сборка может быть
исполняемой программой (.exe) или библиотекой (.dll).
3. Visual Studio объединяет необходимые для создания сборки
элементы в проект. В проект включаются исходные файлы и
другие ресурсы программы, такие как изображения и звуки.
4. Решение Visual Studio объединяет несколько проектов. Проекты
могут представлять отдельные компоненты большой системы,
например серверная и клиентская части приложения.
5. Приложения Windows Phone могут содержать несколько сборок,
10(5
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
включая ресурсы библиотек. Сборка будет содержать ссылки на
все используемые ресурсы с указанием их версий.
6. Приложение Windows Phone перед развертыванием на целевое
устройство упаковываются в файл XAP, который содержит сборки
программы и все используемые программой ресурсы.
7. Эмулятор Windows Phone работает на компьютере под
управлением Windows и предоставляет эмуляцию
функциональности устройства.
8. Visual Studio предоставляет возможность добавления в программу
точек останова, в которых выполнение программы
приостанавливается, и программист может просмотреть значения
переменных в программе. Точки останова и пошаговое
выполнение программы могут использоваться при выполнении
программ в физическом устройстве или эмуляторе Windows Phone.
Вопросы
1. Как можно создать на основе файлов исходного кода программы
исполняемый файл?
2. Как в Visual Studio создать новую программу?
3. Что такое "пространство имен"?
4. Как совместно использовать несколько проектов?
5. Каким образом можно добавить в проект ресурсы?
6. Что такое "динамическая библиотека"?
7. Что такое "построение программы"?
8. Чем отличается термин "решение" от термина "проект"?
9. Какие типы решений и проектов приложений для Windows Phone
поставляются с Windows Phone SDK?
10. Что представляют собой файлы с расширением .xap?
11. Как в Visual Studio запустить отладку приложения в эмуляторе
Windows Phone?
12. Какие средства Visual Studio позволяют осуществлять отладку
приложений?
Упражнения
Упражнение 1. Создание приложения Калькулятор времени
107
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
В этом упражнении вы создадите приложение Калькулятор времени,
описанное в упражнении к предыдущей главе.
Создание пустого приложения Silverlight
1. Запустите Visual Studio с установленным Windows Phone SDK.
2. В главном меню выберите пункт Файл -> Создать проект....
Откроется диалоговое окно Создать проект.
3. В списке установленных шаблонов выберите Silverlight for Windows
Phone.
4. В центральной части окна выберите Приложение Windows Phone.
5. В нижней части окна в поле Имя введите TimeCalculator.
6. Выберите подходящий каталог для проекта. По умолчанию Visual
Studio поместит проект в папку Visual Studio 2010 \ Projects в папке
Документы.
7. Убедитесь, что флажок Создать каталог для решения установлен, и
нажмите OK, чтобы создать новое приложение.
8. Visual Studio попросит выбрать целевую платформу для нового
приложения. Выберите ОС Windows Phone 7.1 и нажмите OK.
Visual Studio создаст новое приложение в указанном
местоположении.
9. Нажмите клавишу F5, чтобы запустить пустую программу.
Запустится эмулятор Windows Phone (если он еще не был запущен),
и приложение будет выполняться в эмуляторе.
10. Щелкните по окну Visual Studio, чтобы его выбрать. Нажмите
клавиши Shift + F5, чтобы остановить выполнение программы.
Также можно остановить программу, нажав кнопку Назад в
эмуляторе Windows Phone.
Добавление элементов Silverlight
1. Убедитесь, что в Visual Studio открыто окно MainPage.xaml. Слева
находится окно дизайнера (оно похоже на Windows Phone), в
центре — код XAML, справа — обозреватель решений.
(Указанные области могут располагаться в окне Visual Studio по-
другому)
2. Измените текст имя страницы в элементе PageTitle на
TimeCalculator.
3. Измените текст МОЕ ПРИЛОЖЕНИЕ в элементе ApplicationTtle на
108
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
ваше имя.
4. В главном меню выберите пункт Вид -> Панель элементов, чтобы
отобразить на экране панель инструментов с доступными
элементами. Элементы можно перетаскивать с панели
инструментов в окно дизайнера.
5. Добавьте следующие элементы пользовательского интерфейса в
окно дизайнера приложения и задайте их имена, как указано в
таблице:
Назначение элемента
Тип элемента
Имя элемента
Часы времени начала
TextBox
startHourTextBox
Минуты времени начала
TextBox
startMinTextBox
Часы времени окончания
TextBox
endHourTextBox
Минуты времени окончания
TextBox
endMinTextBox
Кнопка для вычисления
Кнопка
calcButton
Результат
TextBlock
resultTextBlock
6. Можно также добавить дополнительные элементы TextBlock,
чтобы разместить в окне приложения пояснительный текст.
7. Настройте свойства добавленных элементов, чтобы приложение
выглядело приблизительно таким образом (рекомендуется
установить размер текста элементов TextBlock равным 25):
109
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
8. Запустите программу. Обратите внимание, что можно вводить
текст в текстовые поля и нажимать на кнопку.
Добавление поведения в приложение
110
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
1. В обозревателе решений откройте файл MainPage.xaml.cs.
2. Добавьте после конструктора MainPage следующее описание
метода calculateMinutes:
private void calculateMinutesO
{
// здесь нужно будет добавить проверку данных и обработку ис
int startMin = int.Parse(startMinTextBox.Text);
int startHour = int.Parse(startHourTextBox.Text);
int endMin = int.Parse(endMinTextBox.Text);
int endHour = int.Parse(endHourTextBox.Text);
// здесь нужно будет добавить код для вычисления времени
int result = 99;
resultTextBlock.Text = "Результат: " + result.ToStringO;
}
3. Вернитесь в окно редактора файла MainPage.xaml.
4. Дважды щелкните мышью по кнопке вычислить. Visual Studio
создаст обработчик нажатия на кнопку и откроет код обработчика,
созданный в файле MainPage.xaml.cs.
private void calcButton_Click(object sender, RoutedEventArgs e)
{
}
5. Добавьте вызов метода calculateMinutes в этот метод-обработчик.
6. Запустите программу. Обратите внимание, что при нажатии на
кнопку значение результата изменяется на 99.
Завершение создания приложения
1. В редакторе кода XAML добавьте во все текстовые поля
следующий атрибут:
111
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
InputScope="Number"
Это укажет Windows Phone, что в текстовые поля будут вводиться
числа.
2. Добавьте в метод calculateMinutes код для вычисления разности
времени между введенными моментами времени (создайте код
самостоятельно).
3. Запустите программу и проверьте правильность ее работы.
Упражнение 2. Отладка приложения
В этом упражнении вы выполните отладку приложения Калькулятор
времени, которое создал другой программист. Программа иногда выдает
неправильные результаты. Необходимо выполнить отладку программы,
чтобы обнаружить проблему.
1. Откройте проект TimeCalculator, который находится в папке Lab3
TimeCalculator.
2. Выполните программу. Введите значения Начало: 00:00 и
Окончание: 01:00.
3. Нажмите кнопку вычислить. Обратите внимание, что программа
выводит на экран 60 минут, что является правильным
результатом.
4. Введите значения Начало: 00:00 и Окончание: 01:30.
5. Нажмите кнопку вычислить. Обратите внимание, что программа
выводит на экран 60 минут, что является неверным результатом.
6. Во время работы программы откройте исходный файл
MainPage.xaml.cs в обозревателе решений.
7. Установите точку останова в следующей строке, щелкнув в поле
слева от этой строки:
resultTextBlock.Text = "Результат: " + result.ToString();
8. Нажмите кнопку вычислить еще раз. Теперь программа должна
приостановить работу в этой строке.
9. Просмотрите значения переменных. Попробуйте установить
причину возникающей проблемы. Если вы не можете обнаружить
ошибку, выполните следующий шаг.
10. Нажмите клавишу F5 для возобновления программы. Введите
112
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
значения Начало: 01:02 и Окончание: 03:04. Теперь используйте
отладчик, чтобы просмотреть значения переменных startHour,
startMin, endHour и endMin.
11. Определите и исправьте причину ошибок.
12. Удалите контрольную точку, щелкнув мышью в левом поле еще
раз, и проверьте правильность работы программы на тестовых
данных.
113
А.И. Гарибов
Отладка приложения
Цель работы: изучение возможностей отладки приложения для Windows
Phone.
Основные теоретические сведения
Среда Visual Studio содержит необходимые функции для отладки
приложений. Можно добавить в программу точки останова. Когда
программа дойдёт до точки останова, Visual Studio приостановит отладку
программы и позволит просмотреть значения переменных в коде
программы. Можно добавлять точки останова и при отладке программ,
работающих на физическом устройстве.
Добавление точки останова
Точки останова добавляются одинаково при создании любой
программы в Visual Studio: нужно щёлкнуть мышью в левом поле
напротив строки, в которой нужно установить точку останова. При
этом, строка будет выделена цветом. Повторное нажатие в поле уберёт
точку останова. Когда программа дойдёт до этой строки, её работа
приостановится, и можно будет просмотреть значения переменных
перед выполнением команды в выделенной строке. Для этого можно
навести указатель мыши на нужную переменную в коде программы.
Пошаговое выполнение программы
Можно выполнить одну строку программы, нажав клавишу F11 или
аналогичную кнопку на панели инструментов. Каждый раз при
нажатии на эту кнопку программа выполнит одну строку кода
программы и перейдёт к следующей.
Пошаговое выполнение программы осуществляют три клавиши
клавиатуры (или аналогичные кнопки на панели инструментов):
• F11 — выполнение одной строки программы. Если эта строка
11-4
А.И. Гарибов
будет методом, отладчик выполнит одну строку этого метода. Это
действие называется "шаг с заходом";
• F10 — выполнение одной строки программы. Если эта строка
будет методом, отладчик выполнит метод целиком. Это действие
называется "шаг с обходом". Эта возможность позволяет не
выполнять пошаговую отладку метода;
• Shift + F11 — выполнение всех действий программы до конца
текущего метода и выход из него. Это действие называется "шаг с
выходом".
Запуск или возобновление выполнения программы
Для того чтобы запустить программу или продолжить её выполнение
после остановки нужно нажать клавишу F5.
Приостановка выполнения программы
Приостановить выполнение программы полезно, если программа
выполняется дольше, чем ожидается, и есть подозрение, что программа
"зависла". Чтобы приостановить выполнение программы, нужно нажать
клавиши Ctrl + Alt + Break. Также для приостановки выполнения
программы можно установить точки останова.
Остановка программы
Клавиши Shift + F5 можно использовать для прекращения работы
программы после выполнения текущей операции. Остановку
программы нужно использовать с осторожностью, поскольку существует
опасность потери или повреждения данных, с которыми работает
программа.
Управление точками останова
В Visual Studio есть окно со списком точек останова в программе. Его
115
А.И. Гарибов
можно вызвать, выбрав в главном меню пункт Отладка -> Окна ->
Точки останова. В этом окне можно установить свойства точки
остановки. Можно указать, чтобы точка останова срабатывала после
определённого количества заходов, или при выполнении
определённого условия.
Окно интерпретации
Окно интерпретации позволяет просмотреть и изменить значения
переменных, а также получить значение произвольного выражения.
Окно интерпретации можно вызвать, выбрав в главном меню пункт
Отладка -> Окна -> Интерпретация. В этом окне можно ввести имя
переменной, выражение или вызвать метод класса. После нажатия
клавиши Enter в окне будет выведен результат.
Дополнительные материалы
Windows Phone 7.5 Training Kit https:// -
rusdpe.blob.core.windows.net/downloads/RusWP7TrainingKit.zip: Labs
YHelloPhoneYHelloPhone.html\html\DocSet_501b535f-fae1-427f-8e72-
fd847da23fad.html.
Задание к работе
1. Откройте в Visual Studio созданный в предыдущей работе проект
программы для Windows Phone.
2. Добавьте в код программы на языке C# точки останова после
инструкций получения вводимых пользователем данных.
3. Запустите программу, введите необходимые данные и нажмите
кнопку для получения результата. Обратите внимание, что
программа приостанавливает работу по достижении первой
точки останова.
4. Проверьте, правильно ли считалось введённое в эмуляторе
значение. Измените это значение, используя окно интерпретации.
5. Выполните несколько шагов программы. Проверьте, правильно ли
изменяются значения переменных программы.
6. Составьте отчёт о проделанной работе.
116
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Использование нескольких проектов в одном решении
Цель работы: изучение принципов создания решения приложения для
Windows Phone, включающего несколько проектов.
Основные теоретические сведения
Можно поместить в одно решение несколько проектов разных типов.
Например, можно создать игру XNA для Windows Phone, Xbox 360 и
компьютера под управлением Windows, используя единственный файл
решения. Для каждого из этих устройств можно создать отдельный файл
проекта. Игровой движок может быть реализован в четвёртом проекте,
который нужно использовать в остальных проектах.
Можно создать приложение Siiverlight, которое подключается к веб¬
службе; при этом можно поместить и проект приложения Silverlight и
проект веб-службы в одно решение.
Проекты решения и выполняемые ими задачи должны быть определены
в начале разработки. Если решение содержит несколько проектов,
можно назначить один из них запускаемым проектом, который будет
выполняться первым при запуске проекта.
Создание решения с несколькими проектами
Новые проекты можно добавить к решению, щёлкнув правой кнопкой
мыши по решению и выбрав во всплывающем меню пункт Добавить ->
Создать проект.... В открывшемся окне можно выбрать любой из
представленных шаблонов проекта и создать новый проект, который
будет являться частью решения.
117
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 4.1. Добавление проекта библиотеки классов
Часто к решению приложения Silverlight для Windows Phone добавляется
проект библиотеки классов, которая может использоваться в нескольких
приложениях. Однако, в виде дополнительного проекта используются
фоновые задачи и приложения XNA, если они должны запускаться со
страницы приложения Silverlight.
Чтобы использовать ресурсы одного проекта в другом проекте, в
последний нужно добавить ссылку на нужный проект и добавить в
файл исходного кода директиву using.
Например, к проекту приложения добавляется новый проект
библиотеки классов MyLibrary, в которой создаётся класс MyClass,
который может быть полезен в других приложениях. Код библиотеки
класса на языке C# может выглядеть так:
namespace MyLibrary
{
public class MyClass
{
118
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
public void MyMethod()
{
// код метода
}
}
}
Чтобы использовать этот класс библиотеки в основном проекте,
требуется добавить ссылку на проект библиотеки, после чего класс будет
доступен в коде программы:
using MyLibrary;
private void button1_Click(object sender, RoutedEventArgs e)
{
MyClass c = new MyClass();
c.MyMethod();
}
Дополнительные материалы
Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/sc65sadd.
Задание к работе
1. Откройте в Visual Studio созданный в предыдущих работах проект
программы для Windows Phone.
2. Добавьте к решению для приложения новый проект библиотеки
классов Windows Phone.
3. Перенесите код программы для вычисления результата в проект
библиотеки.
4. Добавьте в главный проект программы ссылку на проект
библиотеки и вызов методов класса библиотеки.
5. Запустите программу и проверьте правильность её работы.
6. Откройте на компьютере папку с файлами приложения (папка Bin
119
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
-> Debug, вложенная в приложение). Измените расширение файла
приложения .xap на .zip, и откройте этот файл с помощью любой
программы для работы с архивами формата ZIP. Обратите
внимание, что в архиве присутствует дополнительная библиотека
с расширением .dll.
7. Составьте отчёт о проделанной работе. Включите в отчёт
необходимые листинги программы.
120
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Создание приложений Silverlight
В этой главе вы более подробно познакомитесь с особенностями
проектирования приложений на основе Silverlight и научитесь создавать
многостраничные приложения Silverlight для работы с данными в
Windows Phone.
Презентацию к данной главе Вы можете скачать здесь - h ttp://old.intuit.ru/
department/se/devmobwphn/8/04.pptx.
8.1. Улучшение приложения
Управление свойствами элементов
Визуальные элементы Silverlight фактически являются классами в коде, и
можно настроить их отображение, изменяя свойства отдельных
экземпляров этих элементов. Свойства элементов Silverlight можно
задать в области свойств в Visual Studio или в XAML-коде, в котором
описываются все элементы страницы. Эти настройки можно задать при
создании программы, а также можно устанавливать свойства элементов
и во время работы программы, например:
resultTextBlock.Text = result.ToString(;
В программе можно управлять любыми свойствами визуальных
элементов. Рассмотрение всех существующих свойств элементов
выходит за рамки курса, но рекомендуется изучить их самостоятельно.
Обработка ошибок. На текущий момент в разработанной на прошлых
занятиях программе Сумматор не осуществляется обработка ошибок.
Если пользователь введет произвольный текст в элемент TextBox, то
программа попытается использовать метод Parse, чтобы
преобразовать этот текст в число, и это может завершиться неудачей
(рис. 8.1).
121
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 8.1. Сообщение об ошибке при вводе недопустимого значения
Такая ошибка возникает, поскольку программный код не производит
проверку на допустимость введенных значений:
float v1 = floatParse(firstNumbeiTextBox.Text);
Если в элемент firstNumberTextBox ввести текст, который не
может быть преобразован в число (например, "один'), то возникнет
исключение. Можно изменить код, используя другую версию метода
Parse:
float v1 = 0;
if (!int.TryParse(firstNumberTextBox.Text, out v1))
{
// Код для обработки ввода недопустимого значения
}
Этот код использует метод TryParse, который возвращает значение
false, если элемент firstNumberTextBox будет содержать
недопустимый текст.
Изменение цвета текста. При возникновении ошибки можно выделить
текст элемента TextBox красным цветом. Silverlight использует кисти
для отрисовки элементов на экране. Этот мощный механизм позволяет
нарисовать текст, используя изображения или текстуры, и применить
некоторые дополнительные эффекты. В Silverlight есть набор
стандартных цветов, и можно сделать текст элемента TextBox
красным, сделав основную кисть непрерывной красной заливкой:
float v1 = 0;
if (!float.TryParse(firstNumberTextBox.Text, out v1))
122
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
{
firstNumbeiTextBox.Foreground = new SolidColorBrush(Colors.Red);
return;
}
Теперь, если пользователь введет недопустимое значение, основной
цвет текстового поля станет красным (рис. 8.2), и выполнение метода
завершится без вычисления результата. Однако, программа должна
выдавать сообщение об ошибке, если пользователь введет
недопустимый текст не только в первое, но и во второе текстовое поле.
123
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 8.2. Реакция программы на ошибку при вводе данных
Кроме этого, в приведенном примере есть еще один недостаток: после
того как пользователь исправит ошибку ввода, цвет текста останется
красным. Нужно добавить код для возврата цвета текста в
124
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
первоначальный, когда оба числа будут введены правильно. Для этого
нужно сохранить исходную кисть, чтобы ее можно было использовать
повторно. Полная версия метода calculateResult может
выглядеть так:
private SolidColorBrush errorBrush = new SolidColorBrush(Colors.Red);
private Brush correctBrush = null;
private void calculateResultQ
{
bool errorFound = false;
if (correctBrush == null)
correctBrush = frstNumberTextBox.Foreground;
float v1 = 0;
if (!float.TryParse(firstNumberTextBox.Text, out v1))
{
firstNumberTextBox.Foreground = errorBrush;
errorFound = true;
}
else
firstNumberTextBox.Foreground = correctBrush;
float v2 = 0;
if (!float.TryParse(secondNumberTextBox.Text, out v2))
{
secondNumberTextBox.Foreground = errorBrush;
errorFound = true;
}
else
secondNumberTextBox.Foreground = correctBrush;
if (errorFound)
resultTextBlock.Text = "Ошибка при вводе!";
else
{
125
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
float result = v1 + v2;
resultTextBlock.Text = result.ToStringQ;
}
}
Этот код позволяет обработать возможные ошибки при вводе числовых
данных. Часто создание программ, которые получают данные от
пользователя, заканчивается созданием большого объема кода для
вычисления результата и обработки ошибок при вводе данных.
Редактирование XAML-кода элементов Silverlight
XAML является декларативным языком и используется для описания и
настройки объектов Silverlight. Например, можно настроить режим ввода
для элементов TextBox для ввода чисел.
Конфигурирование элемента TextBox для использования цифровой
клавиатуры. На текущий момент программа Сумматор использует
стандартную клавиатуру Windows Phone, которая появляется при выборе
элемента TextBox и позволяет вводить в поле любой текст. В нашем
случае предпочтительнее использовать вариант клавиатуры,
предназначенный только для ввода чисел. Существует несколько
конфигураций экранной клавиатуры Windows Phone.
Можно настроить все элементы TextBox, чтобы при их выборе
отображалась клавиатура для ввода чисел. Для этого можно изменить
соответствующее свойство элементов TextBox во время работы
программы, но лучшее указать настройки элемента непосредственно в
XAML-файле:
<TextBox Height="72" HorizontalAlignment='Left" Margin="8,19,0,0"
Name="firstNumberTextBox" Text="0" VerticalAlignment="Top" Widtt^^O"
TextAlignment=' C enter' >
<TextBox. Inputs cope >
<InputScope>
<InputScopeName NameValue="Digits" />
</InputScope>
</TextBox. Inputs cope >
121(5
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
</TextBox>
Это описание указывает Silverlight положение элемента TextBox на
экране, размер элемента, его имя и некоторую информацию о
выравнивании текста. Каждое из значений, заключенных в блок
<TextBox ... /> является атрибутом текстового поля. Атрибуты —
это простые элементы, которые не являются структурированными и
представляют собой пары "имя—значение".
Чтобы указать элементу TextBox, какая форма текста должна быть
введена, в него добавлен вложенный элемент
TextBox.InputScope. Этот элемент является частью значения
TextBox.
Простая информация о свойствах элемента TextBox представляется в
виде атрибутов, в то время как значение InputScope является
вложенным элементом, который содержит ряд свойств, которые
описывают тип вводимого текста, например, вводимый текст должен
содержать цифры и текст, но не знаки пунктуации. Нам достаточно
только ввода цифр, для чего нужно добавить элемент:
<InputScopeName NameValue="Digits" />
При использовании этого описания в обоих текстовых полях в
программе Сумматор при их вызове будет использоваться клавиатура
для ввода числовых значений, которая является более удобной, чем
клавиатура для ввода произвольного текста.
Visual Studio поддерживает технологию Intellisense, суть которой
заключается в том, что редактор подсказывает, какое значение можно
ввести в текущее положение курсора. Это существенно облегчает
редактирование текста в программе и помогает предотвратить
возможные ошибки при наборе текста.
Использование атрибутов и элементов в XAML. В языке XAML
атрибуты и вложенные элементы являются взаимозаменяемыми.
Значение свойства элемента может быть считано как из атрибута, так и
из одноименного вложенного элемента. Можно указать следующее
описание:
127
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
<TextBox InputScope="Number" Height="72" HorizontalAlignment-'Left"
Margin="144,44,0,0" Name="startHourTextBox" Text="00" VerticalAlignmen
Width="104" TextAlignment="Center" />
Это описание указывает, что вводимый текст должен быть числом.
Такое описание не позволяет установить несколько значений свойства,
но оказывается более простым для задания одного значения.
<TextBox HorizontalAlignment="Left" Margin="8,175,0,0" Name="secondNuml
Text="0" VerticalAlignment-Top" Width="460" TextAlignment="Center">
<TextBox.Height>72</TextBox.Height>
</TextBox>
В этом описании высота элемента TextBox указана не как атрибут, а
как вложенный элемент. Имя элемента должно содержать название
типа элемента, частью которого является это свойство. При этом нельзя
указать в качестве имени элемента просто Height, а нужно указать
TextBox . Height. Это не ограничение XML, а требование XAML.
С точки зрения XAML не важно, какая из этих форм используется в
описании. Для простых пар "имя—значение" можно использовать
атрибуты, но для более сложных структур лучше использовать
вложенные элементы.
Настройка свойств C#. В коде на языке C# установка значений свойств
выглядит так:
// Создание нового элемента InputScope
InputScope digitScope = new InputScope();
// Создание нового элемента InputScopeName
InputScopeName digits = new InputScopeName();
// Установка свойства name в значение Digits
digits.NameValue = InputScopeNameValue.Digits;
// Добавление элемента InputScopeName в элемент InputScope
digitScope.Names.Add(digits);
// Присвоить элементу TextBox созданное свойство
firstNumberTextBox.InputScope = digitScope;
128
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
Этот код создает все элементы, представленные в описанном выше коде
XAML.
Вывод окна с сообщением
Silverlight содержит класс MessageBox, который можно использовать
для сообщения пользователю об ошибке:
MessageBox. Show(' Недопустимый ввод');
Эта команда выведет в верхнюю часть экрана сообщение и выдаст
звуковой сигнал.
Если нужно отправить пользователю телефона сообщение с большим
объемом текста, можно вывести на экран сообщение в несколько строк:
MessageBox.Show('Недопустимый ввод" + System.Environment.NewLine +
"Пожалуйста, повторите ввод");
Элемент System.Environment.NewLine вставит символ новой
строки, принятый в целевой платформе. Класс MessageBox можно
использовать, если нужно убедиться в том, что пользователь принял
сообщение перед продолжением работы. При выводе сообщения на
экран выполнение программы будет приостановлено.
Окно сообщения с выбором. Можно предложить пользователю сделал
выбор в окне MessageBox:
if (MessageBox.Show("Bbi действительно хотите это сделать?", "Выполне
MessageBoxButton.OKCanceI) == MessageBoxResult.OK)
{
// Действия, если пользователь нажмет "ok"
}
else
{
// Действия, если пользователь нажмет "отмена"
}
Этот код выводит на экран сообщение с возможностью отмены
129
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
действия, представленное на рис. 8.3. Блок if позволяет выполнять
разные действия в зависимости от ответа пользователя.
Выполнение действия
Вы действительно хотите это сделать?
ок
отмена
Рис. 8.3. Всплывающее окно с вопросом пользователю
Добавление и использование ресурсов
В приложении можно использовать различные ресурсы, например,
изображения и звуки. Все ресурсы размещаются вместе с другими
файлами приложения в XAP-файл, который передается на устройство.
При использовании изображений в приложении важно помнить, что
целевое устройство не содержит большой объем памяти или экран
высокого разрешения. Самое высокое разрешение для Windows Phone
составляет 800*480 пикселей, поэтому нет необходимости использовать
фоновое изображение большего размера.
Ссылки на ресурсы. Если нужно использовать ресурсы сразу в
нескольких проектах, в них можно добавить не сами ресурсы, а ссылки
на ресурсы. В этом случае при изменении файлов ресурсов их новая
версия будет автоматически использоваться в этих проектах при их
следующем построении.
Свойство ресурса "Действие при построении". При построении проекта
в Visual Studio существует несколько способов добавления ресурсов к
программе. Часто используются два способа: добавление ресурса как
элемент контента или как части сборки.
По умолчанию при построении проекта ресурс встраивается в сборку. В
этом случае свойство Действие при построении имеет значение
130
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Внедренный ресурс.
Если необходимо использовать ресурс в качестве элемента контента,
нужно присвоить свойству Действие при построении значение
Содержание. В этом случае при построении программы файл с
ресурсом будет скопирован в каталог приложения.
Установка свойства Копировать в выходной каталог в значение
Копировать, если новее указывает Visual Studio скопировать новую
версию изображения папку с выходными файлами проекта, если
текущее изображение в проекте будет заменено новым файлом.
Использование в программе изображения как часть содержимого.
Ресурс, который является элементом контента, доступен в приложении
в виде файла, который находится в одной папке с программой. Чтобы
вывести на экран изображение из файла, нужно добавить строку в код
XAML содержащую путь к этому файлу с изображением:
<Image Height="611" Horizonta]ALgnment='Left" Margin="8,0,0,0"
Name="gearBackgroundImage" Stretch="Fi]l" VerticalA]ignment=Top" Width
Source="AddingGears.jpg" />
Элемент Image выводит на экран страницы изображение. В нем
описан атрибут Source, который определяет файл с изображением. Если
ввести имя файла в качестве источника, то при запуске программы
изображение будет загружаться из файла и выводиться на экран.
Silverlight выводит элементы на экран в том порядке, в котором они
описаны в XAML-файле. Если эту строку разместить перед
объявлением элемента Grid, содержащего элементы страницы, то
изображение будет выведено на заднем плане.
Использование в программе изображения как внедренный ресурс. Если
в приложении используется изображение, встроенное в сборку, XAML-
код для обращения к этому изображению может выглядеть так:
<Image Height="611" HorizontalAlignment="Left" Name="gearBackgrounds" Str
VerticaLAignment='Top" Width="472"
Source="/AddingMachine;component/Images/AddingGears.jpg" />
Во время работы программы изображение будет выглядеть одинаково,
131
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
независимо от способа его использования в программе. Разница
заключается в расположении ресурса и в коде для обращения к нему.
Выбор способа размещения ресурсов. При создании приложений для
Windows Phone важно понять разницу между элементами контента и
внедренными ресурсами приложения.
Элемент контента — это обычный файл, который хранится в каталоге
приложения. Программа может открывать и использовать файлы
содержимого, когда в этом есть необходимость. Добавление файлов не
влияет непосредственно на размер программы, хотя при загрузке
содержимого файлов программа будет использовать больше памяти.
Внедренный ресурс сохраняется в сборке программы, и ее размер
увеличивается. Когда устройство Windows Phone загружает программу,
оно просматривает всю сборку программы и выполняет некоторые
проверки кода. Чем больше размер программы, тем больше времени
занимают проверки. Если загрузка программы занимает слишком много
времени, ее выполнение будет прервано операционной системой
Windows Phone. Поэтому нужно с осторожностью внедрять большие по
объему ресурсы в сборку программы.
Добавление изображения как элемент содержимого позволяет
уменьшить размер программы, и программа будет быстрее запускаться.
Однако, элементы содержимого загружаются дольше, поскольку
находятся в файловом хранилище. Добавление изображения как
встроенный ресурс позволяет программе быстрее загружаться, но
увеличивает размер программы, и она запускается дольше.
Рекомендуется придерживаться следующих рекомендаций:
• если программа использует много больших ресурсов, которые не
должны быть загружены сразу все, то лучше хранить их в
отдельных файлах. Например, можно разрешить пользователю
выбирать фоновое изображение из нескольких доступных;
• если программа использует много небольших по размеру
ресурсов, к которым программа часто обращается, то их лучше
внедрять в сборку. Например, можно использовать собственные
значки в меню настройки программы;
132
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
• если программа слишком долго запускается, рекомендуется
перенести часть ресурсов из сборки в файлы и добавить в
программу заставку, которая будет отображаться во время запуска
программы. Также можно ускорить процесс запуска программы,
разделив программу на несколько связанных сборок.
8.2. Изменение и отображение данных
У созданной нами программы Сумматор имеется недостаток,
связанный с тем, что для получения результата нужно каждый раз
нажимать на кнопку. Было бы лучше, если бы результат обновлялся
автоматически при изменении текста в одном из текстовых полей. Это
можно осуществить с помощью событий.
Событие TextChanged
Ранее мы использовали событие элемента Button, которое происходит
при нажатии на кнопку. С точки зрения программы событие является
вызовом метода. Код XAML, описывающий кнопку, может выглядеть
так:
<Button Content="сумма" Height="72" HorizontalAlignment="Left" Margin="15
Name="equakButton" VerticalAlignment='Top" Width="160" Click="equalsBi
/>
При нажатии на кнопку вызывается указанный обработчик события. В
нашем случае в нем вызывается метод calculateResult.
private void equalsButton_Click(object sender, RoutedEventArgs e)
{
calculateResultQ;
}
Можно узнать, какие события может вызывать элемент, щелкнув по
нему в редакторе Visual Studio и затем нажав на кнопку События в
области свойств. Там же можно назначить, и даже автоматически
создать обработчики событий, которые требуется обработать в
программе.
133
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Для элемента firstNumberTextBox можно создать обработчик
события TextChanged, дважды щелкнув в строке TextChanged в
пустом поле справа, и вызвать в нем метод calculate Result:
private void firstNumberTextBox_TextChanged(object sender, TextChangedEvei
{
calculateResultQ;
}
То же самое можно сделать для второго текстового поля. Теперь, при
изменении текста в любом из этих полей результат будет обновляться.
Следовательно, теперь можно удалить кнопку сумма.
Однако, возникает проблема с проверкой допустимости введенных
значений. Если пользователь введет текст вместо числа, то программа
это обнаружит и выведет на экран сообщение. Однако, это сообщение
будет выводиться на экран по два раза при вводе недопустимого
символа. То есть, событие происходит дважды — и это известная
проблема для приложений Windows Phone. Обойти эту проблему можно,
проверяя, были ли изменены данные при последовательных вызовах
событий с теми же данными:
string oldFirstNumber = "";
private void firstNumberTextBox_TextChanged(object sender, TextChangedEvei
{
if (firstNumberTextBox.Text == oldFirstNumber)
return;
oldFirstNumber = firstNumberTextBox. Text;
calculateResultQ;
}
Этот обработчик вызывает метод calculateResult, только если
текст в элементе TextBox действительно изменился.
Привязка данных
134
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Привязка данных позволяет связать визуальные элементы с методами,
которые работают с этими элементами. Это позволяет связать свойство
визуального элемента напрямую с объектом. Все что нужно для этого
сделать — это создать особый объект, значения которого будут
автоматически передаваться элементам Silverlight.
Привязка данных может работать в любом направлении. Можно связать
текст элемента TextBox с приложением таким образом, чтобы при
изменении текста в этом текстовом поле приложение было об этом
уведомлено. Также можно связать элемент TextBlock с объектом так,
чтобы при изменении свойства объекта содержимое элемента
TextBlock соответственно обновлялось. Это пример
двунаправленной привязки, когда программа может сама изменить
элемент и отреагировать на изменения в этом элементе. Можно задать
однонаправленную привязку, чтобы программа только выводила на
экран результаты при изменении свойства объекта. Наконец, можно
связать любые свойства объектов так, чтобы программа могла
переместить элемент Silverlight по экрану при изменении свойств X и Y
объекта игры.
Создание объекта для привязки. Попробуем создать версию программы
Сумматор, использующую привязку данных. Начнем с класса, который
сделает всю работу. Нужно определить свойства класса, которые будут
связаны со свойствами визуальных элементов. Наш объект будет
содержать три свойства:
• текст верхнего элемента TextBox;
• текст нижнего элемента TextBox;
• текст элемента TextBlock.
Можно создать класс AdderClass, имеющий следующую структуру:
public class AdderClass
{
private int topValue;
public int TopValue
{
get
{
135
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
return topValue;
}
set
{
topValue = value;
}
}
private int bottomValue;
public int BottomValue
{
get
{
return bottomValue;
}
set
{
bottomValue = value;
}
}
public int Answer Value
{
get
{
return topValue + bottomValue;
}
}
}
У этого класса три свойства. Первые два предназначены для чтения и
записи, чтобы можно было получить текст верхнего и нижнего
текстового поля и занести в них новые значения. Третье свойство
предназначено только для получения последнего результата без
возможности его изменения напрямую. Программа может создать
экземпляр этого класса, установить значения свойств TopValue и
BottomValue и затем получить результат.
Добавление функций уведомления. Для того чтобы класс можно было
13(5
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
связать с объектом Silverlight, в нем должен быть реализован интерфейс
INotifyPropertyChanged:
public interface INotifyPropertyChanged
{
// Событие происходит при изменении значений свойства
event PropertyChangedEventHandler PropertyChanged;
}
Класс, который реализует этот интерфейс, должен содержать делегат
события, которое будет использовать класс AdderClass для
сообщения об изменении значения свойства.
public event PropertyChangedEventHandler PropertyChanged;
Класс PropertyChangedEventHandler используется элементами
Silverlight для управления сообщениями событий. Он описан в
пространстве имен System.ComponentModel. Если компонент
Silverlight нужно связать с каким-либо свойством класса, можно
добавить к этому событию делегаты.
Класс AdderClass будет использовать этот делегат для того, чтобы
сообщить об изменении одного из свойств в классе. При этом
произойдет обновление экрана. Связанные с этими свойствами
объекты Silverlight связываются с делегатом, чтобы они могли получить
уведомление в случае необходимости. Окончательная версия класса
может выглядеть так:
public class AdderClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private int topValue;
public int TopValue
{
get
{
return topValue;
137
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
}
set
{
topValue = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("AnswerValu
}
}
}
// то же самое для свойства BottomValue
public int Answer Value
{
get
{
return topValue + bottomValue;
}
}
}
Класс AdderClass теперь содержит свойство PropertyChanged.
Каждый раз при изменении значения свойства он должен проверить
значение свойства PropertyChanged. Если оно не равно null, то оно
связано с делегатом. Можно рассматривать свойство
PropertyChanged как список рассылки. Процесс может подписаться
на рассылку и получать уведомления об интересующих событиях,
которые происходят в AdderClass. Если никто не подписан на
список рассылки (то есть значение PropertyChanged равно null),
то нет точки вызова метода для описания изменений. Однако, если оно
не равно null, это означает, что есть объект, который интересуют
изменения, происходящие в AdderClass.
Вызов метода, который генерирует событие, выглядит следующим
образом:
PropertyChanged(this, new PropertyChangedEventArgs("AnswerValue"));
138
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Первый параметр является ссылкой на объект, который генерирует
событие. Вторым параметром является значение аргумента, которое
содержит имя свойства, значение которого изменилось. Элемент
Silverlight использует технологию отражения (т.е. он будет считывать
публичные свойства класса AdderClass), чтобы узнать, какие
свойства доступны. Если он получит уведомление, что значение
свойства AnswerValue изменилось, то он будет обновлять все
свойства визуальных элементов, связанные со свойством этого класса.
Когда программа сгенерирует событие, на экран будет выведено
обновленное значение свойства AnswerValue. При вызове кода
секции get свойства AnswerValue он вычисляет и возвращает
результат.
public int AnswerValue
{
get
{
return topValue + bottomValue;
}
}
Следующим шагом будет соединение этого объекта с пользовательским
интерфейсом. Пользовательский интерфейс сообщит классу
AdderClass, когда значения двух текстовых полей будут изменены
пользователем. Когда будут вводиться новые значения полей, экземпляр
класса AdderClass должен сообщить пользовательскому интерфейсу,
что результат изменился, и его нужно вывести на экран.
Добавление пространства имен на страницу MainPage. Для того
чтобы связать созданный объект с данными, нужно связать код объекта
с XAML-кодом, описывающим пользовательский интерфейс.
Необходимо добавить в код XAML пространство имен, содержащее
класс AdderClass:
xmlns:local="dr-namespace:AddingMachine"
Этот атрибут корневого элемента в XAML-файле для страницы
MainPage.xaml делает доступными любые классы пространства имен
139
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
AddingMachine для использования в XAML-коде. Как и в программе
на C# в начале файла должны указываться все директивы using, так и
в начале файла XAML также должны указываться все используемые
пространства имен.
После добавления пространства имен нужно объявить имя класса,
который описан в этом пространстве имен и используется в качестве
ресурса:
<phone:PhoneApplicationPage.Resources>
<localAdderClass x:Key="AdderClass" />
</phone:PhoneApplicationPage.Resources>
Добавление класса к элементу на странице. После того как
пространство имен стало доступным, можно соединить нужный класс
из этого пространства имен с элементами страницы. В нашем случае
таким элементом будет элемент Grid, который содержит все
визуальные элементы страницы. Добавление класса к элементу
автоматически делает его доступным для любых вложенных элементов,
и таким образом, элементы TextBox и TextBlock могут
использовать этот класс.
<Grid xName="LayoutRoot" Background='Transparent"
DataContext="{StaticResource AdderClass}">
Этот код указывает элементу Grid использовать класс AdderClass,
указанный в значении атрибута DataContext. В нашем приложении
он является статическим ресурсом, в котором класс является частью
программы.
Привязка элемента Silverlight к свойству объекта. Теперь класс
AdderClass доступен в контексте данных элементам на странице.
При этом создается связь между страницей Silverlight и объектом, в
котором описано поведение.
Теперь нужно привязать свойства каждого элемента к свойствам
объекта. Для этого можно использовать область свойств для каждого
элемента. Нужно связать текст элемента firstNumberTextBox со
свойством TopValue класса AdderClass. Если щелкнуть по
140
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
элементу TextBox в редакторе Visual Studio, откроется область свойств
для этого элемента, в которой для свойства Text в контекстном меню
нужно выбрать пункт Применить привязку данных.... После этого
откроется окно, в котором нужно указать, с каким свойством какого
объекта требуется связать выбранное свойство элемента.
Выбрав необходимый элемент из списка доступных элементов и их
свойств, можно привязать свойство элемента Siiverlight к свойству
объекта. Обратите внимание, что в разделе Параметры выбран режим
TwoWay, при котором при изменении пользователем значения в
элементе TextBox объект автоматически был об этом уведомлен.
При связывании с элементом TextBlock доступен только режим
OneWay, поскольку нельзя передать в программу данные из объекта
TextBlock.
После установки привязки программа будет работать. При этом
содержимое файла MainPage.xaml.cs с кодом программы не изменится.
Вся работа теперь выполняется в классе, который соединен с
визуальными элементами. Изменение содержимого элементов
TextBox , используемых для ввода значений, приведет к
возникновению события класса AdderClass, которые приведут к
изменению содержимого класса AnswerValue, связанного с
элементом ResultTextBlock.
Привязка данных через свойство DataContext
Для установки привязки к данным потребовалось проделать большую
работу. Однако, существует способ упростить выполнение этих
действий.
Установка привязки данных в XAML. Можно просто связать свойство
объекта со свойством элемента в XAML-коде, и Siiverlight выполнит
привязку.
<TextBox Height="72" HorizontalAlignment='Left" Margin="8,19,0,0"
Name="firstNumberTextBox" Text="{Binding TopValue, Mode=TwoWay}"
VerticalAlignment='Top" Width="460" TextAlignment="Center" />
141
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
В этом коде указана привязка текста элемента к свойству TopValue
объекта. Режим привязки установлен в значение TwoWay, чтобы
изменения в программе (при вычислении результата) отображались на
экране. Если нужно использовать визуальный элемент только для того,
чтобы показать значение (например, результат вычисления), можно
использовать режим привязки OneWay.
Установка свойства DataContext. Теперь остается создать экземпляр
класса AdderClass и присвоить его свойству DataContext
элемента, содержащего элемент firstNumberTextbox. Это можно
сделать в конструкторе для основной страницы.
// Конструктор
public MainPageO
{
InitializeComponent();
AdderClass adder = new AdderClassQ;
ContentGrid.DataContext = adder;
}
Свойство DataContext элемента Silverlight идентифицирует объект,
который содержит все свойства, связанные с элементом и с теми
элементами, которые в нем содержатся. Элемент ContentGrid
содержит элементы TextBox и TextBlock, и теперь каждая
привязка, которую эти элементы содержат, будет отображаться на
созданный экземпляр класса Ad derClass.
В этом примере вся тяжелая работа с областью свойств и ресурсами
заменена на небольшое количество XAML-кода и одну строку кода.
8.3. Управление ориентацией страницы приложения
Альбомная и книжная ориентация
Существует два варианта ориентации устройства: альбомная
(устройство расположено горизонтально) и книжная (устройство
142
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
расположено вертикально). Телефон может определить ориентацию, и
некоторые встроенные приложения правильно обрабатывают
изменение ориентации телефона.
Можно создавать приложения, которые смогут корректно работать в
обоих режимах ориентации. При этом, потребуется потратить вдвое
больше времени на создание пользовательского интерфейса и на
написание программного кода, обрабатывающего изменение
ориентации телефона и изменяющего соответственно ориентацию
приложений.
Указание ориентации в файле MainPage.xaml. Страница может сообщить
Silverlight, какую ориентацию она поддерживает. Для этого используются
свойства класса PhoneApplicationPage:
SupportedOrientations="Portrait" Orientation=Tortrait"
Эти настройки Visual Studio использует по умолчанию при создании
страницы. Они указывают на то, что страница использует только
портретную ориентацию. В случае необходимости эти настройки можно
изменить:
SupportedOrientations="PortraitOrLandscape" Orientation="Portrait"
С этими настройками при изменении ориентации телефона
приложение также будет изменять ориентацию (рис. 8.4).
143
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 8.4. Приложение Сумматор в альбомной ориентации
Теперь программа изменяет содержимое экрана при изменении
ориентации устройства, но поскольку расположение всех элементов
задано фиксированными значениями, некоторые из них находятся не в
том месте, в каком хотелось бы их видеть, а поле для результата не
видно на экране.
<TextBox Height="72" Horizonta]A]ignment='Left" Margin="8,19,0,0"
Name="firstNumberTextBox" Text="0" VerticalA]ignment='Top" Width^^O"
TextA]ignment="Center" />
Этот элемент использует значения отступа от краев экрана, которые
используются для точного указания расположения элементов на экране.
При этом, если у элемента указана позиция, которая находится за
пределами экрана, то Silverlight просто не будет отображать этот элемент
на экране.
Существует два способа исправления подобной ошибки. Один способ
заключается в изменении параметров расположения элементов при
изменении ориентации телефона.
Событие OrientationChanged. Класс
PhoneApplicationPage включает событие
1-44
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
OrientationChanged, которое происходит при изменении
ориентации страницы. Как и для других событий, для него можно
создать метод-обработчик, в который нужно добавить код для обработки
изменения ориентации экрана:
private void PhoneApplicationPage_OrientationChanged(object sender,
OrientationChangedEventArgs e)
{
if (e.Orientation == PageOrientation.PortraitUp)
{
setPortraitO;
}
else
{
setLandscape();
}
}
Этот код использует параметр, значение которого определяет новую
ориентацию, и вызывает соответствующий метод. Методы изменяют
значения отступов от краев элементов, чтобы разместить их
подходящим для определенной ориентации образом:
private void setLandscape()
{
firstNumberTextBox.Margin = new Thickness(8, 19, 0, 0);
firstNumberTextBox.Width = 207;
secondNumberTextBox.Margin = new Thickness(252, 19, 0, 0);
secondNumberTextBox.Width = 207;
plusTextBlock.Margin = new Thickness(221, 35, 0, 0);
resultTextBlock.Margin = new Thickness(538, 35, 0, 0);
}
Код метода setPortrait аналогичен методу setLandscape.
Элементы располагаются в соответствии со значениями свойства
Margin. Отступы от краев задаются значением свойства Thickness,
которое содержит величину отступа и ширину границы. В нашем случае
ширина границы установлена в 0, поэтому граница не будет
отображаться. После добавления этих методов приложение будет
145
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
работает в обоих режимах ориентации (рис. 8.5).
Рис. 8.5. Приложение Сумматор, настроенное под разные режимы
ориентации
Часто приложения при изменении ориентации экрана используют
анимацию перемещения элементов. Для создания подобных эффектов
рекомендуется использовать инструмент Expression Blend.
Использование контейнеров для группировки
элементов
Среди элементов Silverlight есть элементы-контейнеры, которые могут
содержать другие элементы. Существует несколько различных типов
контейнеров, среди которых есть элемент StackPanel.
Элемент StackPanel содержит последовательность элементов
Silverlight. Он позволяет располагать вложенные в него элементы в
определенном порядке. Элементы в контейнере могут располагаться
вертикально (сверху вниз) или горизонтально (слева направо). Вместо
146
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
того, чтобы настраивать для визуальных элементов отступы от краев
экрана, можно поручить эту работу элементу StackPanel:
<StackPanel>
<TextBox InputScope='Digits" Height="72" HorizontalAlignment="C enter"
Name="firstNumberTextBox" VerticalAlignment="Top" Width="460"
TextAlignment="Center" />
<TextBlock Height="56" HorizontalAlignment="Center" Name="plusTextBloc
VerticalAlignment= "Top" FontSize="32" Width="25" />
<TextBox InputScope="Digits" Height="72" HorizontalAlignment="C enter"
Name="secondNumberTextBox" VerticalAlignment="Top" Width="460"
TextAlignment="Center" />
<TextBlock Height="46" HorizontalAlignment="Center" Name="resultTextBlo
VerticalAlignment="Top" FontSize="30" Width="160" TextAlignment="Cen
</StackPanel>
Элементы StackPanel решают сами, как будут отображаться
элементы на экране. В этом коде лишь указано выравнивание всех
элементов по центру выделенной им области.
При таком подходе возникает очень полезный побочный эффект,
который заключается в том, что контейнер StackPanel
автоматически перестроит элементы при изменении ориентации
экрана (рис. 8.6).
147
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 8.6. Приложение Сумматор, использующее элемент StackPanel
Элемент StackPanel можно добавить к проекту, перетащив его с панели
инструментов Visual Studio в окно дизайнера или вводя текст XAML
вручную. Если элемент StackPanel должен группировать элементы
горизонтально, нужно указать соответствующий атрибут:
< StackPanel O rientation=' Horizontal' '>
Также можно поместить один StackPanel в другой, что позволяет
использовать другую группировку вложенных элементов.
Существуют и другие типы контейнеров. Один из них — элемент
Grid. Он позволяет создать прямоугольную сетку из элементов, в
каждом из которых может размещаться один или несколько элементов.
Фактически в приложении Сумматор экран содержит сетку, состоящую
из одного элемента, который занимает всю доступную область экрана.
8.4. Отображение списков данных
Часто в приложениях необходимо выводить списки каких-либо
148
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
объектов. Для этого необходимы специальные средства,
предусматривающие отображение списочных данных.
В качестве примера рассмотрим создание списка клиентов компании.
Информация о клиентах включает: имя клиента, адрес и идентификатор.
Класс Customer может выглядеть так:
public class Customer
{
public string Name { get; set; }
public string Address { get; set; }
public int ID { get; set; }
public Customer(string inName, string inAddress, int inID)
{
Name = inName;
Address = inAddress;
ID = inID;
}
}
Этот класс имеет единственный метод, который является
конструктором, принимающим три параметра.
Теперь нужно сохранить список клиентов. Лучший способ для хранения
списков объектов — использование класса List, который входит в состав
языка C#. Можно создать класс Customers, содержащий имя списка
клиентов и сам список:
public class Customers
{
public string Name { get; set; }
public List<Customer> CustomerList;
public Customers(string inName)
{
Name = inName;
CustomerList = new List<Customer>();
149
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
}
}
Класс Customers содержит единственный метод, который является
конструктором класса. Он определяет имя списка и создает пустой
список. Используя этот класс, можно создать новый список таким
образом:
Customers mailCustomers = new Customers("Список клиентов');
Теперь нужно заполнить созданный пустой список информацией о
клиентах.
Создание данных для списка
Для нашего примера не имеет значение, какие имена будут у клиентов
— главное, чтобы информация о клиентах была разной. Обычно такую
информацию удобно хранить в базе данных, но мы пока сгенерируем
список на основе небольшого количества данных. Создадим метод,
который будет возвращать готовый список:
public static Customers MakeTestCustomers()
{
string[] firstNames = new string[] { "Rob", "Jim", "Joe", "Nigel", "Sally",
'Tim”};
string[] lastsNames = new string[] { "Smith", "Jones", "Bloggs", "Miles",
"Wilkinson", "Brown" };
Customers result = new Customers("Тестовый список");
int id = 0;
foreach (string lastName in lastsNames)
{
foreach (string firstname in firstNames)
{
// формирование имени клиента
string name = frstname + " " + lastName;
// добавление клиента в список
result.CustomerList.Add(new Customer(name, name + "'s House", id));
150
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
// увеличение значения идентификатора для следующего клиента
id++;
}
}
return result;
}
В этом коде создается 36 клиентов комбинированием всех заданных
имен и фамилий. У каждого клиента свой уникальный
идентификационный номер. Метод MakeTestCustomers является
статическим, чтобы не нужно было создавать список перед получением
тестовых данных. Теперь можно использовать полученный список в
программе:
customerList = Customers.MakeTestCustomers();
Использование элемента StackPanel для вывода списка
на экран
Следующим шагом будет вывод полученного списка клиентов на экран
Windows Phone. Для этого можно поместить имя каждого клиента в
отдельный элемент TextBlock. Требуется, чтобы элементы могли
размещаться на экране независимо от их количества. Для этого можно
использовать элемент StackPanel:
<StackPanel HorizontalA]ignment='Left" Margin="0,0,0,0" Name="customersSt
VerticalAlignment='Top" />
Элементы TextBlock можно создавать в программе с помощью
следующего кода:
customers = Customers.MakeTestCustomers();
foreach (Customer c in customers.CustomerList)
{
TextBlock customerBlock = new TextBlock();
customerBlock.Text = c.Name;
customersStackPaneLChildren.Add(customerBlock);
151
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
}
В этом коде для каждого клиента создается элемент TextBlock, в
котором в текстовое поле записывается имя клиента, после чего этот
элемент добавляется customersStackPanel. Как видно из
примера, визуальные объекты можно создавать как в XAML-коде, так и
в коде программы на C#.
Полученная программа может выводить на экран список любого
размера (рис. 8.7).
152
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
F
управление клиентами
клиенты
Rob Smith
Jim Smith
joe Smith
Nigel Smith
Solly Smith
Tim Smith
Rob Jones
Jim Jones
Joe Jones
Nigel Jones
Solly Jones
Tim Jones
Rob Bloggs
Jim Bloggs
Joe Blotjys
Nigel Sloggs
Sally Bloygs
Tim Bloggs
Rob Miles
Jim Miles
Joe Miles
Nigel Mites
e sg
P
L
,
Рис. 8.7. Список клиентов
Однако, некоторые элементы не видны на экране, поскольку находятся
за его пределами. Это является существенным недостатком. Решить
проблему можно, добавив в программу возможность прокрутки экрана
153
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
вверх и вниз, чтобы пользователь мог увидеть остальную часть списка.
Такую возможность предоставляет элемент ScrollViewer, если в
него поместить элемент StackPanel:
<ScrollViewer>
<StackPanel HorizontalAlignment="Left" Margin="9,6,0,0" Name="customersS
VerticalAlignment='Top" />
</ScrollViewer>
Теперь в приложении отображается полоса прокрутки, и пользователь
может прокручивать экран вверх и вниз, чтобы просмотреть список
полностью.
Использование элемента ListBox для отображения
списка элементов
В представленном примере нам пришлось самостоятельно создавать
элементы и присваивать им значения, после чего размещать эти
элементы на странице. Вместо выполнения этих действий можно
использовать привязку данных и специальные элементы для
размещения на странице списков данных.
Создание шаблона данных. Необходимо связать класс Customer с
визуальным элементом, но нельзя сделать это напрямую, как это было
сделано в программе Сумматор, потому что экземпляр класса Customer
содержит несколько значений: имя клиента, его адрес и идентификатор.
Необходимо создать шаблон данных, который определяет, как
информация о клиенте будет выглядеть на экране. Шаблон может иметь
следующий вид:
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding Address}" />
</StackPanel>
</DataTemplate>
Этот шаблон данных определяет, что информация должна выводиться в
154
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
элемент StackPanel, который содержит два элемента TextBlock с
именами Name и Address. В соответствии с этим шаблоном будут
выводиться две строки: в первой строке указывается имя клиента, во
второй — его адрес. При этом, в шаблоне не указано значение
идентификатора, поскольку нам не нужно выводить это значение на
экран.
Использование шаблона DataTemplate для списка. Шаблон данных
указывает Silverlight как нужно выводить на экран свойства объекта. Его
можно использовать для вывода списка клиентов на экран. Для этого
нужно поместить шаблон DataTemplate в секции ItemTemplate
элемента ListBox, который выведет на экран информацию о
клиентах:
<ListBox Name="customerList">
<ListBox. ItemTemplate >
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding Address}" />
</StackPanel>
</DataTemplate>
</ListBox. ItemTemplate >
</ListBox>
Этот код настраивает внешний вид списка данных, вывод которого на
экран осуществляет элемент customerList. Теперь нужно указать
список данных, которые должны выводиться на экран:
customers = Customers.MakeTestCustomers();
customerListItemsSource = customers.CustomerList;
Этот код получает тестовый список клиентов, который присваивается
свойству ItemSource элемента customerList. Элемент ListBox
выведет на экран каждый объект в наборе как элемент списка (рис. 8.8).
155
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
управление клиентами
клиенты
Rob Smith
Rob Smith's House
film Smith
fim Smith's House
foe Smith
foe Smith's House
Niqel Smith
Nigct Smith's House
Salty Smith
Sally Smith's House
Tin* Smith
Tim Smith's House
Rob Jon«
Rob JOfi«LJ House
fim Jones
fim Jones's House
foe Jones
Joe Jones's House
Nigel Jones
Nigel Jones's House
Sally Jones
Sally Jones's House
Рис. 8.8. Список клиентов с адресами
В коде программы необходимо указать свойству ItemsSource
элемента ListBox список выводимых данных, а все остальные
действия выполняются автоматически. Элемент ListBox также
15(5
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
автоматически отображает полосы прокрутки, если список не
помещается на экране целиком. Необходимо только разработать шаблон
для отображения элементов списка и задать привязку к данным.
Добавление стиля отображения. В нашем примере в выводимом списке
информация выводится не очень наглядно, так как трудно визуально
отличить имя клиента от его адреса. Для повышения удобочитаемости
списка можно задать разные размеры и стили шрифта для имен и
адресов, но может быть удобнее использовать встроенные стили,
которые предоставляются в виде ресурсов для приложений Windows
Phone.
Преимущество использования встроенных стилей заключается в том,
что они используют различные цветовые схемы Windows Phone. К
элементам TextBlock в шаблоне DataTemplate можно добавить
названия используемых стилей:
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}"
Style="{StaticResource PhoneTextExtraLargeStyle}" />
<TextBlock Text="{Binding Address}"
Style="{StaticResource PhoneTextSubtleStyle}" />
</StackPanel>
</DataTemplate >
В этом коде используются встроенные стили ExtraLargeStyle для
имени клиента и SubtleStyle для адреса. Теперь список визуально
воспринимается гораздо лучше (рис. 8.9).
157
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
F
управление клиентами
клиенты
Rob Smith
Rob Smith'! House
Jim Smith
I Joe Smith
Nigel Smith
Niqel Smith's House
Sally Smith
Tim Smith
Rob Jones
Rob Jones'! House
e sg
p
L
Рис. 8.9. Список клиентов с адресами, использующий встроенные
стили
Выбор элементов списка. Следующим шагом будет добавление в
программу возможности редактирования данных. При выборе одного из
158
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
элементов списка должен отображаться экран для редактирования
выбранного элемента (рис. 8.10).
управление клиентами
клиент
Имя
АД!МС
Nigel Smith
Nigel Smith's House
ID
сохранить
отмена
Рис. 8.10. Экран приложения для редактирования информации о
выбранном клиенте
159
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
При выборе элемента списка элемент ListBox генерирует событие
SelectionChanged, для которого можно создать обработчик.
Обработчик может выглядеть так:
private void customerList_SelectionChanged(object sender, SelectionChangedEv
{
// получение содержимого выбранного элемента
Customer selectedCustomer = customerListSelectedltem as Customer;
MessageBox.Show('Выбран элемент ” + selectedCustomer.Name);
}
Класс customerList содержит свойство SelectedItem, который
является ссылкой на выбранный объект. В этом коде выбранный объект
приводится к типу Customer, и программа выводит на экран окно с
сообщением, в котором указано имя выбранного клиента.
Теперь необходимо добавить возможность перехода к новой странице
приложения, которая позволит изменять информацию о выбранном
клиенте. Для этого необходимо изучить, как в приложениях Silverlight
выполняется переход к другой странице приложения.
8.5. Навигация по страницам приложения
До сих пор все рассмотренные примеры программ использовали только
одну страницу Silverlight. Однако, большинство приложений содержат
несколько страниц. В нашем примере необходима дополнительная
страница для вывода и редактирования информации о выбранном
клиенте.
Для добавление новой страницы в приложение нужно выбрать в
главном меню Visual Studio пункт Проект -> Добавить новый элемент....
Откроется окно со списком шаблонов, которые можно добавить в
проект. Выберем в списке пункт Страница Windows Phone в книжной
ориентации и укажем имя новой страницы CustomerDetailPage.xamL
После нажатия на кнопку Добавить в проект будет добавлена новая
страница приложения Windows Phone. Работа с новой страницей ничем
не отличается от работы со страницей MainPage.
1(50
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Навигация по страницам
Модель перемещения по страницам Silverlight больше похожа на
навигацию в Интернете, чем на приложение Windows Forms. У каждой
страница есть свой адрес, который указывается в виде URI
(универсальный идентификатор ресурса). Объект NavigationService
предоставляет методы для навигации.
// перемещение к странице CustomerDetailPage.xaml
N avigationService.N avigate(new Uri("/CustomerDetai]Page.xaml",
UriKind.RelativeOrAbsolute));
Этот код вызовет переход приложения на страницу
CustomerDetailPage. Обратите внимание, что метод Navigate
принимает значение URI, которое содержит название страницы и тип
URI.
При задании URI необходимо выбрать, будет указан относительный или
абсолютный адрес. Установка типа в значение
RelativeOrAbsolute обеспечивает гибкость, при загрузке
ресурсов. Значение URI является обычной строкой, поэтому необходимо
внимательно следить за правильностью указания ее значения, чтобы
избежать ошибок во время выполнения программы.
Использование кнопки Назад. Пользователи Windows Phone ожидают,
что при нажатии на аппаратную кнопку Назад произойдет переход к
предыдущей странице. Эта функциональность автоматически
поддерживается во всех приложениях для Windows Phone. Если
пользователь нажмет кнопку Назад на странице MainPage, то
приложение завершит работу.
Иногда необходимо переопределить это поведение, например, чтобы
пользователь не переходил на другую страницу, если не сохранил
введенные данные. Переопределить поведение кнопки Назад можно в
обработчике события BackKeyPress, в котором можно при
необходимости отменить переход:
private void PhoneApp]icationPage_BackKeyPress(object sender,
SysternComponentModeLCancelEventArgs e)
161
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
{
e.Cancel = true;
}
Этот метод-обработчик события BackKeyPress отменяет переход к
предыдущей странице при нажатии на кнопку Назад.
Если нужно, чтобы пользователь подтвердил намерение перейти на
другую страницу, можно использовать класс MessageBox:
private void PhoneApplicationPage_BackKeyPress(object sender,
SysternComponentModeLCancelEventArgs e)
{
if (MessageBox.Show('Вы действительно хотите перейти на другую ст
"Подтверждение перехода", MessageBoxButton.OKCancel) != Messag
{
e.Cancel = true;
}
}
Этот код выводит на экран окно сообщения и спрашивает пользователя,
действительно ли он хочет покинуть страницу. Если пользователь
нажмет кнопку отмена, переход будет отменен.
Передача данных между страницами
Каждая страница Silverlight работает независимо других страниц, и
данные каждой страницы приложения недоступны другим страницам.
Но иногда нужно передавать данные из одной страницы в другую. Если
данные являются простой строкой текста, самый простой способ
передачи — добавить строку к URI целевой страницы. Этот метод
похож на отправку запросов на веб-сервер.
В нашей программе для работы с клиентами при выборе пользователем
клиента из списка нужно передать его имя и адрес на страницу
редактирования.
private void customerList_SelectionChanged(object sender, SelectionChangedEv
162
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
{
// получение информации о выбранном клиенте
Customer selectedCustomer = customerListSelectedltem as Customer;
// формирование строки адреса с информацией о клиенте
NavigationService.Navigate(new Uri("/CustomerDetai]Page.xamPname=" +
selectedCustomer.Name + "&address=" + selectedCustomer.Address,
UriKind.Relative));
}
Этот метод вызывается, когда пользователь выбирает клиента. Метод
получает информацию о выбранном клиенте и формирует URI целевой
страницы, в который добавляет информацию о выбранном клиенте.
Часть запроса после символа "?" состоит из двух записей вида
имя=значение, разделенных символом "&".
Теперь рассмотрим, как целевая страница может получить и
использовать переданную информацию. Для этого необходимо изучить
события, возникающие при навигации по страницам Silverlight.
Использование событий при навигации по страницам. При переходе на
страницу Silverlight происходит событие OnNavigatedTo, а при уходе
со страницы — событие OnNavigatingFrom. Для получения
управления при возникновении этих событий нужно переопределить
соответствующие методы в программном коде страницы.
Для того чтобы приложение получило управление при перемещении
пользователя к странице, нужно переопределить OnNavigatedTo:
protected override void OnNavigatedTo(System.Windows.Navigation.Navigatio:
{
string name, address;
if (NavigationContext.QueryString.TryGetValue("name", out name))
nameTextBlock.Text = name;
if (NavigationContext.QueryString.TryGetValue("address", out address))
addressTextBlock.Text = address;
}
Этот метод пытается получить из свойства QueryString объекта
NavigationContext значения переданных в строке адреса
163
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
параметров. Каждый раз, когда пользователь переходит к этой странице,
этот метод вызывается и выводит на страницу переданные значения
параметров. Можно использовать событие OnNavigatedTo для
настройки страницы, когда пользователь переходит к ней. При переходе
на страницу можно передавать любое количество параметров.
Если запрашиваемый на странице параметр отсутствует, то программа
выполняется дальше без возникновения ошибки. Поскольку параметры
передаются в виде обычного текста, нужно внимательно следить за тем,
чтобы имена параметров при передаче данных и их считывании
совпадали.
Приведенный выше код можно использовать при создании
приложения, состоящего из двух страниц, которое позволяет
пользователю при выборе клиента выполнить переход на страницу с
подробной информацией об этом клиенте.
Однако, в этом коде есть проблема, которая возникает при выполнении
следующей последовательности действий:
1. Выбор элемента в списке.
2. Переход к странице с подробной информацией.
3. Нажатие кнопки Назад для возврата к списку:
4. Выбор того же самого элемента в списке.
При выполнении этой последовательности действий на странице не
будет отображаться информация о том же самом клиенте. Для этого
нужно выбрать другого клиента, и затем выбрать первого еще раз.
Причина такого поведения состоит в том, что программа использует для
перехода событие SelectionChanged, которое не происходит при
повторном выборе того же самого клиента. Можно устранить эту
проблему, сбрасывая выбор элемента при переходе к этой странице:
protected override void OnNavigatedTo(System.Windows.Navigation.Navigatio:
{
customerListSelectedltem = null;
}
Теперь при повторном выборе того же самого элемента он будет
164
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
считаться "новым" выбранным элементом. Однако, установка значения
выбранного элемента в null также расценивается как выбор элемента,
и при попытке обращения к значению этого свойство возникнет
исключение. Избежать этого можно, добавив в обработчик события
проверку, был ли выбран элемент:
private void customerList_SelectionChanged(object sender, SelectionChangedEv
{
// отмена вызова, если элемент не выбран
if (customerListSelectedItem == null)
return;
// код метода
}
Совместное использование объектов несколькими
страницами
Часто требуется, чтобы страницы совместно использовали объекты,
содержащие структурированные данные. В нашем приложении было бы
удобнее передать на страницу подробной информации экземпляр
объекта.
Можно легко предоставить совместный доступ к объектам для всех
страниц приложения. Для этого используется страница App.xaml,
которая автоматически создается при создании проекта приложения. Ее
можно считать контейнером для приложения Windows Phone. Эта
страница не выводится на экран, но файл App.xaml.cs содержит методы,
которые выполняются при запуске приложения.
Можно изменить файл App.xaml.cs и добавить в него свой код. Если
нужно хранить какие-либо глобальные данные, которые должны быть
доступны всем страницам приложения, их объявления можно
разместить здесь.
public partial class App : Application
{
// объект используется другими страницами приложения
165
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
public Customer ActiveCustomer;
}
Этот код содержит объявление объекта ActiveCustomer, который
будет доступен всем страницам. Объект содержит ссылку на
информацию о выбранном клиенте.
Любая страница Silverlight может получить ссылку на объект,
размещенный на странице App:
protected override void OnNavigatedTo(System.Windows.Navigation.Navigatio:
{
base.OnNavigatedTo(e);
// получение ссылки на страницу с информацией о текущем клиенте
App thisApp = Application.Current as App;
// установка контекста данных для отображения в элементе Grid
customerDisplayGrid.DataContext = thisApp.ActiveCustomer;
}
Свойство Current класса Application является ссылкой, по
которой можно обратиться к объектам в классе Application. При
запуске приложения ей присваивается значение адреса текущей
страницы.
Класс App.xaml.cs определяет дочерний класс App, который расширяет
родительский класс Application. Чтобы получить объекты,
определенные в классе App, нужно получить значение свойства
Current класса Application и привести ее к типу App.
Приведенный выше код запускается на странице
customerDetailsPage, когда к ней происходит переход. При этом
вызывается объект ActiveCustomer, который устанавливается в
качестве контекста данных объекта customerDisplayGrid для
обращения к выбранному клиенту.
Все объекты приложения, которые должны быть доступны другим
страницам, имеет смысл помещать в класс App.xaml.cs. Здесь также
можно добавить код, который при запуске программы будет загружать
166
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
данные в эти объекты из хранилища.
8.6. Использование классов ViewModel
На текущий момент наша программа может отображать информацию о
клиенте, но не позволяет редактировать эту информацию. Пользователь
может изменить текст в полях страницы, но изменения не будут
сохраняться в программе.
Чтобы внесенные на странице изменения обновляли данные в списке
клиентов, можно использовать привязку данных. При этом, привязка
текста в элементе TextBox должна быть двусторонней, чтобы при
изменении данных на экране приложения автоматически обновлялось
связанное с элементом свойство:
<TextBox Name="nameTextBox" Text="{Binding Name, Mode=TwoWay} ” />
После этого можно добавить код к классу Customer классу для
управления связанными событиями. Этот код при изменении имени
клиента должен изменяться текст на экране, и если текст элемента
TextBox изменится, то связанное с элементом также должно
изменяться автоматически. Но можно сделать это немного иначе,
использовав модель, известную под названием Model—View—
ViewModel.
Создание класса ViewModel
Можно добавить привязку данных с классом Customer, но есть
некоторые причины, почему это не является хорошей идеей. Существует
правило проектирования программного обеспечения: обычно класс
должен выполнять одно действие, и только одно. Класс Customer
должен хранить данные о клиентах, но не должен участвовать в
процессе редактирования. При хранении или передаче данных о
клиентах мы не должны создавать методы, которые касаются
редактирования данных. При передаче объекта, представляющего
клиента, на другое устройство или при осуществлении привязки
данных любое дополнительное свойство или метод будет лишней
167
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
тратой пространства, так как не будет использоваться в этом контексте.
Возможность преобразования и проверки допустимости данных. В
идеале, при вводе данных пользователем всегда должна осуществляться
проверка соответствия вводимых данных определенным правилам.
Например, должно соблюдаться правило: 'Имя должно содержать
только буквы и пробелы". Можно поместить эти правила в класс
Customer, но будет намного проще указать их непосредственно в
процессе ввода данных, так как они должны использоваться только при
вводе данных. Также полезна возможность выполнять преобразование
некоторых входных значений, например даты и времени, из текстового
формата, в котором они вводятся и выводятся, в формат, в котором
значения хранятся.
Возможность отмены действия. Практически всегда при
проектировании формы для редактирования каких-либо значений
рекомендуется предусмотреть возможность отмены сделанных
пользователем, но еще не сохраненных изменений. Обычно в таких
формах присутствуют кнопки сохранить и отмена. При использовании
привязки данных это может оказаться проблемой, поскольку в этом
случае объект данных сразу изменяется. Чтобы отследить изменения,
внесенные пользователем, необходимо создать копию данных при
открытии формы, и при отмене изменений использовать ее, что очень
неудобно и требует создания дополнительного кода.
Создание класса ViewModel. Можно избежать этих проблем, создав
класс ViewModel. Этот класс предназначен для представления данных и
связывания с компонентами формы и также может выполнять
необходимые проверки допустимости данных.
Создадим класс ViewModel для представления действий, которые нужно
выполнить в пользовательском интерфейсе. Этот класс соединяет
пользовательский интерфейс с объектами данных, содержит свойства,
которые будут использоваться в пользовательском интерфейсе:
public class CustomerView : INotifyPropertyChanged
{
private string name;
168
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
public string Name
{
get
{
return name;
}
set
{
name = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("name"));
}
}
}
// свойство Address создается таким же образом
private int id;
public int ID
{
get
{
return id;
}
}
public event PropertyChangedEventHandler PropertyChanged;
public void Load(Customer cust)
{
Name = cust.Name;
Address = cust.Address;
id = cust.ID;
}
public void Save(Customer cust)
169
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
{
cust.Name = Name;
cust.Address = Address;
}
}
Этот класс генерирует события при изменении свойств в программе, и
элементы Silverlight могут устанавливать новые значения свойств в
классе при их изменении пользователем. Обратите внимание, что
свойство ID доступно только для чтения, и пользователь не может
изменить его значение. Это позволяет обеспечить уникальность
идентификатора клиента.
Работа с данными в классе ViewModel. Класс CustomerView также
содержит методы Load и Save, предназначенные для взаимодействия
программы с содержимым класса ViewModel. Следующий код
выполняется перед началом редактирования информации о клиенте:
// создание экземпляра класса ViewModel для страницы редактирования
CustomerView view = new CustomerView();
protected override void OnNavigatedTo(System.Windows.Navigation.Navigatio:
{
// получить ссылку на страницу, содержащую информацию об активн
App thisApp = Application.Current as App;
// загрузить объект с информацией об активном клиенте в класс View]
view.Load(thisApp.ActiveCustomer);
// установить контекст данных для отображения
customerDisplayGrid.DataContext = view;
}
Когда программа переходит на страницу для редактирования
информации о клиенте, Silverlight вызывает метод OnNavigatedTo
для настройки страницы. Этот метод получает информацию о
выбранном клиенте и загружает ее в экземпляр класса
CustomerView.
170
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Когда пользователь нажимает кнопку сохранить, программа должна
выгрузить содержимое класса ViewModel в редактируемое свойство
Customer:
private void saveButton_Click(object sender, RoutedEventArgs e)
{
// получить ссылку на страницу, содержащую информацию об активн
App thisApp = Application.Current as App;
// скопировать данные из класса ViewModel в свойство ActiveCustomei
view.Save(thisApp.ActiveCustomer);
// вернуться на предыдущую страницу
N avigationS ervice. GoBack();
}
Навигация по страницам с использованием метода
GoBack
Класс NavigationService содержит метод GoBack, который
переносит пользователя к предыдущей странице. Это эффективнее, чем
использование URI, потому что при этом страница не обновляется.
Если перейти на страницу, используя метод Navigate класса
NavigationService, будет создана новая страница, и она будет
создаваться каждый раз при переходе на нее. Это может замедлить
работу приложения и привести к созданию и освобождению большого
количества элементов Silverlight. Кроме того, неудобно при каждом
переходе на страницу со списком прокручивать ее вниз, поскольку в
этом случае при переходе на страницу будет отображаться начало
списка.
Однако, использование метода GoBack для перехода к предыдущей
странице приводит к возникновению некоторых проблем. Трудность
состоит в том, что предыдущая страница не будет содержать изменения
данных, которые внесет пользователь. Например, пользователь
выполняет следующие действия:
171
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
1. Выбор клиента из списка.
2. Изменение имени клиента.
3. Нажатие кнопки сохранить для выполнения изменений.
4. Возврат к предыдущей странице.
После выполнения этих действий в списке будут содержаться
первоначальные значения без учета сделанных пользователем
изменений. Проблема состоит в том, что элемент ListBox не знает,
что содержимое одной из записей в списке изменилось, поскольку при
выводе списка на экран создается его копия, и при изменении данных
эта копия обновляться не будет. Решение этой проблемы основано на
использовании наблюдаемых коллекций ObservableCollection.
Наблюдаемые коллекции
Класс ObservableCollection используется для хранения
коллекции элементов и предоставляет поддержку уведомлений так,
чтобы при изменении коллекции элемент ListBox можно было
связать с событием изменения. Для создания наблюдаемой коллекции
можно использовать имеющийся список:
ObservableCo]lection<Customer> observableCustomers;
private void PhoneApp]icationPage_Loaded(object sender, RoutedEventArgs e)
{
// получить ссылку на страницу, содержащую список клиентов
App thisApp = Application.Current as App;
// создать наблюдаемую коллекцию этих клиентов
observableCustomers = new ObservableCo]lection<Customer>(
thisApp .ActiveCustomerListCustomerList);
// отображение элементов наблюдаемой коллекции
customerListltemsSource = observableCustomers;
}
Этот код выполняется при запуске главной страницы приложения. Он
создает новый список observableCustomers на основе
172
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
имеющегося списка клиентов и устанавливает этот список в качестве
источника данных элемента customerList. Теперь, при изменении
значения элементов в списке эти изменения будут отображаться на
экране.
Однако, если пользователь обновит имя клиента, это изменение не
будет отражено на экране, потому что ObservableCollection
реагирует на изменение содержимого списка, но не на изменение
данных в элементе списка. Это является очень серьезным недостатком,
приводящим к неправильной работе программы.
Чтобы исправить эту ошибку, нужно как-то внести изменения в список,
чтобы он обновлялся на экране. Один из способов вызвать обновление
заключается в том, чтобы удалить элемент из списка и снова его
добавить. Изменения содержимого наблюдаемой коллекции генерируют
события, которые обрабатывает элемент ListBox, который выводит
список на экран.
protected override void OnNavigatedTo(System.Windows.Navigation.Navigatio:
{
// получить ссылку на страницу, содержащую список клиентов
App thisApp = Application.Current as App;
if (thisApp.ActiveCustomer != null)
{
// найти нужного клиента в списке
int pos = observableCustomersJndexOfthisApp.ActiveCustomer);
// удалить клиента
observableCustomers.RemoveAt(pos);
// вернуть клиента назад
observableCustomers.Insert(pos, thisApp.ActiveCustomer);
}
}
Этот код выполняется, когда пользователь переходит назад к главной
странице. Если выбран какой-нибудь клиент, метод удаляет этого
клиента из списка и затем добавляет его на то же самое место. Это
вызывает изменение списка, и пользователь будет видеть сделанные
изменения. При обновлении всего одного элемента обновление будет
173
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
выполняться довольно быстро. Это особенно важно, если список
содержит несколько тысяч элементов.
При использовании класса ViewModel для редактирования
информации о клиенте мы создавали методы для загрузки и сохранения
информации, которые заносили информацию о клиенте в класс
CustomerView и затем возвращали обновленные значения. При
использовании класса ObservableCollection необходимо сделать
что-то похожее. К счастью, существует много способов получения
списка данных из класса ObservableCollection. Например,
можно использовать расширяющий метод ToList:
thisApp.ActiveCustomerListCustomerList = observableCustomers.ToLisKCusti
Использование наблюдаемых коллекций не приводят к повышению
расхода памяти, поскольку содержат набор ссылок на уже существующие
объекты. Соответственно, требуется лишь небольшой объем памяти для
хранения дополнительных ссылок на объекты. Однако, наблюдаемые
коллекции не имеет смысла использовать, если программа только
выводит список на экран, но не изменяет его.
Краткие итоги
1. Программы могут изменять значения свойств элементов Silverlight
для управления отображением элементов на экране. К числу
свойств относятся положение элемента на экране и его цвет.
2. Большинство свойств элементов удобнее задавать, редактируя
напрямую XAML-код. XAML-описание элемента имеет
определенную структуру, в которой одни свойства могут
вкладываться в другие.
3. В элементе TextBox есть набор свойств, которые задают тип
клавиатуры, которая будет использоваться для ввода данных.
Можно использовать для ввода специальную клавиатуру для
ввода чисел вместо клавиатуры для ввода произвольного текста.
4. Windows Phone может выводить на экран окно с сообщением для
пользователя. Текст сообщения может состоять из нескольких
строк. Сообщения могут также использоваться для подтверждения
или отмены действий пользователя.
174
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
5. Ресурсы могут быть добавлены в приложение для Windows Phone
как часть содержимого или как внедренные ресурсы. Элемент
содержимого копируется в каталог приложения в отдельный файл,
который может использоваться программой. Внедренный ресурс
встраивается в файл сборки приложения. Элементы содержимого
не замедляют загрузку сборки, но могут медленнее загружаться во
время работы программы. Внедренные ресурсы загружаются
быстрее, но увеличивают размер сборки программы.
6. Элементы Siiverlight могут генерировать события в ответ на
действия пользователя. Например, событие TextChanged
элемента TextBox происходит при изменении текста элемента.
7. Silverlight предоставляет привязку данных, с помощью которой
свойства программного объекта могут быть соединены со
свойствами визуального элемента Silverlight. Привязка может быть
однонаправленной, когда визуальный элемент используется
только для вывода значения объекта программы, или
двунаправленной, когда изменение свойства визуального
элемента приводит к обновлению связанного свойства класса.
8. Можно связать коллекцию элементов с элементом ListBox для
отображения списка элементов. Шаблон данных используется для
описания того, как отдельные свойства каждого элемента должны
выводиться на экран.
9. Приложения Silverlight могут состоять из нескольких страниц.
Навигация по страницам выполняется в классе Navigate,
который использует URI страницы. Простые строковые значения
можно передавать между страницами, разместив их в строке
запроса, присоединенной к URI.
10. Страницы могут получать события при перемещении к ним и от
них. Событие OnNavigatedFrom предоставляет возможность
отмены перехода на другую страницу, если нужно чтобы
пользователь подтвердил переход.
11. Большие объекты данных могут совместно использовать
несколько страниц приложения с помощью класса App, который
является частью приложения Windows Phone. Любая страница
приложения Silverlight может получить ссылку на объект
приложения, который является частью этого приложения.
12. Программисты могут создать классы ViewModel, которые
связывают редактируемые данные с элементами на странице
175
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Silverlight.
13. Механизм ObservableCollection позволяет отразить на
экране изменения в коллекции элементов.
Вопросы
1. Как в программе можно обработать ошибку, если пользователь
введет вместо числа произвольный текст?
2. Как во время работы программы изменить цвет текста?
3. Что нужно сделать, чтобы при выборе пользователем текстового
поля выводилась специальная клавиатура для ввода чисел?
4. Как при создании программы можно изменить свойства элемента
Silverlight?
5. Как вывести на экран сообщение, чтобы приложение могло
получить ответ от пользователя?
6. Какие настройки можно задать при добавлении в проект ресурса?
7. В чем разница между элементом контента и внедренным
ресурсом?
8. Что нужно сделать, чтобы добавить к программу код, который
должен выполняться, когда происходит определенное событие?
9. Для чего используется привязка данных?
10. Как выполнить привязку объекта данных к визуальному элементу
Silverlight?
11. В чем разница между однонаправленной и двунаправленной
привязкой данных?
12. Как можно указать поддерживаемый страницей приложения тип
ориентации?
13. Для чего предназначены объекты-контейнеры?
14. Как можно вывести в приложение список данных?
15. Как осуществить переход к другой странице приложения?
16. Как можно передать данные другой странице приложения?
17. Как создать и использовать в приложении класс ViewModel?
18. Для чего используются наблюдаемые коллекции?
Упражнения
Упражнение 1. Добавление обработки ошибок
176
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Существующая версия программа Калькулятор времени работает при
вводе правильных числовых значений, но выдает исключение, если
пользователь введет значения, лежащие вне диапазона, или
произвольный текст, который не является числом. Необходимо добавить
в программу код для обработки следующих ошибок:
• ввод произвольного текста вместо чисел;
• ввод значения часа, которое больше 23 или меньше 0;
• ввод значения минут, которое больше 59 или меньше 0;
• ввод времени начала, которое больше времени окончания.
В этом упражнении Вы улучшите версию программы, созданную
другим программистом.
1. Откройте в Visual Studio проект TimeCalculator в папке Lab4
TimeCalculator.
2. Запустите программу. Введите значения Начало: 0a:00 и
Окончание: 00:00 и нажмите кнопку вычислить.
3. Приложение сгенерирует исключение, поскольку значение 0a не
может быть преобразовано в число.
Измените код программы, чтобы учесть приведенные выше замечания.
• Используйте метод TryParse для преобразования текста в
число, чтобы программа могла обнаружить недопустимые
значения.
• Выделите на экран недопустимые значения красным цветом, а
допустимые значения — цветом текста по умолчанию.
• Выведите на экран окно с сообщением, если время начала и
окончания события недопустимо.
Упражнение 2. Улучшение пользовательского интерфейса
Элементы TextBox в приложении могут генерировать событие
TextChanged, когда пользователь вводит новые значения. Связанный
с этими событиями код может автоматически обновлять значения на
экране.
177
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
1. Добавьте обработчик события TextChanged так, чтобы не
нужно было использовать кнопку вычислить.
2. Удалите кнопку вычислить.
Лучший способ это сделать заключается в том, чтобы создать один
метод, который будет вызываться для отображения нового значения
результата при изменении любого текстового поля. Этот метод можно
использовать в обработчиках элементов TextBox.
Упражнение 3. Использование привязки данных
Другой программист создал класс TimeClass для приложения. В
классе пять свойств:
1. StartHour
2. StartMinute
3. EndHour
4. EndMinute
5. MinuteDifference
Вам нужно выполнить привязку данных для связывания элементов на
экране с этими свойствами. Первые четыре свойства будут
использовать двунаправленную привязку, а пятое свойство является
выходным значением, которое используется для вывода на экран
результата.
Добавление класса TimeClass в качестве ресурса
Сначала нужно добавить TimeClass в проект так, чтобы его могли
использовать элементы Silverlight.
1. Откройте в Visual Studio проект TimeCalculator в Lab4 Data Binding
TimeCalculator.
2. Откройте страницу MainPage.xaml.
3. Сначала нужно добавить пространство имен к ресурсам страницы
MainPage. После строки, которая начинается на
xmlnsmc = "httpy/schemas.openxmlformats....
178
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
добавьте строку
xmlns:local = "clr-namespaceTimeCalculator"
4. Теперь нужно добавить связь к классом, который мы хотим
использовать. После строки
shelSystemTray. IsVisible=' True" >
добавьте строки
<phone:PhoneApplicationPage.Resources>
<local:TmeClass xKey="TmeClass" />
</phone:PhoneApplicationPage.Resources>
5. Теперь можно добавить ресурс к элементу Grid, который
содержит элементы Silverlight пользовательского интерфейса
приложения. В элемент Grid с именем LayoutRoot добавьте
следующий атрибут:
DataContext = "{StaticResource TimeClass}"
Связывание данных со свойствами элементов
1. В редакторе Visual Studio щелкните по элементу
startHourTextBox. В области свойств будут отображаться
свойства этого элемента.
2. Щелкните правой кнопкой мыши по свойству Text, и выберите в
контекстном меню пункт Применить привязку данных....
Появится список доступных свойств.
3. Дважды щелкните по элементу StartHour. Обратите внимание,
что в параметрах задан режим TwoWay.
4. Повторите эти действия для привязки свойств StartMin,
EndHour и Endmin к соответствующим элементам.
5. В настройках привязки элемента resultTextBlock к свойству
MinuteDi fference установите режим привязки OneWay.
6. Запустите программу и введите значение времени окончания.
Проверьте, что значение результата обновляется, когда
пользователь переходит к другому элементу.
179
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Теперь программа использует привязку данных, но часть обработка
ошибок при вводе не выполняется. Попробуйте добавить в программу
код для обработки ошибок. Для этого можно добавить в класс
TimeClass свойства с сообщениями об ошибке и связать их с
визуальными элементами.
Упражнение 4. Связывание данных со списками
Вашему начальнику нужно приложение для работы с информацией о
клиентах, которое может выводить на экран список встреч с каждым
клиентом. Программист начал писать эту программу, но не закончил ее.
Вам поручено дописать программу.
Класс Session
Этот класс содержит текстовое описание встречи и ее
продолжительность в минутах.
public class Session
{
public string Description { get; set; }
public int LengthInMins { get; set; }
public Session(string ^Description, int inLength)
{
Description = ^Description;
LengthInMins = inLength;
}
}
Класс Customer содержит список встреч с клиентом.
public List<Session> Sessions;
Программа создает тестовый набор встреч для каждого клиента, но Ваш
начальник считает, что этого недостаточно.
Увеличение количества тестовых данных
Для начала нужно изменить метод MakeTestCustomers класса
180
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Customers, чтобы создать больше тестовых данных.
1. Откройте в Visual Studio проект CustomerManager в папке Lab4
CustomerManager.
2. Откройте файл Customers.cs.
3. Найдите в классе Customers метод MakeTestCustomers.
Этот метод создает тестовый набор клиентов, и для каждого
клиента создается несколько тестовых встреч. Количество встреч
для каждого клиента определяется случайным образом, но
диапазон значений является слишком маленьким.
4. Найдите строку
int noOfSessions = sessionRand.Next(1,4);
Метод Next возвращает случайное значение из диапазона 1—3,
что позволит создать максимум 3 тестовых встречи с одним
клиентом.
5. Измените параметры метода так, чтобы для каждого клиента было
создано 20—30 встреч. Это позволит проверить, что выводимый
на экран список клиентов можно прокручивать.
Добавление навигации по страницам
Страница с информацией о клиенте теперь содержит кнопку встречи,
которая используется для просмотра встреч с клиентом. Но пока кнопке
не назначен обработчик событий, и при ее нажатии ничего не
происходит. Необходимо создать обработчик нажатия на кнопку и
добавить код для перехода к странице встреч.
1. Откройте в редакторе Visual Studio страницу
CustomerDetailPage.xaml.
2. Дважды щелкните по кнопке встречи, чтобы создать обработчик
событий и перейти к файлу кода CustomerDetailPage.xaml.cs.
3. В созданный метод sessionButton_Click добавьте
следующий код для выполнения перехода на страницу
N avigationService.N avigate(new UriC'/SessionDetailPage.xaml",
UriKind.RelativeOrAbsolute));
181
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
4. Запустите программу. Выберите клиента и нажмите на кнопку
встречи. Произойдет переход на страницу встреч, но на экран
ничего не будет выводиться, потому что к странице не привязаны
никакие данные.
Добавление привязки данных на страницу Sessions
1. Откройте в Visual Studio файл с исходным кодом
SessionDetailPage.xaml.cs.
2. Переместите курсор в класс сразу после закрывающей фигурной
скобки конструктора SessionDetailsPage. Введите слово
override и нажмите пробел.
3. Intellisense выведет на экран список методов, которые могут быть
переопределены в этом классе. Выберите метод
OnNavigatedTo и нажмите Enter.
4. Добавьте следующий код в метод OnNavigatedTo.
// получить ссылку на страницу, содержащую информацию о выбр
App thisApp = Application.Current as App;
CustomerName.DataContext = thisApp.ActiveCustomer;
SessionListJtemsSource = thisApp.ActiveCustomer.Sessions;
5. Запустите программу. Выберите клиента и нажмите на кнопку
встречи. На экран будет выведен список встреч для выбранного
клиента. При нажатии на кнопку Назад произойдет переход на
страницу информации о клиенте. Если нажать кнопку Назад еще
раз, откроется страница со списком клиентов.
182
А.И. Гарибов
Обработка ошибок ввода данных
Цель работы: изучение возможностей предупреждения и обработки
ошибок при вводе данных в приложениях Silverlight для Windows Phone.
Основные теоретические сведения
Текстовые поля и контекст ввода
Чтобы упростить ввод текста, а также уменьшить количество ошибок
ввода, предлагается множество разнообразных технологий. Один из
вариантов — указание контекста ввода для текстовых полей, чтобы
платформа отображала соответствующий элемент управления.
Всего поддерживается более 60 контекстов ввода. Наиболее часто
используются следующие:
• по умолчанию — стандартная клавиатура. Первая буква
предложение автоматически устанавливается в заглавную;
• Text — предоставляет автодополение, автокоррекцию,
автоматическую расстановку апострофов, автоматическую
установку акцентов и заглавных букв;
• Number — предназначен для ввода цифр;
• TelephoneNumber — отображает телефонную клавиатуру;
• EmailSmtpAddress — добавляет символ @ для быстрого
доступа;
• CurrencyAmountAndSymbol — содержит цифры и значки
валют;
• URL — отключается вся автокоррекция, добавляются кнопка .com
и кнопка перехода.
Создайте приложение и добавьте внутрь элемента Grid следующий
XAML код:
<ScrollViewer>
<StackPanel>
<TextBlock>По умолчанию</TextBlock>
183
А.И. Гарибов
<TextBox/>
<TextBbck>TeKCT</TextBbck>
<TextBox InputScope='Text"/>
<TextBlock>Цифры</TextBlock>
<TextBox InputScope="Number"/>
<TextBlock>HoMep телефона<Лех1ВЬск>
<TextBox InputScope='TelephoneNumber"/>
<TextBlock>E-mail</TextBlock>
<TextBox InputScope="EmailSmtpAddress"/>
<TextBlock>noHCK</TextBlock>
<TextBox InputScope="Search"/>
<TextBlock>Деньги</TextBlock>
<TextBox InputScope="CurrencyAmountAndSymbol"/>
<TextBlock>URL</TextBlock>
<TextBox InputScope="URL"/>
</StackPanel>
</ScrolIViewer>
Запустите приложение и проверьте, как меняется панель ввода и
настройки автокоррекции и автодополнения для разных контекстов
ввода. Переключите эмулятор на русский интерфейс, добавьте русскую
клавиатуру и протестируйте приложение ещё раз.
Обработка исключений
Если в программе текстовое поле предназначено для ввода числа, то
рекомендуется задать для этого поля соответствующий контекст ввода.
Однако, использование специализированного контекста ввода не
гарантирует, что пользователь не сможет ввести некорректное значение.
Например, строка "12.34.56" не является числом. При попытке
преобразования этой строки в вещественное число программа
184
А.И. Гарибов
сгенерирует исключение.
Чтобы избежать подобной ошибки, в код программы нужно добавить
блок кода try — catch:
float f;
try
{
f = float.Parse(numberTextBox.Text);
}
catch (Exception ex)
{
// обработка ошибки
}
Если в секции try будет сгенерировано исключение, то программа
передаст управление секции catch, в которой можно обработать
ошибку и предотвратить аварийное завершение работы программы. В
блоках кода try — catch можно обрабатывать любые исключения.
Избежать генерации исключений при вводе пользователем строки,
которая не является числом, можно с помощью метода TryParse,
который есть у всех классов для хранения целых и вещественных чисел:
float f;
if (float.TryParse(numberTextBox.Text, out f))
{
// продолжение работы
}
else
{
// обработка ошибки
}
Метод TryParse не генерирует исключений, поэтому блоки кода try
— catch здесь не нужны.
Дополнительные материалы
185
А.И. Гарибов
Сайт MSDN:
http://msdn.microsoft.com/ru-ru/library/
system.windows.input.inputscopenamevalue.aspx.
Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/5b2yeyab.
Задание к работе
1. Откройте в Visual Studio созданный в предыдущих работах проект
программы для Windows Phone.
2. Добавьте в описание текстовых полей для ввода данных
подходящие значения свойства InputScope, представляющее
контекст ввода. Это позволяет повысить удобство ввода данных в
программу, но не избавит полностью от возможного ввода
недопустимых значений.
3. Добавьте в код программы блоки try — catch для обработки
ввода недопустимых значений, а также код для того чтобы
показать пользователю, какие данные он ввёл неверно.
4. Запустите программу и проверьте правильность её работы в
случае, если пользователь ввёл неверные данные, а затем
исправил ошибочно введённые данные.
5. Составьте отчёт о проделанной работе. Включите в отчёт
необходимые листинги программы.
186
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Привязка данных
Цель работы: изучение возможностей использования привязки данных
к визуальным элементам Silverlight
Основные теоретические сведения
Привязка данных позволяет связать визуальные элементы с методами,
которые работают с этими элементами. Это позволяет связать свойство
визуального элемента напрямую с объектом. Все что нужно для этого
сделать — это создать особый объект, значения которого будут
автоматически передаваться элементам Silverlight.
Привязка данных может работать в любом направлении. Можно связать
текст элемента TextBox с приложением таким образом, чтобы при
изменении текста в этом текстовом поле приложение было об этом
уведомлено. Также можно связать элемент TextBlock с объектом так,
чтобы при изменении свойства объекта содержимое элемента
TextBlock соответственно обновлялось. Это пример
двунаправленной привязки, когда программа может сама изменить
элемент и отреагировать на изменения в этом элементе. Можно задать
однонаправленную привязку, чтобы программа только выводила на
экран результаты при изменении свойства объекта. Наконец, можно
связать любые свойства объектов так, чтобы программа могла
переместить элемент Silverlight по экрану при изменении свойств X и Y
объекта игры.
Создание объекта для привязки
Попробуем создать программу Сумматор, использующую привязку
данных. Начнём с класса, который сделает всю работу Нужно
определить свойства класса, которые будут связаны со свойствами
визуальных элементов. Наш объект будет содержать три свойства:
• текст верхнего элемента TextBox;
• текст нижнего элемента TextBox;
• текст элемента TextBlock.
187
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Можно создать класс AdderClass, имеющий следующую структуру:
public class AdderClass
{
private int topValue;
public int TopValue
{
get
{
return topValue;
}
set
{
topValue = value;
}
}
private int bottomValue;
public int BottomValue
{
get
{
return bottomValue;
}
set
{
bottomValue = value;
}
}
public int Answer Value
{
get
{
return topValue + bottomValue;
}
}
}
188
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
У этого класса три свойства. Первые два предназначены для чтения и
записи, чтобы можно было получить текст верхнего и нижнего
текстового поля и занести в них новые значения. Третье свойство
предназначено только для получения последнего результата без
возможности его изменения напрямую. Программа может создать
экземпляр этого класса, установить значения свойств TopValue и
BottomValue и затем получить результат.
Добавление функций уведомления
Для того чтобы класс можно было связать с объектом Silverlight, в нём
должен быть реализован интерфейс INotifyPropertyChanged:
public interface INotifyPropertyChanged
{
// Событие происходит при изменении значений свойства
event PropertyChangedEventHandler PropertyChanged;
}
Класс, который реализует этот интерфейс, должен содержать делегат
события, которое будет использовать класс AdderClass для
сообщения об изменении значения свойства.
public event PropertyChangedEventHandler PropertyChanged;
Класс PropertyChangedEventHandler используется элементами
Silverlight для управления сообщениями событий. Он описан в
пространстве имён System.ComponentModel. Если компонент
Silverlight нужно связать с каким-либо свойством класса, можно
добавить к этому событию делегаты.
Класс AdderClass будет использовать этот делегат для того, чтобы
сообщить об изменении одного из свойств в классе. При этом
произойдёт обновление экрана. Связанные с этими свойствами
объекты Silverlight связываются с делегатом, чтобы они могли получить
уведомление в случае необходимости. Окончательная версия класса
может выглядеть так:
189
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
public class AdderClass : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private int topValue;
public int TopValue
{
get
{
return topValue;
}
set
{
topValue = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("AnswerValu
}
}
}
// то же самое для свойства BottomValue
public int Answer Value
{
get
{
return topValue + bottomValue;
}
}
}
Класс AdderClass теперь содержит свойство PropertyChanged.
Каждый раз при изменении значения свойства он должен проверить
значение свойства PropertyChanged. Если оно не равно null, то
оно связано с делегатом. Можно рассматривать свойство
PropertyChanged как список рассылки. Процесс может подписаться
190
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
на рассылку и получать уведомления об интересующих событиях,
которые происходят в AdderClass. Если никто не подписан на
список рассылки (то есть значение PropertyChanged равно null),
то нет точки вызова метода для описания изменений. Однако, если оно
не равно null, это означает, что есть объект, который интересуют
изменения, происходящие в AdderClass.
Вызов метода, который генерирует событие, выглядит следующим
образом:
PropertyChanged(this, new PropertyChangedEventArgs("AnswerValue"));
Первый параметр является ссылкой на объект, который генерирует
событие. Вторым параметром является значение аргумента, которое
содержит имя свойства, значение которого изменилось. Элемент
Silverlight использует технологию отражения (т.е. он будет считывать
публичные свойства класса AdderClass), чтобы узнать, какие
свойства доступны. Если он получит уведомление, что значение
свойства AnswerValue изменилось, то он будет обновлять все
свойства визуальных элементов, связанные со свойством этого класса.
Когда программа сгенерирует событие, на экран будет выведено
обновлённое значение свойства AnswerValue. При вызове кода
секции get свойства AnswerValue он вычисляет и возвращает
результат.
public int AnswerValue
{
get
{
return topValue + bottomValue;
}
}
Следующим шагом будет соединение этого объекта с пользовательским
интерфейсом. Пользовательский интерфейс сообщит классу
AdderClass, когда значения двух текстовых полей будут изменены
пользователем. Когда будут вводиться новые значения полей, экземпляр
класса AdderClass должен сообщить пользовательскому интерфейсу,
191
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
что результат изменился, и его нужно вывести на экран.
Добавление пространства имён на страницу MainPage
Для того чтобы связать созданный объект с данными, нужно связать код
объекта с XAML-кодом, описывающим пользовательский интерфейс.
Необходимо добавить в код XAML пространство имён, содержащее
класс AdderClass:
xm]ns:bcal="dr-namespaceAddingMachine''
Этот атрибут корневого элемента в XAML-файле для страницы
MainPage.xaml делает доступными любые классы пространства имён
AddingMachine для использования в XAML-коде. Как и в программе
на C# в начале файла должны указываться все директивы using, так и в
начале файла XAML также должны указываться все используемые
пространства имён.
После добавления пространства имён нужно объявить имя класса,
который описан в этом пространстве имён и используется в качестве
ресурса:
<phone:PhoneApplicationPage.Resources>
<localAdderC]ass x:Key="AdderClass" />
</phone:PhoneApplicationPage.Resources>
Добавление класса к элементу на странице
После того как пространство имён стало доступным, можно соединить
нужный класс из этого пространства имён с элементами страницы. В
нашем случае таким элементом будет элемент Grid, который содержит
все визуальные элементы страницы. Добавление класса к элементу
автоматически делает его доступным для любых вложенных элементов,
и таким образом, элементы TextBox и TextBlock могут
использовать этот класс.
<Grid xName="LayoutRoot" Background="Transparent"
192
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
DataContext="(StaticResource AdderClass}">
Этот код указывает элементу Grid использовать класс AdderClass,
указанный в значении атрибута DataContext. В нашем приложении
он является статическим ресурсом, в котором класс является частью
программы.
Привязка элемента Silverlight к свойству объекта
Теперь класс AdderClass доступен в контексте данных элементам на
странице. При этом создаётся связь между страницей Silverlight и
объектом, в котором описано поведение.
Теперь нужно привязать свойства каждого элемента к свойствам
объекта. Для этого можно использовать область свойств для каждого
элемента. Нужно связать текст элемента firstNumberTextBox со
свойством TopValue класса AdderClass. Если щёлкнуть по
элементу TextBox в редакторе Visual Studio, откроется область свойств
для этого элемента, в которой для свойства Text в контекстном меню
нужно выбрать пункт Применить привязку данных.... После этого
откроется окно, в котором нужно указать, с каким свойством какого
объекта требуется связать выбранное свойство элемента.
Выбрав необходимый элемент из списка доступных элементов и их
свойств, можно привязать свойство элемента Silverlight к свойству
объекта. Обратите внимание, что в разделе Параметры выбран режим
TwoWay, при котором при изменении пользователем значения в
элементе TextBox объект автоматически был об этом уведомлён.
При связывании с элементом TextBlock доступен только режим
OneWay, поскольку нельзя передать в программу данные из объекта
TextBlock.
После установки привязки программа будет работать. При этом
содержимое файла MainPage.xaml.cs с кодом программы не изменится.
Вся работа теперь выполняется в классе, который соединён с
визуальными элементами. Изменение содержимого элементов
TextBox , используемых для ввода значений, приведёт к
193
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
возникновению события класса AdderClass, которые приведут к
изменению содержимого класса AnswerValue, связанного с
элементом ResultTextBlock.
Привязка данных через свойство DataContext
Для установки привязки к данным потребовалось проделать большую
работу Однако, существует способ упростить выполнение этих
действий.
Можно просто связать свойство объекта со свойством элемента в
XAML-коде, и Silverlight выполнит привязку:
<TextBox Height="72" HorizontalAligriment='Left" Margin="8,19,0,0"
Name="firstNumberTextBox" Text="{Binding TopValue, Mode=TwoWay}"
VerticalAlignment='Top" Width="460" TextAlignment="Center" />
В этом коде указана привязка текста элемента к свойству TopValue
объекта. Режим привязки установлен в значение TwoWay, чтобы
изменения в программе (при вычислении результата) отображались на
экране. Если нужно использовать визуальный элемент только для того,
чтобы показать значение (например, результат вычисления), можно
использовать режим привязки OneWay.
Теперь остаётся создать экземпляр класса AdderClass и присвоить
его свойству DataContext элемента, содержащего элемент
firstNumberTextbox. Это можно сделать в конструкторе для
основной страницы.
// Конструктор
public MainPageO
{
InitializeComponentO;
AdderClass adder = new AdderClassQ;
ContentGrid.DataContext = adder;
}
194
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Свойство DataContext элемента Silverlight идентифицирует объект,
который содержит все свойства, связанные с элементом и с теми
элементами, которые в нём содержатся. Элемент ContentGrid
содержит элементы TextBox и TextBlock, и теперь каждая
привязка, которую эти элементы содержат, будет отображаться на
созданный экземпляр класса Ad derClass.
Дополнительные материалы
Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/ms752347.
Задание к работе
1. Откройте в Visual Studio созданный в предыдущих работах проект
программы для Windows Phone.
2. Создайте класс, который будет использоваться для привязки
данных к визуальным элементам Silverlight вашего
приложения.Определите необходимые свойства класса и
перенесите код для вычисления результатов в методы созданного
класса.
3. Добавьте описание привязки свойств класса к визуальных
элементам на странице приложения.
4. Запустите программу и проверьте правильность её работы.
5. Составьте отчёт о проделанной работе. Включите в отчёт
необходимые листинги программы.
195
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Использование различных режимов ориентации
Цель работы: изучение возможностей проектирования интерфейса
приложения для обеспечения возможности работы приложения в
различных режимах ориентации экрана.
Основные теоретические сведения
Существует два варианта ориентации устройства: альбомная
(устройство расположено горизонтально) и книжная (устройство
расположено вертикально). Телефон может определить ориентацию, и
некоторые встроенные приложения правильно обрабатывают
изменение ориентации телефона.
Можно создавать приложения, которые смогут корректно работать в
обоих режимах ориентации. При этом, потребуется потратить вдвое
больше времени на создание пользовательского интерфейса и на
написание программного кода, обрабатывающего изменение
ориентации телефона и изменяющего соответственно ориентацию
приложений.
Указание ориентации в файле MainPage.xaml
Страница может сообщить Silverlight, какую ориентацию она
поддерживает. Для этого используются свойства класса
PhoneApplicationPage:
SupportedOrientations="Portrait" Orientation="Portrait"
Эти настройки Visual Studio использует по умолчанию при создании
страницы. Они указывают на то, что страница использует только
портретную ориентацию. В случае необходимости эти настройки можно
изменить, чтобы приложение изменяло ориентацию в соответствии с
ориентацией телефона:
SupportedOrientations="PortraitOrLandscape" Orientation="Portrait"
196
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 11.1. Приложение Сумматор в альбомной ориентации
Теперь программа изменяет содержимое экрана при изменении
ориентации устройства, но поскольку расположение всех элементов
задано фиксированными значениями, некоторые из них находятся не в
том месте, в каком хотелось бы их видеть, а поле для результата не
видно на экране.
<TextBox Height="72" Horizonta]A]ignment='Left" Margin="8,19,0,0"
Name="firstNumberTextBox" Text="0" VerticalA]ignment='Top" Width^^O"
TextA]ignment="Center" />
Этот элемент использует значения отступа от краёв экрана, которые
используются для точного указания расположения элементов на экране.
При этом, если у элемента указана позиция, которая находится за
пределами экрана, то Silverlight просто не будет отображать этот элемент
на экране.
Существует два способа исправления подобной ошибки. Один способ
заключается в изменении параметров расположения элементов при
изменении ориентации телефона.
Событие OrientationChanged
197
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Класс PhoneApplicationPage включает событие
OrientationChanged, которое происходит при изменении
ориентации страницы. Как и для других событий, для него можно
создать метод-обработчик, в который нужно добавить код для обработки
изменения ориентации экрана:
private void PhoneApplicationPage_OrientationChanged(object sender,
OrientationChangedEventArgs e)
{
if (e.Orientation == PageOrientation.PortraitUp)
{
setPortraitO;
}
else
{
setLandscape();
}
}
Этот код использует параметр, значение которого определяет новую
ориентацию, и вызывает соответствующий метод. Методы изменяют
значения отступов от краёв элементов, чтобы разместить их
подходящим для определённой ориентации образом:
private void setLandscape()
{
firstNumberTextBox.Margin = new Thickness(8, 19, 0, 0);
firstNumberTextBox.Width = 207;
secondNumberTextBox.Margin = new Thickness(252, 19, 0, 0);
secondNumberTextBox.Width = 207;
plusTextBlock.Margin = new Thickness(221, 35, 0, 0);
resultTextBlock.Margin = new Thickness(538, 35, 0, 0);
}
Код метода setPortrait аналогичен методу setLandscape.
Элементы располагаются в соответствии со значениями свойства
Margin. Отступы от краёв задаются значением свойства Thickness,
которое содержит величину отступа и ширину границы. В нашем случае
ширина границы установлена в 0, поэтому граница не будет
198
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
отображаться. После добавления этих методов приложение будет
работает в обоих режимах ориентации.
Рис. 11.2. Приложение Сумматор, настроенное под разные режимы
ориентации
Часто приложения при изменении ориентации экрана используют
анимацию перемещения элементов. Для создания подобных эффектов
рекомендуется использовать инструмент Expression Blend.
Использование контейнеров для группировки
элементов
Среди элементов Silverlight есть элементы-контейнеры, которые могут
содержать другие элементы. Существует несколько различных типов
контейнеров, среди которых есть элемент StackPanel.
Элемент StackPanel содержит последовательность элементов
Silverlight. Он позволяет располагать вложенные в него элементы в
определённом порядке. Элементы в контейнере могут располагаться
199
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
вертикально (сверху вниз) или горизонтально (слева направо). Вместо
того, чтобы настраивать для визуальных элементов отступы от краёв
экрана, можно поручить эту работу элементу StackPanel:
<StackPanel>
<TextBox InputScope='Digits" Height="72" HorizontalAlignment="C enter"
Name="firstNumberTextBox" VerticalAlignment="Top" Width="460"
TextAlignment="Center" />
<TextBlock Height="56" HorizontalAlignment="Center" Name="plusTextBloc
VerticalAlignment= "Top" FontSize="32" Width="25" />
<TextBox InputScope="Digits" Height="72" HorizontalAlignment="C enter"
Name="secondNumberTextBox" VerticalAlignment="Top" Width="460"
TextAlignment="Center" />
<TextBlock Height="46" HorizontalAlignment="Center" Name="resultTextBlo
VerticalAlignment="Top" FontSize="30" Width="160" TextAlignment="Cen
</StackPanel>
Элементы StackPanel решают сами, как будут отображаться
элементы на экране. В этом коде лишь указано выравнивание всех
элементов по центру выделенной им области.
При таком подходе возникает очень полезный побочный эффект,
который заключается в том, что контейнер StackPanel автоматически
перестроит элементы при изменении ориентации экрана.
200
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 11.3. Приложение Сумматор, использующее элемент StackPanel
Элемент StackPanel можно добавить к проекту, перетащив его с
панели инструментов Visual Studio в окно дизайнера или вводя текст
XAML вручную. Если элемент StackPanel должен группировать
элементы горизонтально, нужно указать соответствующий атрибут:
< StackPanel O rientation=" "Horizontal" >
Существуют и другие типы контейнеров. Один из них — элемент
Grid. Он позволяет создать прямоугольную сетку из элементов, в
каждом из которых может размещаться один или несколько элементов.
Также можно совместно использовать разные элементы-контейнеры,
что позволит группировать элементы особым образом.
Задание к работе
Windows Phone 7.5 Training Kit -https://
rusdpe.blob.core.windows.net/downloads/RusWP7TrainingKit.zip:
Labs/WindowsPhoneNavigationAndControls/WindowsPhoneNavigationAndContro
c2d3-4c5b-9db2-56dcc688d0ea.html.
201
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/ms754152.aspx.
Задание к работе
1. Откройте в Visual Studio созданный в предыдущих работах проект
программы для Windows Phone.
2. Добавьте в проект необходимый код для автоматического
изменения ориентации приложения при изменении ориентации
телефона.
3. Измените код программы так, чтобы при изменении ориентации
телефона на альбомную все элементы страницы программы
удобно располагались на экране и не выходили за пределы экрана.
4. Запустите программу и проверьте правильность её работы.
5. Измените программу так, чтобы элементы располагались на
экране автоматически, используя элементы Grid и
StackPanel.
6. Запустите программу и проверьте правильность её работы.
Сделайте выводы о том, какой способ расположения элементов на
странице удобнее использовать для поддержки вашим
приложением различных режимов ориентации.
7. Составьте отчёт о проделанной работе. Включите в отчёт
необходимые листинги программы.
202
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Отображение списков данных
Цель работы: изучение возможностей отображения на странице
приложения Silverlight списков данных.
Основные теоретические сведения
Часто в приложениях необходимо выводить списки каких-либо
объектов. Для этого необходимы специальные средства,
предусматривающие отображение списочных данных.
В качестве примера рассмотрим создание списка клиентов компании.
Информация о клиентах включает: имя клиента, адрес и идентификатор.
Класс Customer может выглядеть так:
public class Customer
{
public string Name { get; set; }
public string Address { get; set; }
public int ID { get; set; }
public Customer(string inName, string inAddress, int inID)
{
Name = inName;
Address = inAddress;
ID = inID;
}
}
Этот класс имеет единственный метод, который является
конструктором, принимающим три параметра.
Теперь нужно сохранить список клиентов. Лучший способ для хранения
списков объектов — использование класса List, который входит в
состав языка C#. Можно создать класс Customers, содержащий имя
списка клиентов и сам список:
public class Customers
{
2025
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
public string Name { get; set; }
public List<Customer> CustomerList;
public Customers(string inName)
{
Name = inName;
CustomerList = new List<Customer>();
}
}
Класс Customers содержит единственный метод, который является
конструктором класса. Он определяет имя списка и создаёт пустой
список. Используя этот класс, можно создать новый список таким
образом:
Customers mailCustomers = new Customers("Список клиентов");
Далее список необходимо заполнить данными и вывести на экран.
Использование элемента ListBox для отображения
списка элементов
Необходимо связать класс Customer с визуальным элементом, но
нельзя сделать это напрямую, потому что экземпляр класса Customer
содержит несколько значений: имя клиента, его адрес и идентификатор.
Необходимо создать шаблон данных, который определяет, как
информация о клиенте будет выглядеть на экране. Шаблон может иметь
следующий вид:
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding Address}" />
</StackPanel>
</DataTemplate>
Этот шаблон данных определяет, что информация должна выводиться в
204
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
элемент StackPanel, который содержит два элемента TextBlock с
именами Name и Address. В соответствии с этим шаблоном будут
выводиться две строки: в первой строке указывается имя клиента, во
второй — его адрес. При этом, в шаблоне не указано значение
идентификатора, поскольку нам не нужно выводить это значение на
экран.
Шаблон данных указывает Silverlight как нужно выводить на экран
свойства объекта. Его можно использовать для вывода списка клиентов
на экран. Для этого нужно поместить шаблон DataTemplate в
секции ItemTemplate элемента ListBox, который выведет на
экран информацию о клиентах:
<ListBox Name="customerList">
<ListBox. ItemTemplate >
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding Address}" />
</StackPanel>
</DataTemplate >
</ListBox. ItemTemplate >
</ListBox>
Этот код настраивает внешний вид списка данных, вывод которого на
экран осуществляет элемент customerList. Теперь нужно указать
список данных, которые должны выводиться на экран:
customers = Customers.MakeTestCustomers();
customerList.ItemsSource = customers.CustomerList;
Этот код получает тестовый список клиентов, который присваивается
свойству ItemSource элемента customerList. Элемент ListBox
выведет на экран каждый объект в наборе как элемент списка.
205
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
управление клиентами
клиенты
Rob Smith
Rob Smith's House
Jim Smith
Jim Smith’s House
Joe Smith
Joe Smith's House
Nigel smith
NigeJ Smith's House
Sally Smith
Sally Smith's House
Tim Smith
Tim Smith's House
Rob Jbnes
Roh Jones's House
Jim Jones
Jim Jones'! House
Joe Jones
Joe Jones's House
Nigel Jones
Nigel Jones's House
Sally Jones
Sally Jones's House
<r gg P
Рис. 12.1. Список клиентов с адресами
В коде программы необходимо указать свойству ItemsSource
элемента ListBox список выводимых данных, а все остальные
действия выполняются автоматически. Элемент ListBox также
20(5
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
автоматически отображает полосы прокрутки, если список не
помещается на экране целиком. Необходимо только разработать шаблон
для отображения элементов списка и задать привязку к данным.
Добавление стиля отображения
В нашем примере в выводимом списке информация выводится не очень
наглядно, так как трудно визуально отличить имя клиента от его адреса.
Для повышения удобочитаемости списка можно задать разные размеры
и стили шрифта для имён и адресов, но может быть удобнее
использовать встроенные стили, которые предоставляются в виде
ресурсов для приложений Windows Phone.
Преимущество использования встроенных стилей заключается в том,
что они используют различные цветовые схемы Windows Phone. К
элементам TextBlock в шаблоне DataTemplate можно добавить
названия используемых стилей:
<DataTemplate>
<StackPanel>
<TextBlock Text="{Binding Name}"
Style="{StaticResource PhoneTextExtraLargeStyle}" />
<TextBlock Text="{Binding Address}"
Style="{StaticResource PhoneTextSubtleStyle}" />
</StackPanel>
</DataTemplate >
В этом коде используются разные встроенные стили для имени клиента
и для адреса:
207
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 12.2. Список клиентов с адресами, использующий встроенные
стили
Дополнительные материалы
208
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Windows Phone 7.5 Training Kit -https://
rusdpe.blob.core.windows.net/downloads/RusWP7TrainingKit.zip:
Labs/WindowsPhoneNavigationAndControls/WindowsPhoneNavigationAndContro
8076-4860-ac98-81dfcf3eb9ca.html.
Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/
system.windows.controls.listbox.aspx.
Задание к работе
1. Откройте в Visual Studio созданный в предыдущих работах проект
программы для Windows Phone или создайте новый проект
приложения Silverlight.
2. Добавьте в проект код для создания списка каких-либо объектов.
3. Создайте шаблон для отображения элементов списка на экране,
используя встроенные стили.
4. Добавьте на страницу приложения элемент ListBox, и
настройте его свойства так, чтобы он выводил на экран
созданный список объектов на основе созданного шаблона.
5. Запустите программу и проверьте правильность её работы.
6. Составьте отчёт о проделанной работе. Включите в отчёт
необходимые листинги программы.
209
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Многостраничные приложения
Цель работы: изучение возможностей отображения на странице
приложения Silverlight и редактирования списков данных.
Основные теоретические сведения
Добавление новых страниц в проект
Чтобы добавить в проект новую страницу, нужно в обозревателе
решений щёлкнуть правой кнопкой мыши по названию проекта,
выбрать в контекстном меню пункт Добавить -> Создать элемент, в
открывшемся диалоговом окне выбрать Страница Windows Phone в
книжной ориентации, или другой подходящий элемент. Назовём
страницу SecondPage.xaml.
Рис. 13.1. Добавление новой страницы в приложение
210
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Чтобы лучше различать страницы, перейдем к XAML коду страницы
SecondPage и у элемента TextBlock с именем PageTitle
отредактируем свойство Text следующим образом:
<TextBlock Name="PageTitle" Text="second page" Margin="9,-7,0,0"
Style="{StaticResource PhoneTextTitle1Style}" />
Навигация между страницами приложения
Итак, у нас в проекте есть две страницы, при запуске приложения
отображается страница MainPage.xaml. Чтобы перейти со страницы
MainPage.xaml на SecondPage.xaml можно воспользоваться одним из двух
способов.
В XAML код файла MainPage.xaml после добавленного ранее кода
Button, добавим код HyperlinkButton:
<Grid xN ame="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Button Content="Нажми меня" Name="MyButton" FontSize="18" Width="1
Height="75" />
<HyperlinkButton Content="Вторая страница" Name="MyHyperlinkButton"
Width="175" Height="75" Margin="140,350,140,185" />
</Grid>
Элемент управления HyperlinkButton имеет специальное
свойство NavigateUri, которое позволяет указать URI для перехода.
Добавим это свойство со значением "/SecondPage.xaml":
<HyperlinkButton Content="Вторая страница" Name='MyHyperlinkButton" F
Width="175" Height="75" Margin="140,350,140,185" NavigateUri="/Seconc
После запуска приложения при нажатии на ссылку Вторая страница
произойдет переход на вторую, ранее созданную страницу
SecondPage.xaml. Если после этого нажать на аппаратную кнопку Назад,
то мы вернёмся на основную (предыдущую) страницу — по умолчанию
эта кнопка позволяет перейти на предыдущую активную страницу.
Теперь воспользуемся возможностью программного перехода. Сначала
211
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
добавим в секцию using ссылку на пространство имён
System.Windows.Navigation, а затем изменим код обработчика
MyButton_Click:
using System.Windows.Navigation;
private void MyButton_Click(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri("/SecondPage.xaml", UriKind.Relative)):
}
Запустите приложение и убедитесь, что кнопка работает также как и
ссылка.
Добавим на вторую страницу элементы управления и код, который бы
позволял вернуться на предыдущую страницу.
В XAML код файла SecondPage.xaml внутрь элемента Grid с именем
ContentPanel вставьте элементы управления Button и
HyperlinkButton:
<Grid xN ame="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Button Content="Обратно" Name="MyButton" FontSize="18" Width="175"
Click="MyButton_Click" />
<HyperlinkButton Content="Первая страница" Name="MyHyperlinkButton"
Width="175" Height="75" Margin="140,350,140,185" NavigateUri="/Main!
</Grid>
Для создания обработчика события Click кнопки MyButton на
странице SecondPage кликните правой кнопкой мыши по тексту
MyButton_Click в XAML редакторе и выберите Перейти к
обработчику событий.
Запустите приложение и убедитесь, что ссылка Первая страница на
второй странице возвращает приложение на главную страницу.
Теперь воспользуемся возможностью программного перехода. Сначала
добавим в секцию using ссылку на пространство имён
212
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
System.Windows.Navigation, а затем изменим код обработчика
MyButton_Click:
using System.Windows.Navigation;
private void MyButton_Click(object sender, RoutedEventArgs e)
{
N avigationS ervice. GoBack();
}
Запустите приложение и убедитесь, что кнопка Обратно на второй
странице возвращает приложение на главную страницу.
Обратите внимание, что в коде, который запускается по нажатию
кнопки, мы не использовали название страницы, на которую нам
необходимо перейти, а указали службе навигации, представленной
классом NavigationService, перейти на страницу, которая была в
стеке переходов перед текущей.
События перехода между страницами могут быть обработаны
программно, например, чтобы уточнить у пользователя, действительно
ли он хочет уйти с текущей страницы.
Добавьте следующий код в файл SecondPage.xaml.cs сразу после
обработчика MyButton_Click:
protected override void OnNavigatingFrom(NavigatingCanceIEventArgs e)
{
base.OnNavigatingFrom(e);
// Если можно отменить переход, уточним у пользователя,
// хочет ли он остаться на текущей странице
if (e.IsCancelable)
{
MessageBoxResult result = MessageBox.Show('Может быть останетеа
"Подтверждение перехода", MessageBoxButton.OKCancel);
if (result == MessageBoxResult.OK)
{
213
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
// Пользователь решил остаться
e.Cancel = true;
return;
}
}
}
Запустите приложение и обратите внимание, что уточняющий диалог
отображается вне зависимости от того, собираемся вы вернуться на
MainPage нажатием на кнопку или по ссылке.
Теперь осталось научиться передавать между страницами параметры.
Двойным щелчком по MainPage.xaml перейдём к редактированию
основной страницы. В коде MainPage.xaml добавим элемент управления
TextBox, выше элемента Button:
<Grid xN ame="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<TextBox Name="MyTextBox" Width="175" Height="75" Margin="140,185,1
<Button Content="Нажми меня" Name="MyButton" FontSize="18" Width="1
Click="MyButton_Click"/>
<HyperlinkButton Content="Вторая страница" Name="MyHyperlinkButton"
Width="175" Height="75" Margin="140,350,140,185"
N avigateUri=' '/SecondPage .xaml' />
</Grid>
Двойным щелчком по SecondPage.xaml перейдём к редактированию
основной страницы. В коде SecondPage.xaml добавим элемент
управления TextBox, выше элемента Button, так же как на странице
MainPage:
<Grid xN ame="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<TextBox Name="MyTextBox" Width="175" Height="75" Margin="140,185,1
<Button Content="Обратно" Name="MyButton" FontSize="18" Width="175"
Click="MyButton_Click" />
<HyperlinkButton Content="Первая страница" Name="MyHyperlinkButton"
Width="175" Height="75" Margin="140,350,140,185" NavigateUri="/MainI
</Grid>
Теперь, в обработчик события MyButton_Click страницы
224
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
MainPage добавим параметры в URI перехода на вторую страницу по
кнопке:
private void MyButton_Click(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri(7SecondPage.xaml?text=" +
Uri.EscapeDataString(MyTextBox.Text), UriKind.Relative));
}
И, наконец, в код страницы SecondPage.xaml.cs, сразу же после
обработчика OnNavigatedFrom, добавим обработчик прихода на
страницу OnNavigatedTo, и в нём обработаем приходящий параметр
и выведем его в MyTextBox:
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (N avigationC ontext.QueryString.C ontainsKey(' text"))
{
MyTextBox.Text = NavigationContext.QueryString["text"].ToString();
}
}
Запустите приложение и проверьте, как оно работает, например, при
переходе по ссылке со страницы MainPage на SecondPage.
Дополнительные материалы
Windows Phone 7.5 Training Kit - https://
rusdpe.blob.core.windows.net/downloads/RusWP7TrainingKit.zip:
Labs/WindowsPhoneNavigationAndControls/WindowsPhoneNavigationAndContro
8fdf-46a6-8377-6257944243f3.html.
Задание к работе
1. Откройте в Visual Studio созданный в предыдущей работе проект
программы для Windows Phone.
215
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
2. Создайте новую страницу Silverlight, в которой пользователь
сможет редактировать элементы списка.
3. Добавьте в главную страницу приложения необходимый код для
перехода на вторую страницу приложения при выборе
пользователем элемента из списка.
4. Добавьте во вторую страницу приложения необходимый код для
вывода данных из выбранного элемента списка и для применения
или отмены сделаннных пользователем изменений.
5. Запустите программу и проверьте правильность её работы.
Проверьте, что изменения, сделанные на второй странице
программы, отображаются в списке на главной странице.
6. Составьте отчёт о проделанной работе. Включите в отчёт
необходимые листинги программы.
216
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Хранение данных приложений
В любом приложении или игре требуется сохранять какие-либо данные.
Эти данные могут быть как простыми, например, пары "имя—значение", так
и довольно большие и сложные. В этой главе вы узнаете о том, как
приложения для Windows Phone могут хранить данные в памяти
устройства.
Презентацию к данной главе Вы можете скачать здесь - h ttpy/old.intuit.ru/
department/se/devmobwphn/14/05.pplx
14.1. Хранилище данных Windows Phone
Практически в любом приложении требуется хранить данные, которые
приложение использует при работе. Приложение Silverlight должно
сохранять настройки и информацию, с которой работает пользователь,
игре XNA требуется хранить информацию о достижениях игрока, список
рекордов и игровые настройки. Программы Windows Phone могут
использовать изолированное хранилище для хранения подобной
информации. Хранилище называют "изолированным", потому что
приложение не может получить доступ к данным, которые сохраняет
другое приложение, в отличие от компьютеров под управлением Windows, в
которых любая программа может получить доступ к любому файлу в
системе.
В изолированном хранилище можно сохранять большие объемы данных
вплоть до максимально доступного объема памяти для хранения данных
в телефоне. В устройствах Windows Phone имеется минимум 8 Гб
встроенного хранилища, которое совместно используется программами
для работы с мультимедиа файлами (музыка, изображения и видео)и
всеми приложениями в устройстве.
При удалении приложения из телефона все содержимое изолированного
хранилища, связанное с этим приложением, также удаляется. Когда
приложение обновляется до новой версии через Marketplace, содержимое
изолированного хранилища сохраняется, а если данные в хранилище
должны быть обновлены до новой версии, приложение их обновляет.
217
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Использование файловой системы изолированного
хранилища
Изолированное хранилище можно использовать точно так же, как и
файловую систему. Единственная разница заключается в способе
подключения приложения к хранилищу. Однако, после того как
программа подключится к файловой системе, она может создавать
потоки для передачи данных в файлы и даже использовать папки для
создания структурированного файлового хранилища. Так программа
может сохранять большие объемы данных.
В качестве примера рассмотрим создание простого приложения
Silverlight, которое может сохранять текстовые заметки. Эта версия
программы использует один файл, но ее можно легко расширить.
Внешний вид приложения представлен на рис. 14.1.
218
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 14.1. Экран приложения для хранения текстовых заметок
Пользователь может делать записи и сохранять их, нажав кнопку
сохранить. При нажатии на кнопку загрузить записи загружаются из
хранилища.
219
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
private void saveButton_Click(object sender, RoutedEventArgs e)
{
saveText("notes.txt", jotTextBox.Text);
}
Это код для кнопки сохранить. Здесь текст из текстового поля
передается методу saveText вместе с именем файла, в котором этот
текст нужно сохранить.
private void saveText(string filename, string text)
{
using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplicat
{
using (IsolatedStorageFileStream rawStream = isf.CreateFile(flename))
{
StreamWriter writer = new StreamWriter(rawStream);
writer.Write(text);
writer.Close();
}
}
}
Метод saveText создает поток, связанный с указанным файлом в
изолированном хранилище, и записывает в него текст. Потоки работают
точно так же, как и в других программах на C#. В нашем случае метод
создает объект Stre amW riter, которому передается текст.
Кнопка загрузить использует метод loadText для выполнения
обратных действий.
private void loadButton_Click(object sender, RoutedEventArgs e)
{
string text;
if (loadText("notes.txt", out text))
{
notesTextBox.Text = text;
}
else
220
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
{
notesTextBox.Text = "Напишите здесь что-нибудь....";
}
}
Метод loadText пытается открыть файл, имя которого передается в
качестве параметра, после чего пытается считать строку из того файла.
Если одно из этих действий заканчивается неудачей, метод возвращает
значение false, и в элемент notesTextBox записывается
начальное сообщение.
Если чтение содержимого файла выполнено успешно, метод loadText
возвращает значение true и записывает содержимое файла в выходной
параметр, после чего этот текст заносится в элемент notesTextBox.
private bool badText(string filename, out string result)
{
result = "";
using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplicat
{
if (isf.FileExists(flename))
{
try
{
using (IsolatedStorageFileStream rawStream =
isf.OpenFile(filename, System.IO.FileMode.Open))
{
StreamReader reader = new StreamReader(rawStream);
result = reader.ReadToEnd();
reader.Close();
}
}
catch
{
return false;
}
}
else
{
221
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
return false;
}
}
return true;
}
Метод loadText возвращает значение false, если входной файл не
найден, или при чтении файла возникает исключение. Метод
ReadToEnd позволяет делать в программе многострочные текстовые
записи.
Использование изолированного хранилища для
сохранения настроек
Часто программам нужно сохранить некоторые настройки, которые
являются простыми значениями. В этом случае использовать файлы и
потоки очень неудобно. Чтобы облегчить сохранение настроек,
программа Windows Phone может использовать хранилище для настроек.
Оно работает как словарь, который может сохранить любое количество
пар "имя—значение" в изолированной области.
Словари являются очень полезным механизмом коллекций, который
является частью структуры .NET. При создании словаря необходимо
указать тип ключа и тип хранимого значения.
Словари удобно использовать для хранения пар "имя—значение". Они
избавляют от необходимости написания кода для поиска необходимых
значений в коллекции. Также в программе можно использовать
несколько словарей.
В Windows Phone можно использовать класс
IsolatedStorageSettings, который является словарем для
хранения настроек в системе. Словарь настроек хранит коллекцию
объектов и использует строку в качестве ключа.
Сохранение текста в изолированное хранилище настроек. Можно
изменить нашу программу, добавив использование изолированного
хранилища настроек:
222
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
private void saveText(string filename, string text)
{
IsolatedStorageSettings isolatedStore =
IsolatedStorageSettings.ApplicationSettings;
isolatedStore.Remove(filename);
isolatedStore.Add(filename, text);
isolatedStore.Save();
}
Эта версия метода saveText использует имя файла в качестве ключа.
Он удаляет запись с существующим ключом, значение которого является
именем файла, и добавляет переданный текст в качестве нового
элемента. Метод Remove вызывается для удаления элемента из
словаря. Метод принимает в качестве параметра значение ключа
элемента, который нужно удалить. Если элемента с таким ключом в
словаре нет, метод Remove возвращает значение false, но в нашем
примере это не имеет значения. После выполнения изменений в
хранилище, необходимо вызвать метод Save для сохранения этих
изменений.
Загрузка текста из изолированного хранилища настроек. Метод
loadText будет считывать значения из словаря настроек:
private bool loadText(string filename, out string result)
{
IsolatedStorageSettings isolatedStore =
IsolatedStorageSettings.ApplicationSettings;
result = "";
try
{
result = (string)isolatedStore[filename];
}
catch
{
return false;
}
return true;
}
223
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Метод loadText выбирает запрошенный элемент из хранилища
настроек. Его использование осложняется тем, что в отличие от класса
Dictionary класс IsolatedStorageSettings не содержит
метод ContainsKey, который используется для определения, есть ли
в словаре данный элемент. Наш метод перехватывает исключение,
которое генерируется, если элемент не найден, и возвращает значение
false, чтобы указать, что такого элемента нет.
Таким образом, приложениям доступны два способа сохранения
данных в устройстве Windows Phone. Большие объемы данных можно
сохранять в файловом хранилище, в котором можно создать целую
файловую структуру. В качестве альтернативы можно сохранять
отдельные элементы данных по имени в словаре настроек. Механизм
изолированного хранилища можно использовать как в программах
Silverlight, так и в играх XNA.
Программа Isolated Storage Explorer
Пакет инструментов для разработки приложений Windows Phone
включает программу Isolated Storage Explorer, которая позволяет
просматривать файлы в изолированном хранилище. Эта программа
имеет интерфейс командной строки и по умолчанию устанавливается в
папку C:\Program Files\Microsoft SDKs\Windows
Phone\v7.1\Tools\IsolatedStorageExplorerTool.
Программе Isolated Storage Explorer необходимо указать GUID
приложения, который определяет необходимую область изолированного
хранилища. Значение GUID можно найти в файле приложения
WMAppManifestxml;
<App xmlns="" ProductID="{3363ac33-4f45-4b21-b932-fa2084b6deb0}" Ttl
RuntimeType="Silverlight" Version="1.0.0.0" Genre="apps.normal"
Author="JotPad author" Description="Sample description" Publisher="JotPad'
Для считывания содержимого изолированного хранилища используется
команда ISETool с соответствующими параметрами:
ISETool ts xd 3363ac33-4f45-4b21-b932-fa2084b6deb0 c:\isoStore
224
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Эта команда делает снимок изолированного хранилища эмулятора для
приложения со значением GUID равным {3363ac33-4f45-4b21-b932-
fa2084b6deb0} и помещает его в папку c:\isoStore на компьютере.
Описание всех параметров программы Isolated Storage Explorer можно
получить, набрав в командной строке команду ISETool без параметров.
14.2. Базы данных в Windows Phone
База данных — это набор данных, которые организованы и
управляются компьютерной программой, которая называется система
управления базами данных.
Программа может отправлять запросы к базе данных, в ответ на
которые база данных возвращает результаты. При этом, сама база
данных является частью решения, которое является хранилищем
данных.
Рассмотрим пример создания базы данных для Интернет-магазина. В
базе данных будет храниться информация о клиентах, которые
размещают заказы товаров. Для хранения этой информации необходимо
три таблицы.
Таблица Customer (таблица 5.1) содержит информацию о клиентах и
включает четыре столбца для хранения, соответственно,
идентификатора, имени, адреса и названия банка клиента. Каждая
строка таблицы называется записью и хранит информацию об одном
клиенте.
Таблица 14.1. Таблица Customer
CustomerlD
Name
Address
BankDetails
123456
Rob
18 Pussycat Mews
Nut East Bank
654322
Jim
10 Motor Drive
Big Fall Bank
111111
Ethel
4 Funny Address
Strange Bank
Таблица Product (таблица 5.2) содержит столбцы для хранения
информации товарах: идентификатор товара, наименование, поставщик
и цена.
225
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Таблица 14.2. Таблица Product
ProductID
ProductName
Supplier
Price
1001
Windows Phone 7
Microsoft
200
1002
Cheese grater
Cheese Industries
2
1003
Boat hook
John's Dockyard
20
Таблица Order (таблица 5.3) содержит информацию о заказах товаров и
ссылается на записи двух других таблиц. Столбцы таблицы содержат
идентификатор заказа, идентификаторы клиента и купленного товара,
количество товара, дату заказа и его статус.
Таблица 14.3. Таблица Order
OrderlD
CustomerlD
ProductID
Quantity
OrderDate
Status
1
123456
1001
1
21/10/2010
Shipped
2
111111
1002
5
10/10/2010
Shipped
3
654322
1003
4
1/09/2010
On order
Идентификаторы товара и клиента позволяют избежать дублирования
одних и тех же данных: по значению идентификатора можно получить
информацию из соответствующей таблицы базы данных вместо того,
чтобы хранить всю информацию о клиентах и заказанных товарах в
самой таблице заказов.
Обратите внимание, что имена столбцов указаны без пробелов — это
позволит избежать некоторых сложностей при создании запросов к базе
данных.
Работа с базой данных заключается, в основном, в создании и отправке
запросов к базе данных и получении и обработке результатов. Запросы к
базам данных обычно составляются на языке SQL (Structured Query
Language) — структурированном языке запросов. Язык SQL является
мощным инструментом для работы с информацией в базе данных. С
помощью SQL-запросов можно получать из базы данных необходимую
информацию в удобном виде.
Объектно-ориентированные программы не работают напрямую с
таблицами, записями и запросами. Программы используют объекты,
226
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
которые содержат свойства и методы. Для работы с базами данных в
программе необходим способ преобразования информации из
табличной формы в объектную.
Использование LINQ для связи базы данных с
объектами
Для работы с информацией в базе данных чаще всего используется язык
SQL. Чтобы использовать базы данных в объектно-ориентированных
программах, обычно необходимо писать много кода, который передает
данные из таблиц в объекты, и обратно при сохранении данных. Это
довольно большая работа, особенно для больших программ,
использующих базы данных с большим количеством таблиц и классов,
представляющих информацию из таблиц.
Существенно упростить эту задачу позволяет интегрированный язык
запросов LINQ. Язык LINQ фактически встроен в язык C# и добавляет
особые синтаксические конструкции для составления запросов, которые
используют программные объекты. Windows Phone позволяет
использовать в программах базы данных, взаимодействие с которыми
выполняется с помощью LINQ.
Чтобы использовать в программе код LINQ, нужно добавить в проект
ссылку на библиотеки System.Data.Linq. Поскольку не во всех
программах необходимо использовать базы данных, эта ссылка обычно
не добавляется при создании проекта. После этого для облегчения
работы с классами LINQ рекомендуется добавить директивы using:
using System.Linq;
using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.ComponentModel;
using System.Collections.ObjectModel;
Теперь необходимо создать табличную структуру данных, которыми
приложение будет управлять. В нашей базе данных будет три таблицы:
• Customer — для хранения информации о клиентах;
227
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
• Order — для хранения информации о заказах;
• Product — для хранения информации о товарах.
Создание класса для хранения информации из таблицы. Начнем с
таблицы Customer. Необходимо создать класс, описывающий данные,
которые должны храниться в таблице Customer. Этот класс можно
использовать для создания в базе данных таблицы, содержащей
информацию обо всех клиентах. Класс может быть описан так:
public class Customer
{
public int CustomerID { get; set; }
public string Name { get; set; }
public string Address { get; set; }
public string BankDetails { get; set; }
}
Класс Customer содержит три строковых свойства и одно
целочисленное. Все свойства доступны для чтения и записи. Версия
класса Customer класса для LINQ выглядит похоже:
[Table]
public class Customer : INotifyPropertyChanged, INotifyPropertyChanging
{
// здесь описывается структура класса
}
Строка [Table] является атрибутом. Атрибуты используются для
добавления к классам специальной информации, которую могут
использовать программы, считывающие метаданные в
скомпилированном коде. Слово "метаданные" означает "данные о
данных". В нашем случае добавляемые данные являются атрибутом,
который LINQ интерпретирует как: "Этот класс может использоваться в
качестве основы для таблицы данных". Сам атрибут является обычным
тегом, и никак не влияет на поведение самого класса.
Также для работы с LINQ класс должен реализовать интерфейсы
INotifyPropertyChanged и INotifyPropertyChanging,
т.е. должен содержать все методы, которые определены в интерфейсе.
228
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Эти интерфейсы содержат методы, которые будут использоваться, чтобы
сообщить LINQ, когда данные в классе будут изменены. Этот механизм
похож на привязку данных к визуальным элементам, только теперь
изменение данных будет вызывать изменения в базе данных.
Каждый из этих интерфейсов содержит по одному делегату событий:
public event PropertyChangedEventHandler PropertyChanged;
public event PropertyChangingEventHandler PropertyChanging;
Инфраструктура LINQ связана с событием PropertyChanged,
которое происходит после изменения значения свойства, а также с
событием PropertyChanging, происходящим перед изменением
значения.
Необходимо сделать так, чтобы класс Customer генерировал эти
события при изменении значений свойств. Свойство Name может
содержать следующий код:
private string nameValue;
public string Name
{
get
{
return nameValue;
}
set
{
if (PropertyChanging != null)
{
PropertyChanging(this, new PropertyChangingEventArgs("Name"));
}
nameValue = value;
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("Name"));
229
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
}
}
}
В этом коде секция get свойства просто возвращает значение свойства,
которое содержит имя. Секция set проверяет, назначены ли событиям
обработчики, и вызывает один из них перед изменением значения
свойства, а другой — после. Делегаты принимают два параметра.
Первый параметр является ссылкой на текущего клиента (имя которого
изменяется). Второй параметр содержит название свойства, которое
изменяется. LINQ использует эти параметры, чтобы выяснить, какие
значения изменились, и выполняет соответствующие изменения в базе
данных.
События происходят до и после изменения, чтобы LINQ мог более
эффективно управлять изменениями данных. При обновлении значений
свойств в объектах все изменения автоматически синхронизируются с
базой данных.
Если объекты содержат много свойств, имеет смысл упростить
управление событиями с помощью добавления методов, которые будут
осуществлять управление:
private void NotfPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
private void NotifyPropertyChanging(string propertyName)
{
if (PropertyChanging != null)
{
PropertyChanging(this, new PropertyChangingEventArgs(propertyName));
}
}
230
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Тогда код свойств существенно упростится:
private string nameValue;
public string Name
{
get
{
return nameValue;
}
set
{
N otifyPropertyChanging('Name");
nameValue = value;
NotifyPropertyChanged("Name");
}
}
Чтобы LINQ мог использовать это свойство, к нему необходимо
добавить атрибут [Column] :
[Column]
public string Name
{
// здесь описывается поведение свойства Name
}
Аналогичным образом создается код свойств Address и
BankDetails для хранения информации об адресе и банке клиента.
Эти свойства будут отображаться на соответствующие столбцы таблицы
в базе данных.
Создание первичного ключа. Поле CustomerlD немного отличается
от остальных. В нашем примере это целочисленное значение, которое
уникально для каждого клиента. Если клиент сменит имя, информацию
о нем по-прежнему можно будет найти по значению идентификатора. В
описанной выше таблицы базы данных поле CustomerlD будет
являться первичным ключом таблицы Customer. Первичный ключ
позволяет уникально идентифицировать каждого клиента в этой
231
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
таблице. Даже если среди клиентов у двоих совпадает имя, у них будут
разные значения идентификатора, по которым можно отличить одного
клиента от другого.
При создании столбца идентификатора необходимо сообщить LINQ, что
этот столбец должен быть первичным ключом для таблицы. Также
можно указать LINQ, что значения этого столбца уникальны для всех
записей, и их нужно генерировать автоматически. Для этого к атрибуту
Column для свойства CustomerlD дополнительную информацию:
[Column(IsPrimaryKey = true, IsDbGenerated = true)]
public int CustomerID { get; set; }
Теперь при добавлении в базу данных записи о новом клиенте значение
его идентификатора будет генерироваться автоматически. При этом, мы
не сможем изменить значение идентификатора клиента, поскольку оно
является уникальным ключом, который будет автоматически создаваться
базой данных для каждого клиента. Соответствующее поле в таблице в
базе данных является первичным ключом для таблицы Customer,
который будет использоваться в базе данных для связи таблицы
Customer с таблицей Order. Каждая строка таблицы Order будет
содержать значение идентификатора клиента, однозначино
идентифицирующее клиента, который создал этот заказ.
Когда LINQ считает метаданные для этого свойства, он будет
использовать эти настройки чтобы решить, какого типа столбец
таблицы в базе данных нужно создать.
Создание контекста данных LINQ. Теперь можно создать таблицу в базе
данных. Для этого необходимо создать класс, наследуемый от класса
DataContext, который будет управлять подключением к базе данных.
Он будет содержать все таблицы для приложения.
public class SalesDB : DataContext
{
public Table<Customer> Customers;
public SalesDB(string connection)
: base(connection)
{
232
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
}
}
Класс DataContext в LINQ является базовым классом для
проектирования баз данных. В его состав входят методы, которые
можно использовать для управления содержимым базы данных.
Конструктор наследуемого класса SalesDB просто вызывает
конструктор родительского класса. Строка подключения определяет
параметры для подключения к базе данных, которую нужно
использовать. База данных может располагаться как на рабочем
устройстве, так и на удаленном сервере в сети. В нашем случае база
данных находится в файле, который хранится в изолированном
хранилище в телефоне, и строка подключения должна содержать путь к
этому файлу.
Создание тестовых данных. Для создания тестовых данных используем
тот же подход, который мы использовали для создания тестового
списка, только теперь будет создаваться база данных и таблицы:
public static void MakeTesffiB(string connection)
{
string[] firstNames = new string[] { "Rob", "Jim", "Joe", "Nigel", "Sally",
'Tmi" };
string[] lastsNames = new string[] { "Smith", "Jones", "Bloggs", "Miles",
"Wilkinson", "Brown" };
SalesDB newDB = new SalesDB(connection);
if (newDB.DatabaseExists())
{
newDB.DeleteDatabase();
}
newDB.CreateDatabase();
foreach (string lastName in lastsNames)
{
foreach (string firstname in firstNames)
{
233
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
string name = firstname + ” ” + lastName;
string address = name + '"s address";
string bank = name + "'s bank";
Customer newCustomer = new Customer();
newCustomer.Name = name;
newCustomer.Address = address;
newCustomer.BankDetails = bank;
newDB. C ustomerTable.InsertO nS ubmit(ne wC ustomer);
}
}
newDB.SubmitChangesO;
}
Сначала этот метод пытается подключиться к базе данных. Переменная
newDB представляет подключение к базе данных в соответствии с
заданной строкой подключения. Метод может использовать это
подключение, чтобы отправлять запросы для управления базой данных.
Если указанная база данных существует, она удаляется.
После вызова метода CreateDatabase создается новая база данных,
которая содержит набор пустых таблиц. После этого создается набор
тестовых значений с информацией о клиентах, которые заносятся в
таблицу базы данных.
Метод InsertOnSubmit добавляет новую запись в таблицу базы
данных. Этот метод является безопасным с точки зрения типов
передаваемых параметров, т.е. если бы мы попытались добавить в
таблицу CustomerTable данные другого типа, компилятор выдал бы
сообщение об ошибке.
Завершается метод вызовом метода SubmitChanges, который,
собственно, и записывает все сделанные изменения в файл базу
данных. До этих пор все изменения хранятся в памяти программы.
Такой подход позволяет ускорить выполнение операций с базой данных,
особенно если выполняется много операций модификации данных.
Если не будет вызван метод SubmitChanges, изменения в базе
данных не сохранятся.
234
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Теперь созданную базу данных можно использовать в приложении.
Контекст базы данных нужно разместить в файле программы
App.xaml.cs. Там же размещается ссылка на информацию об активном
клиенте:
public SalesDB ActiveDB;
public Customer ActiveCustomer;
При запуске программы в переменной ActiveDB нужно создать
ссылку на используемую базу данных.
ActiveDB = new SalesDB('Data Source=isostore:/Sample.sdf');
Путь к файлу имеет особый формат и идентифицирует файл в
изолированном хранилище. Можно использовать в программе
несколько баз данных, каждая из которых будет находиться в разных
файлах. Формат файла базы данных такой же, как и формат файла
стандартной базы данных SQL. Программа для работы с базой данных
для компьютера может считывать таблицы из файла, и этим файлом
может управлять редактор базы данных SQL. Приложение для Windows
Phone также может использовать базу данных, подготовленную на
другом компьютере.
Привязка элемента ListBox к результату запроса LINQ. Теперь можно
использовать эту базу данных в нашем приложении. Нужно получить
данные из базы данных и вывести их на экран.
Информацию из базы данных можно получить с помощью запросов
LINQ. Запрос для получения информации о клиентах может выглядеть
так:
var customers = from Customer customer
in thisApp.ActiveDB.CustomerTable
select customer;
Эта команда C# создает переменную customers, которая имеет тип var.
Этот тип означает, что тип переменной определяется на основе
значения, которое присваивается этой переменной. При этом
сохраняется строгая типизация C#, и если попытаться использовать
переменную customers недопустимым способом, программа не
235
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
скомпилируете^.
Остальная часть команды сообщает LINQ, что нужно получить все
элементы customer из свойства CustomerTable контекста базы
данных ActiveDB. Эти данные возвращаются в виде списка клиентов,
который может быть наблюдаемой коллекцией. Чтобы вывести на экран
полученный список клиентов, можно задать этот список в качестве
источника данных элементу ListBo x:
customerListItemsSource = customers;
Теперь у нас есть полностью рабочая база данных клиентов. Остается
только добавить в программу код для применения изменений в базе
данных при выходе из программы. Лучший способ это сделать —
добавить необходимый код в метод OnNavigatedFrom в файле
MainPage.xaml.cs:
protected override void OnNavigatedFrom(
System.Windows.Navigation.NavigationEventArgs e)
{
App thisApp = Application.Current as App;
thisApp.ActiveDB.SubmitChangesO;
}
Когда пользователь перейдет на другую страницу, метод найдет
активную базу данных и применит все сделанные изменения.
Добавление фильтров. Если немного изменить запрос LINQ, можно
выбрать записи, которые соответствуют определенным критериям:
var customers = from Customer customer
in thisApp.ActiveDB.CustomerTable
where customer.Name.StartsWith("S")
select customer;
Этот запрос выбирает только тех клиентов, имя которых начинается с
буквы "S". Таким образом, можно выбрать из базы данных нужные
элементы. Так, в приложение можно добавить поле для поиска, если
нужно найти клиентов с определенным именем.
23(5
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
14.3. Создание связей данных в LINQ
Чтобы добавить в программу возможность управления заказами
товаров, нужно создать другие таблицы и связать их по ключевым
полям. Класс для таблицы Products создается аналогично классу для
таблицы Customers.
Класс для таблицы Orders будет иметь более сложную структуру,
поскольку эта таблица содержит ссылки на записи двух других классов.
В C# можно создать такое описание класса:
public class Order
{
public DateTime OrderDate;
public int Quantity;
public Customer OrderCustomer;
public Product OrderProduct;
}
Свойства OrderCustomer и OrderProduct связывают заказ с
клиентом и заказанным им товаром. Соответствующие им поля
таблицы базы данных являются внешними ключами.
Однако, в нашей базе данных отсутствуют ссылки как таковые. Вместо
явных ссылок каждая запись таблицы Orders содержит значения
идентификаторов клиента и товара, по которым можно установить
соответствие заказа с клиентом и товаром. При этом, для таблиц базы
данных можно задать отношения, которые связывают соответствующие
записи двух таблиц, и в программе нужна возможность использовать
эти отношения.
Ассоциации LINQ
В LINQ отношения между двумя таблицами называют ассоциацией.
Она задается в классах базы данных с помощью класса EntityRef.
Связывание заказа с клиентом. В нашей программе в классе Order
должна быть ссылка на класс Customer. Она создается в виде
237
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
отношения между двумя таблицами. EntityRef — это специальный
класс LINQ, который можно использовать для связи двух таблиц.
[Table]
public class Order : INotifyPropertyChanged, INotifyPropertyChanging
{
private EntityRef<Customer> orderCustomer;
[Association(IsForeignKey = true, Storage = "orderCustomer')]
public Customer OrderCustomer
{
get
{
return orderCustomer.Entity;
}
set
{
NotifyPropertyChanging("OrderCustomer");
orderCustomer.Entity = value;
NotifyPropertyChanged("OrderCustomer');
}
}
}
Класс EntityRef является своего рода ссылкой на таблицу. Теперь
можно написать такой код:
Customer newCustomer = new Customer();
Order newOrder = new Order();
newOrder.OrderCustomer = newCustomer;
Этот код осуществляет связь заказа с клиентом, и запись в базе данных
для этого заказа будет содержать идентификатор указанного клиента.
Эту технику можно использовать каждый раз, когда необходимо создать
отношение между записью одной таблицы и записью другой.
238
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
В атрибуте [Association] указывается, что ассоциация будет
являться внешним ключом. Параметр Storage сообщает LINQ, какое
закрытое свойство базы данных будет хранить информацию о свойстве.
Связывание клиента со всеми его заказами. Теперь программа может
для заданного заказа получить информацию о клиенте, который создал
этот заказ, поскольку запись в таблице Order содержит поле
CustomerlD, которое является идентификатором клиента. Однако,
была бы очень полезна возможность найти для заданного клиента все
его заказы.
В базе данных таблицы Customer и Order находятся в отношении
"один ко многим". В классе C# Customer для хранения заказов клиента
можно использовать одну из коллекций, например, массив или список.
Однако, в LINQ для представления таких отношений нужно
использовать класс EntitySet. Этот класс похож на EntityRef, но
он позволяет управлять целым набором элементов. Можно связать
клиента с его заказами, добавив в класс Customer свойство типа
EntitySet:
[Table]
public class Customer : INotifyPropertyChanged, INotifyPropertyChanging
{
[Column(IsPrimaryKey = true, IsDbGenerated = true, AutoSync = AutoSync.
public int CustomerID { get; set; }
private EntitySet<Order> orders = new EntitySet<Order>();
[Association(Storage = "orders", ThisKey = "CustomerID",
OtherKey = "OrderCustomerlD")]
public EntitySet<Order> Orders
{
get
{
return orders;
}
set
{
239
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
orders = value;
}
}
}
Это свойство похоже на описанное ранее свойство класса EntityRef,
за исключением того, что в его атрибуте Association указана
дополнительная информация для описания отношения.
Параметр ThisKey задает имя свойства, которое будет использовать
класс Order для поиска клиента, с которым связана ассоциация.
Можно использовать свойство CustomerlD, которое является
первичным ключом для класса Customer.
Параметр OtherKey задает имя свойства класса Order, которое
связано ассоциацией с другой стороны, то есть для заказа можно будет
найти клиента, с которым связан этот заказ.
При изменении заказа не требуется генерировать события
NotifyPropertyChanged, поскольку тип EntitySet является
контейнером для заказов, а не непосредственно заказом. При
добавлении заказов происходит добавление элементов в EntitySet, а
не замена контейнера.
Чтобы ассоциацию работала должным образом, необходимо сделать
некоторые изменения в ссылке в классе Order:
[Table]
public class Order : INotifyPropertyChanged, INotifyPropertyChanging
{
[Column]
public int OrderCustomerID;
private EntityRef<Customer> orderCustomer = new EntityRef<Customer>();
[Association(IsForeignKey = true, Storage = "orderCustomer",
24-0
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
ThisKey = "OrderCustomerID")]
public Customer OrderCustomer
{
get
{
return orderCustomer.Entity;
}
set
{
NotifyPropertyChanging("OrderCustomer");
orderCustomer.Entity = value;
NotifyPropertyChanged("OrderCustomer");
if (value != null)
OrderCustomerID = value.CustomerID;
}
}
}
Ассоциация использует внешний ключ (первичный ключ базы данных
клиентов) и значение OrderCustomerID для хранения его значения.
В этой версии кода значение CustomerlD копируется в столбец
OrderCustomerID таблицы, когда клиенту назначается заказ. Теперь
можно написать такой код:
Customer c = new Customer();
Order o = new Order();
o.OrderCustomer = c;
Код секции set свойства OrderCustomer копирует значение
CustomerlD в свойство OrderCustomerID для записи клиента
текущего заказа.
Таким образом, можно легко добавить заказы клиента:
Customer c = new Customer();
Order o = new Order();
o.OrderCustomer = c;
c.Orders.Add(o);
241
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Класс EntitySet содержит метод Add, который позволяет добавлять
заказы в базу данных. Для работы с содержимым набора объектов
можно использовать одну из конструкций C# для перебора элементов
коллекции.
Проектирование структуры баз данных для возможности заказа
нескольких товаров. Теперь в структуре базы данных есть связь между
клиентами и заказами. У клиента может быть несколько заказов, и
каждый заказ связан с одним клиентом, который его создал.
Теперь необходимо связать с заказом товары, которые нужны клиенту
Однако, в нашей структуре базы данных каждый заказ может содержать
только один тип товара, что является весьма существенным
ограничением и недостатком.
Чтобы решить проблему, необходимо добавить новую таблицу OrderItem,
в которой будет храниться информация обо всех товарах каждого заказа.
Каждый элемент OrderItem будет связан с определенным заказом.
Соответственно, каждый заказ будет содержать набор этих элементов.
Таблица будет иметь структуру; представленную в таблице 5.4.
Таблица 14.4. Таблица OrderItem
OrderltemID
OrderlD
ProductID
Quantity
1
56
1001
1
2
56
1002
5
3
12343
1003
4
Соответственно, обновленную структуру базы данных можно
представить в виде диаграммы классов, представленной на рис. 14.2.
Каждый класс отображается на соответствующую таблицу в базе
данных.
242
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 14.2. Диаграмма классов, соответствующих таблицам базы данных
приложения
Таблицы связаны отношениями "один ко многим" и используют
первичные ключи. В классах программы это отношения реализуются в
виде ассоциаций по аналогии с рассмотренным в текущем разделе
примером.
Выполнение запросов LINQ
Для получения необходимой информации из базы данных можно
использовать мощные механизмы запросов LINQ. Например, можно
найти все заказы, которые размещенные в указанную дату:
DateTime searchDate = new DateTime(2011, 8, 19);
var orders = from Order order in activeDB.OrderTable
where order.OrderDate == searchDate
select order;
Этот запрос возвращает из таблицы заказов активной базы данных все
заказы, созданные 19 августа 2011 г., и заносит их в переменную orders,
тип которой трактуется как "запрос LINQ". При этом, эта строка
2-23!
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
программы только создает запрос, но еще не выполняет никаких
операций для получения данных. Информация будет считана из базы
данных при попытке обращения к результатам этого запроса:
int totalSales = 0;
foreach (Order order in orders)
{
foreach (OrderItem item in order.OrderItems)
{
totalSales += item.OrderItemProductPriee * item.Quantity;
}
}
Этот код получает информацию о заказах, которые будут получены
запросом orders, и вычисляет полную стоимость всех заказанных
товаров. Первый цикл foreach перебирает по одному заказу за
каждый проход цикла, и в этот момент LINQ начинает получать
информацию из базы данных.
Если выполнить в программе весь этот код еще раз, то LINQ снова
начнет считывать информацию из базы данных, что может замедлить
работу программы. Если необходимо обработать одни и те же данные
несколько раз, лучше сохранить результат запроса в списке:
List<Order> DateOrders = orders.ToList<Order>();
Этот код создает в переменной DateOrders список, который
содержит результат запроса. Этот список можно использовать в
программе без повторного считывания одних и тех же записей из базы
данных. При вызове метода ToList выполняется запрос LINQ и
возвращается список результатов.
Получение данных из нескольких таблиц в одном
запросе LINQ
LINQ позволяет создавать запросы для получения данных из нескольких
таблиц с использованием операции соединения таблиц. Например,
24-4
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
можно создать полный список всех заказов, сделанных всеми
клиентами. Для этого нужно сопоставить записи о заказах с
соответствующими записями о клиентах и сформировать список.
Используя ключевое слово join, это можно сделать в одном запросе:
var allOrders = from Customer c in newDB.CustomerTable
join Order o in newDB.OrderTable
on c.CustomerID equals o.OrderCustomerID
select new { c.Name, o.OrderDescription };
Этот запрос LINQ содержит ключевые слова from, join и select,
которые встроены в язык C#. Первая часть запроса находит всех
клиентов в таблице Customer. Затем к результату запроса
присоединяются заказы из таблицы Order в соответствии с условием
равенства значений идентификаторов клиента в этих таблицах. После
этого создается новый тип данных, который содержит результаты,
указанные в секции select. В нашем случае будет создан список
объектов, содержащих информацию об имени клиента и описании
заказа.
На основе результатов этого запроса можно сформировать список
заказов клиентов:
List<String> OrderDescriptions = new List<String>();
foreach (var orderDesc in allOrders)
{
OrderDescriptions.Add(orderDesc.Name + ” заказал: ” + orderDesc.OrderD
}
Как и в предыдущем примере, результаты считываются из базы данных
непосредственно перед их использованием в цикле. Ключевое слово
var указывает на то, что тип переменной orderDesc будет определен
при присвоении ей значения. Для этой переменной нельзя указать
конкретный тип, поскольку он создается LINQ при выполнении запроса
и будет известен только во время выполнения этого запроса.
Удаление элементов из базы данных
245
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
При необходимости можно удалить ненужные объекты из базы данных.
Например, можно удалить ненужный заказ, используя метод
DeleteOnSubmit:
ActiveDB.O rderItemTable.DeleteOnSubmit(item);
Также есть метод DeleteAllOnSubmit, который может удалить
заданную коллекцию объектов.
Следует обратить внимание на удаление объектов, которые связаны
отношениями с другими объектами. Если попытаться удалить объект,
который содержит другие объекты, то база данных сгенерирует
исключение. Сначала нужно удалить все дочерние объекты, и только
после этого можно удалить родительский.
Краткие итоги
1. Windows Phone предоставляет систему изолированного
хранилища, в котором каждое приложение в телефоне может
хранить свои данные.
2. Программы могут создавать папки и файлы в своей
изолированной области хранилища и использовать для
взаимодействия с ними стандартные конструкции ввода/вывода,
основанные на потоках.
3. Альтернативным метод хранения данных является использование
специализированного словаря для хранения в изолированном
хранилище пар "имя—значение".
4. Инструмент Isolated Storage Explorer позволяет
программистам просматривать содержимое изолированного
хранилища разрабатываемого приложения.
5. Приложения Windows Phone могут использовать интегрированный
язык запросов (LINQ) для взаимодействия с базами данных,
которые могут храниться в изолированном хранилище в виде
файлов. Этими базами данных управляет сервер баз данных SQL,
но нельзя использовать SQL-запросы для взаимодействия с базой
данных — для этого используется LINQ.
6. База данных обычно состоит из нескольких таблиц. Таблицы
состоят из столбцов (различные элементы данных, такие как имя,
адрес, банковские реквизиты) и строк (вся информация об одном
246
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
объекте — имя, адрес, банковские реквизиты одного клиента).
7. Один из столбцов таблицы должен быть первичным ключом,
значения которого уникальны для каждой строки таблицы.
Каждое из этих значения однозначно идентифицирует запись
таблицы. Можно указать базе данных, что нужно автоматически
создавать первичный ключ для таблицы.
8. В приложениях Windows Phone можно создавать классы, которые
использует LINQ для взаимодействия с таблицами базы данных.
Для этого к описанию класса добавляются атрибуты [Table] и
[Column]. Также могут использоваться дополнительные
параметры для определения первичных ключей.
9. Свойства классов, которыми управляет LINQ, могут содержать код
для создания уведомлений, чтобы LINQ автоматически обновлял
записи базы данных при изменении значений этих свойств.
10. База данных может содержать отношения, в которых столбец в
одной таблице содержит значения первичного ключа другой
таблицы. Такие отношения являются внешними ключами.
11. В LINQ отношения реализуются с помощью класса EntityRef,
который содержит ссылку на внешний ключ в другой базе данных.
Класс EntitySet используется для того чтобы свойство одного
объекта, связанного с таблицей базы данных, могло ссылаться на
несколько записей другой таблицы. К этим элементам добавляется
атрибут [Association], который описывает отношения между
таблицами.
12. Запрос LINQ можно использовать для получения
структурированных данных из базы данных. Запрос считывает
записи из базы данных непосредственно перед их
использованием в программе. Запросы LINQ могут
комбинировать результаты нескольких запросов.
13. При удалении объектов из базы данных все дочерние объекты
должны быть удалены перед удалением родительского объекта —
иначе в таблицах базе данных могли бы существовать записи,
содержащей значения первичного ключа для несуществующих
записей из другой таблицы.
Вопросы
1. Где приложение может сохранять данные?
247
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
2. Каким образом программа может сохранять файлы?
3. Как программа может сохранить настройки, которые можно
представить в виде пар "имя—значение"?
4. Для чего предназначена программа Isolated Storage Explorer?
5. Как можно создать базу данных в приложении для Windows
Phone?
6. Как связать результаты запроса LINQ с визуальными элементами
Silverlight?
7. Как с помощью LINQ задать связи между таблицами?
8. Как выполняются запросы LINQ?
9. Как выполняется добавление и удаление записей таблиц в LINQ?
Упражнения
Упражнение 1. Использование изолированного хранилища
В предыдущем упражнении мы создавали простое приложение
TimeTracker, которое сохраняло информацию о времени встреч с
клиентами. Предыдущая версия программы при запуске генерировала
набор тестовых данных. Необходимо использовать хранилище файлов,
чтобы приложение сохраняло информацию о встречах.
Загрузка сохраненных данных
Программист внес в программу изменения, однако, тестировщик
обнаружил, что программа не сохраняет изменения данных. Необходимо
выявить причину этой проблемы.
1. Откройте в Visual Studio проект CustomerManager в папке Lab5
Customer Time Logger Storage. Этот проект содержит версию
программы, в которой обнаружена ошибка.
2. Убедитесь в том, что эмулятор Windows Phone не запущен. Укажите
эмулятор Windows Phone в качестве целевой платформы.
3. Запустите программу. При первом запуске программа создаст
новый набор тестовых данных.
4. Выберите клиента и измените информацию о нем.
5. Нажмите кнопку сохранить. Обратите внимание на то, что
содержимое экрана изменилось, поскольку в программе
используется привязка данных для отображения обновленных
248
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
значений.
6. Остановите программу, нажав в эмуляторе Windows Phone кнопку
Назад. Не останавливайте выполнение программы в Visual Studio.
7. Запустите программу еще раз. При повторном запуске программа
должна загрузить список клиентов из изолированного хранилища.
8. Найдите клиента, информацию о котором вы изменили. Обратите
внимание, что сделанные изменения не сохранились.
9. Список клиентов загружается в файле App.xaml.cs. Откройте этот
файл в обозревателе решений Visual Studio и найдите конструктор
App. В конце этого метода находится код, который должен
загружать данные из изолированного хранилища. Попробуйте
определить причину возникающей проблемы.
10. Конструктор содержит только код, который создает тестовый
список при каждом запуске программы:
ActiveCustomerList = Customers.MakeTestCustomers();
11. Необходимо изменить этот код, чтобы информация о клиентах
загружалась из файла. Откройте в файле App.xaml.cs область
Customer Manager Values и найдите методы
LoadCustomers и SaveCustomers.
12. Метод LoadCustomers возвращает список клиентов или
значение null, если список не может быть считан. Если метод
возвращает null , программа должна создать набор тестовых
данных. Замените указанный в шаге 10 код на следующий:
// загрузить список клиентов из файла
ActiveCustomerList = LoadCustomers(ListFilename);
// если загрузить список не удалось, создать тестовые данные
if (ActiveCustomerList == null)
ActiveCustomerList = Customers.MakeTestCustomers();
13. Запустите программу. Измените информацию о любом клиенте.
14. Остановите программу, нажав в эмуляторе Windows Phone кнопку
Назад. Не останавливайте выполнение программы в Visual Studio.
15. Запустите программу еще раз. Убедитесь в том, что теперь
сделанные изменения были сохранены.
249
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Пропадание информации о встрече
Тестировщик нашел в программе еще одну проблему: программа
некорректно сохраняет информацию о встрече. Необходимо исследовать
эту проблему.
Программа создает объекты для работы с потоками StreamReader и
StreamWriter для загрузки и сохранения элементов в
изолированном хранилище. Каждый объект может сохранить свое
состояние в поток и загрузить информацию из потока. Ниже приведен
код методов для сохранения информации в поток и для загрузки
информации из потока:
public void SaveToStream(StreamWriter output)
{
output.WriteLine(C ustomerList. C ount);
foreach (Customer c in CustomerList)
{
c.S aveToStream(output);
}
}
public Customers(StreamReader input)
{
CustomerList = new List<Customer>();
int noOfCustomers = int.Parse(input.ReadLineQ);
for (int i = 0; i < noOfCustomers; i++)
{
CustomerList.Add(new Customer(input));
}
}
Этот код выглядит правильно. Необходимо проверить класс Customer,
правильно ли он использует эти методы.
1. Вернитесь в программу и откройте файл Customers.cs.
250
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
2. Найдите класс Customers и просмотрите метод
SaveToStream:
public void SaveToStream(StreamWriter output)
{
output.WriteLine(N ame);
output.WriteLine(Address);
output.WriteLine(ID);
}
3. Этот метод не содержит код для сохранения информации о
встрече. Аналогичная проблема возникает и в методе Customer:
public Customer(StreamReader input)
{
Name = input.ReadLine();
Address = input.ReadLineO;
ID = int.Parse(input.ReadLineQ);
int noOfSessions = int.Parse(input.ReadLine());
}
4. Необходимо использовать тот же шаблон для загрузки и
сохранения списка встреч, который использует объект
CustomerList для хранения информации о клиентах.
Измените методы для сохранения и загрузки, чтобы можно было
сохранять информацию о нескольких встречах:
public void SaveToStream(StreamWriter output)
{
output.WriteLine(N ame);
output.WriteLine(Address);
output.WriteLine(ID);
output.WriteLine(Sessions. C ount);
foreach (Session session in Sessions)
{
session.SaveToStream(output);
}
}
251
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
public Customer(StreamReader input)
{
Name = input.ReadLine();
Address = input.ReadLineO;
ID = int.Parse(input.ReadLineQ);
int noOfSessions = int.Parse(input.ReadLineO);
for (int i = 0; i < noOfSessions; i++)
{
Sessions.Add(new Session(input));
}
}
5. Остановите эмулятор Windows Phone, чтобы при следующем
запуске программы она создала новый набор тестовых данных.
Запустите программу еще раз.
6. Остановите программу, нажав в эмуляторе Windows Phone кнопку
Назад. Не останавливайте выполнение программы в Visual Studio.
7. Запустите программу еще раз.
8. Выберите любого клиента и просмотрите информацию о
встречах, которая должна была быть сохранена.
Упражнение 2. Использование базы данных
В программу, созданную в предыдущем упражнении, внесли изменения,
чтобы она могла работать с базой данных. Однако, программа
компилируется, но не запускается. Необходимо исправить ошибку.
1. Откройте в Visual Studio проект CustomerManager в папке Lab5
Customer Time Logger Database. Этот проект содержит версию
программы, в которой обнаружена ошибка.
2. Убедитесь в том, что эмулятор Windows Phone не запущен.
3. Запустите программу. Программа сгенерирует тестовые данные и
попытается их использовать. После этого будет сгенерировано
исключение, в котором база данных сообщает, что проблема
связана с внешним ключом. Это касается связей между классами
Session и Customer. Сообщение об ошибке информирует о
том, что невозможно вставить внешний ключ, так как не
существует соответствующий первичный ключ.
252
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
При создании связи встречи с клиентом запись в таблице встреч
должна содержать значение первичного ключа, которое
идентифицирует клиента. Однако, если этот ключ еще не был
задан, база данных не может добавить запись. При создании связи
между этими двумя таблицами необходимо:
° добавить встречу к списку встреч клиента;
° установить значение customerlD для встречи, чтобы
идентифицировать клиента для этой встречи.
Код, который выполняет эти действия, выглядит следующим
образом:
int sessionLength = sessionRand.Next(5,120);
string sessionDesc = 'Встреча ” + LToStringO;
Session newSession = new Session();
newSession.Description = sessionDesc;
newSession.LengthInMins = sessionLength;
newSession.SessionCustomer = c;
newDB. SessionTable. InsertOnSubmit(newSession);
c.Sessions.Add(newSession);
4. Добавьте этот код в программу и запустите ее повторно. Теперь
программа работает правильно и позволяет управлять данными.
Тестирование хранения данных
В настоящее время при каждом запуске программа создает новую базу
данных. Измените программу так, чтобы она использовала
существующую базу данных и создавала новую, если база данных не
существует. Обратите внимание, что новая база данных создается при
выполнении следующей строки кода в файле App.xaml.cs:
CustomerDB.MakeTestDB('Data Source=isostore:/Sample.sdf');
2525
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Изолированное хранилище
Цель работы: изучение возможностей использования изолированного
хранилища для хранения данных и настроек приложения Silverlight
Основные теоретические сведения
Практически в любом приложении требуется хранить данные, которые
приложение использует при работе. Приложение Silverlight должно
сохранять настройки и информацию, с которой работает пользователь,
игре XNA требуется хранить информацию о достижениях игрока,
список рекордов и игровые настройки. Программы Windows Phone могут
использовать изолированное хранилище для хранения подобной
информации. Хранилище называют "изолированным", потому что
приложение не может получить доступ к данным, которые сохраняет
другое приложение, в отличие от компьютеров под управлением
Windows, в которых любая программа может получить доступ к любому
файлу в системе.
В изолированном хранилище можно сохранять большие объёмы данных
вплоть до максимально доступного объёма памяти для хранения данных
в телефоне. В устройствах Windows Phone имеется минимум 8 Гб
встроенного хранилища, которое совместно используется программами
для работы с мультимедиа файлами (музыка, изображения и видео) и
всеми приложениями в устройстве.
При удалении приложения из телефона всё содержимое
изолированного хранилища, связанное с этим приложением, также
удаляется. Когда приложение обновляется до новой версии через
Marketplace, содержимое изолированного хранилища сохраняется, а
если данные в хранилище должны быть обновлены до новой версии,
приложение их обновляет.
Изолированное хранилище можно использовать точно так же, как и
файловую систему Единственная разница заключается в способе
подключения приложения к хранилищу Однако, после того как
программа подключится к файловой системе, она может создавать
потоки для передачи данных в файлы и даже использовать папки для
создания структурированного файлового хранилища. Так программа
254
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
может сохранять большие объёмы данных.
Классы для работы с файлами изолированного
хранилища
Необходимые классы для работы с изолированным хранилищем
находятся в пространствах имён System. IO и
System.IO.IsolatedStorage. В последнем описаны классы
IsolatedStorageFile и IsolatedStorageFileStream,
которые позволяют работать с файлами изолированного хранилища.
Класс IsolatedStorageFile содержит следующие методы для
работы с файловой системой:
• GetUserStoreForApplication — получает изолированное
хранение с областью действия пользователя, соответствующее
вызову удостоверения приложения кода;
• Close — закрывает ранее открытое хранилище;
• CreateDirectory — создает в области ограниченного
действия изолированного хранения папку;
• MoveDirectory — перемещает указанный каталог и его
содержимое в новое расположение;
• DeleteDirectory — удаляет из области ограниченного
действия изолированного хранилища папку;
• DirectoryExists — определяет, указывает ли заданный путь
на существующий каталог в изолированном хранилище;
• GetDirectoryNames — перечисляет каталоги в корневой
папке изолированного хранилища;
• CreateFile — создает файл в изолированном хранилище;
• CopyFile — копирует существующий файл в новый файл;
• OpenFile — открывает файл в заданном режиме, с заданным
уровнем доступа для чтения и записи и с разрешением на
совместный доступ;
• MoveFile — перемещает указанный файл в новое расположение
и позволяет указать для файла новое имя;
• DeleteFile — удаляет из области ограниченного действия
255
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
изолированного хранилища файл;
• GetFileNames — перечисляет имена файлов в корневой папке
изолированного хранилища;
• FileExists — определяет, указывает ли заданный путь на
существующий файл в изолированном хранилище;
• GetCreationTime — возвращает дату и время создания
заданного файла или каталога;
• GetLastAccessTime — возвращает дату и время последнего
обращения к указанному файлу или каталогу;
• GetLastWriteTime — возвращает дату и время последней
операции записи в указанный файл или каталог.
Работа с классом IsolatedStorageFileStream аналогична
работе с другими потоками.
Ниже представлены методы для сохранения строки в файле и для
загрузки строки из файла.
private void saveText(string filename, string text)
{
using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplicat
{
using (IsolatedStorageFileStream rawStream = isf.CreateFile(flename))
{
StreamWriter writer = new StreamWriter(rawStream);
writer.Write(text);
writer.Close();
}
}
}
private bool loadText(string filename, out string result)
{
result = "";
using (IsolatedStorageFile isf = IsolatedStorageFile.GetUserStoreForApplicat
{
if (isf.FileExists(filename))
{
try
256
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
{
using (IsolatedStorageFileStream rawStream =
isf.OpenFile(filename, System.IO.FileMode.Open))
{
StreamReader reader = new StreamReader(rawStream);
result = reader.ReadToEnd();
reader.Close();
}
}
catch
{
return false;
}
}
else
{
return false;
}
}
return true;
}
Метод saveText создаёт поток, связанный с указанным файлом в
изолированном хранилище, и записывает в него текст. Потоки работают
точно так же, как и в других программах на C#. В нашем случае метод
создаёт объект Stre amW riter, которому передаётся текст.
Метод loadText возвращает значение false, если входной файл не
найден, или при чтении файла возникает исключение. Метод
ReadToEnd позволяет делать в программе многострочные текстовые
записи.
Классы для работы с хранилищем настроек приложения
Часто программам нужно сохранить некоторые настройки, которые
являются простыми значениями. В этом случае использовать файлы и
потоки очень неудобно. Чтобы облегчить сохранение настроек,
программа Windows Phone может использовать хранилище для настроек.
257
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Оно работает как словарь, который может сохранить любое количество
пар "имя—значение" в изолированной области.
В Windows Phone можно использовать класс
IsolatedStorageSettings, который является словарём для
хранения настроек в системе. Словарь настроек хранит коллекцию
объектов и использует строку в качестве ключа.
Можно изменить рассмотренные выше методы, добавив использование
изолированного хранилища настроек:
private void saveText(string filename, string text)
{
IsolatedStorageSettings isolatedStore =
IsolatedStorageSettings.ApplicationSettings;
isolatedStore.Remove(filename);
isolatedStore.Add(filename, text);
isolatedStore.Save();
}
Эта версия метода saveText использует имя файла в качестве ключа.
Он удаляет запись с существующим ключом, значение которого является
именем файла, и добавляет переданный текст в качестве нового
элемента. Метод Remove вызывается для удаления элемента из
словаря. Метод принимает в качестве параметра значение ключа
элемента, который нужно удалить. Если элемента с таким ключом в
словаре нет, метод Remove возвращает значение false, но в нашем
примере это не имеет значения. После выполнения изменений в
хранилище, необходимо вызвать метод Save для сохранения этих
изменений.
Метод loadText будет считывать значения из словаря настроек:
private bool loadText(string filename, out string result)
{
IsolatedStorageSettings isolatedStore =
IsolatedStorageSettings.ApplicationSettings;
result = "";
try
258
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
{
result = (string)isolatedStore[filename];
}
catch
{
return false;
}
return true;
}
Метод loadText выбирает запрошенный элемент из хранилища
настроек. Его использование осложняется тем, что в отличие от класса
Dictionary класс IsolatedStorageSettings не содержит
метод ContainsKey, который используется для определения, есть ли
в словаре данный элемент. Наш метод перехватывает исключение,
которое генерируется, если элемент не найден, и возвращает значение
false, чтобы указать, что такого элемента нет.
Дополнительные материалы
Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/3ak841sy.
Задание к работе
1. Откройте в Visual Studio созданный в предыдущей работе проект
программы для Windows Phone.
2. Добавьте в программу возможность добавления и удаления
элементов списка, сохранения списка в файле изолированного
хранилища и его загрузки из файла при запуске программы.
3. Добавьте в программу возможность изменения параметров
отображения страницы программы (размер шрифта текста
заголовка программы, цвет фона и др.), их сохранения в
хранилище приложения и применения при запуске программы.
4. Запустите программу и проверьте правильность её работы.
5. Составьте отчёт о проделанной работе. Включите в отчёт
необходимые листинги программы.
259
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Взаимодействие приложения с базой данных
Цель работы: изучение возможностей использования базы данных в
приложениях для Windows Phone.
Основные теоретические сведения
База данных — это набор данных, которые организованы и
управляются компьютерной программой, которая называется система
управления базами данных. Программа может отправлять запросы к
базе данных, в ответ на которые база данных возвращает результаты.
При этом, сама база данных является частью решения, которое является
хранилищем данных.
Работа с базой данных в приложениях для Windows Phone
осуществляется с помощью интегрированного языка запросов LINQ.
Язык LINQ фактически встроен в язык C# и добавляет особые
синтаксические конструкции для составления запросов, которые
используют программные объекты. Windows Phone позволяет
использовать в программах базы данных, взаимодействие с которыми
выполняется с помощью LINQ.
Для того, чтобы воспользоваться локальной базой данных, необходимо
добавить в решение ссылку на библиотеку System.Data.Linq, а
также добавить блок using следующие директивы:
using System.Data.Linq;
using System.Data.Linq.Mapping;
using System.ComponentModel;
using System.Collections.ObjectModel;
Далее необходимо определить классы, которое будут представлять
сущности для хранения в локальной базе, добавить к ним атрибуты
[Table] и [Column] с параметрами и реализовать интерфейсы
INotifyPropertyChanged, INotifyPropertyChanging,
чтобы минимизировать использование памяти.
Затем необходимо определить свой класс контекста данных,
унаследованный от DataContext и определить в нём таблицы. Это
2(50
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
создаст базовую инфраструктуру для использования локальной базы
данных на устройстве.
Дополнительные материалы
Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/hh202860.
Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/bb399408.
Задание к работе
1. Спроектируйте структуру базы данных, состоящей из 3—5
связанных таблиц, которая позволяет хранить информацию о
каких-либо объектах.
2. Создайте в Visual Studio проект программы Silverlight для Windows
Phone.
3. Создайте в проекте программы классы, отображаемые на
соответствующие таблицы базы данных.
4. Добавьте к классам необходимые атрибуты для создания связей
между таблицами базы данных.
5. Добавьте в программу код для создания структуры базы данных
при первом запуске программы, добавления, изменения и
удаления записей таблиц базы данных.
6. Запустите программу и проверьте правильность её работы.
7. Составьте отчёт о проделанной работе. Включите в отчёт
структуру базы данных и необходимые листинги программы.
2(51
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Средства Windows Phone для работы с сетью
Телефоны на платформе Windows Phone практически всегда используют
в работе подключение к сети Интернет, например, для получения
увемлений или для получения и сохранения файлов в службе SkyDrive. В
этом главе вы познакомитесь с возможностями использования сетевых
подключений в приложениях для Windows Phone, а также с методами
обеспечения корректной работы программ при обрыве подключения к
сети.
Презентацию к данной главе Вы можете скачать здесь - h ttpy/old.intuit.ru/
department/se/devmobwphn/17/06.pptx.
Все устройства Windows Phone могут использовать сетевые подключения
к сети оператора сотовой связи и к сетям Wi-Fi. Эти две сетевых
технологии являются взаимозаменяемыми. Однако, оба типа сетей не
всегда бывают доступными одновременно.
Если при подключении к одной из сетей мобильной связи или Wi-Fi
сигнал сети пропадёт, то это подключение прервётся. Приложения
должны корректно работать в подобной ситуации — по крайней мере,
выводить на экран сообщение вида: "Используемое сетевое
подключение временно недоступно. Попробуйте повторить попытку
позже". Предпочтительнее, если программа сохранит данные в
устройстве, чтобы отправить их, когда подключение к сети будет
доступно.
В эмуляторе Windows Phone доступны такие же сетевые возможности,
как и в реальном устройстве. Эмулятор использует сетевые
подключения компьютера, на котором он запущен. Его также можно
использовать для тестирования приложений Windows Phone,
использующих сетевые подключения. Однако, имеет смысл
протестировать работу программы на физическом устройстве. В
телефоне можно отключить сетевые службы и проверить работу
приложения, чтобы быть уверенным, что оно будет работать должным
образом и с низкоскоростным подключением к сети, если
высокоскоростное подключение окажется недоступным.
17.1. Основные сведения о сетях
262
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Перед изучением использования сетевых подключений в приложениях
для Windows Phone необходимо ознакомиться с основными сведениями о
сетях. Это необходимо для того чтобы лучше понять, как будут работать
создаваемые нами программы. Подробное изучение вопросов сетевого
взаимодействия устройств не входит в темы данного курса —
приводится лишь некоторая базовая информация.
Сетевые сигналы
Первые компьютерные сети использовали провода для передачи
сигналов данных. Современные сети могут использовать радиоволны
или оптоволоконные кабели. Независимо от типа среды передачи
данных основной принцип их действия заключается в том, что
имеющиеся аппаратные средства могут передавать и получать данные в
виде последовательностей битов.
В Windows Phone существует несколько типов сетевых сигналов, которые
могут использоваться для подключения к сети: Wi-Fi, сотовая сеть и
USB-подключение к программному обеспечению Zune на компьютере.
Все эти технологии позволяют передавать данные между программами
в телефоне и Интернетом (рис. 17.1).
Программы Windows Phone
Н
Интерфейс сетевого
программирования
Wi-Fi
Сотовая
сеть
USB
2(525
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 17.1. Схема взаимодействия программ телефона с сетевыми
подключениями
Программы Windows Phone взаимодействуют с интерфейсом сетевого
программирования, который в свою очередь связан с тремя сетевыми
технологиями. При этом, программы могут работать с подключениями
различных типов без необходимости из изменения. Однако, необходимо
помнить о том, что если пользователь телефона уезжает заграницу, ему
может быть недоступен роуминг, и он не сможет использовать
мобильный Интернет. Кроме этого, пользователь может перевести свой
телефон в режим В самолёте и отключить на некоторое время все
сетевые подключения.
Программа Windows Phone может определить, какие доступны
подключения, с помощью методов класса
DeviceNetworkInformation.
using Microsoft.Phone.Net.NetworkInformation;
SystemTextStringBuilder sb = new System.Text.StringBuilder();
sb.Append("Оператор: ” );
sb.AppendLine(DeviceNetworkInformation.CellularMobileOperator);
sb.Append("Сеть доступна: ”);
sb.AppendLine(DeviceNetworkInformation.IsNetworkAvailable.ToString());
sb.Append("Передача данных по сети доступна: ”);
sb.AppendLine(DeviceNetworkInformation.IsCellularDataEnabled.ToStringQ);
sb.Append("Передача данных в роуминге доступна: ”);
sb.AppendLine(DeviceNetworkInformation.IsCellularDataRoamingEnabled.ToS
sb.Append('Wi-Fi включён: ”);
sb.AppendLine(DeviceNetworkInformation.IsWiFiEnabled.ToStringO);
Этот код создаёт сообщение о состоянии телефона, которое можно
264
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
вывести на экран. Также можно использовать эти значения, чтобы
управлять поведением приложения в зависимости от конкретной
ситуации.
Сетевые пакеты
Последовательности двоичных сигналов представляют какую-то
информацию. Чтобы передавать полезную информацию, необходимо
определить формат передаваемого сообщения.
Современная сеть передаёт данные частями по 8 битов, которые
называют октетами. В языке C# значение одного октета можно
сохранить в переменной типа byte. Октет — это наименьшая единица
информации, которую можно передать по сети. Октет может быть,
например, числом в диапазоне от 0 до 255, символом или частью
большего элемента, например числа с плавающей точкой или файла
изображения. В Интернете пакет данных может состоять из нескольких
тысяч октетов.
Адресация пакетов
У каждого узла физической сети должен быть уникальный адрес.
Пакеты, отправленные по этому адресу, принимает сетевое устройство
соответствующей станции. Также в сетях существует понятие
широковещательный адрес, который позволяет системе отправлять
сообщения всем узлам сети. В компьютерных сетях широковещательная
передача данных позволяет новому компьютеру узнать сетевые адреса
систем, от которых необходимо получить параметры конфигурации.
Все устройства сети могут получать и организовывать
широковещательную передачу данных. Фактически, узлы сети могут
принимать все сообщения, переданные по каналу Wi-Fi или проводам.
При этом возникает проблема безопасности передачи информации:
устройства в сети могут использовать любую информацию, которая
предназначена другим устройствам. При подключении к безопасному
веб-сайту компьютер кодирует все передаваемые на сайт сообщения так,
чтобы другие узлы сети, которые получают эти сообщения, не могли их
265
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
прочитать зашифрованную в них информацию.
Для формирования адреса узла, которому необходимо передать
сообщение, существующая версия протокола IPv4, который используется
в компьютерных сетях и в Интернете, использует четыре 8-битовых
значения, записанных последовательно. Теоретически такой способ
позволяет адресовать более 4 млрд различных систем в Интернете.
Однако, на практике эта цифра оказывается существенно меньше,
поскольку некоторые адреса зарезервированы для различных целей и их
нельзя использовать для адресации устройства. Не так давно вышла в
свет новая версия протокола IPv6, в котором каждый адрес занимает 128
битов (16 октетов). Новая версия протокола должна учесть значительное
увеличение количества возможных узлов, однако его использование
приводит к существенным изменениям в функционировании сети,
осуществление которых требует много времени. В настоящее время
сетевые возможности Windows Phone не поддерживают протокол IPv6.
Маршрутизация
Не все устройства в Интернете соединены в одну физическую сеть. По
сути, Интернет объединяет большое количество отдельных сетей. Что
чтобы передать сообщение из одной физической сети в другую,
необходимо осуществить маршрутизацию.
Для осуществления маршрутизации между двумя сетями необходим
сетевой маршрутизатор, который подключается к обеим сетям и может
получать сообщения из одной сети и отправлять их в другую. В сети
Интернет адрес устройства состоит из двух элементов: адреса локальной
сети, в которой находится устройство, и адреса устройства в этой сети.
При этом, в локальной сети любые два устройства могут обмениваться
данными напрямую.
Пакеты, которые необходимо отправить с домашнего компьютера на
удалённые устройства, передаются через сеть Интернет-провайдера
(ISP), который передаёт эти пакеты к следующей системе в сети.
Обычно пакеты доходят до узла-адресата, минуя несколько устройств.
Интернет определяет и периодически изменяет маршруты, по которым
следуют пакеты, что позволяет управлять внезапным возрастанием
266
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
трафика и отказами частей сети, но это может привести к ситуациям,
когда один пакет прибывает на узел адресата до того момента, как туда
прибывает пакет, отправленный раньше первого. Иногда пакеты могут
потеряться (хотя это происходит довольно редко), и таким образом,
нельзя быть уверенным, что все пакеты прибыли, пока не придёт
подтверждение об этом.
Передача данных в Интернете осуществляется в соответствии с
локальным протоколом (протокол управления передачей данных TCP) и
межсетевым протоколом (Интернет-протокол IP). Эти протоколы
работают совместно и образуют стек протоколов TCP/IP.
Протокол TCP/IP можно использовать для связи устройств без их
подключения к Интернету. Например, можно подключить устройство
Windows Phone к компьютеру и передавать мультимедиа данные с
помощью программного обеспечения Zune.
Передаваемая через Интернет информация разбивается на один или
несколько пакетов. Каждый пакет содержит адрес получателя и его
номер, чтобы можно было обнаружить недостающие пакеты и при
получении расположить их в правильном порядке, а также адрес
отправителя и некоторую служебную информацию.
Сетевые подключения и протоколы
Подключения между разными частями сети могут использовать разные
типы подключения. Многие устройства поддерживают несколько типов
сетевых подключений. Устройство Windows Phone может подключаться к
Интернету через сеть оператора сотовой связи или через сеть Wi-Fi. При
этом, для программ Windows Phone не имеет значения, каким способом
телефон подключён к Интернету.
Сетевой протокол определяет структуру сообщений и правила
взаимодействия сетевых устройств при передаче данных. Существует
два уровня правил сетевого протокола. Протокол локального уровня
позволяет локальным узлам (расположенным в одной сети) передавать
друг другу информацию. Межсетевой протокол позволяет передавать
сообщения из одной локальной сети в другую.
267
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
В Интернете используется большом количество различных протоколов,
которые работают совместно и используются различными системами
для обмена информацией.
Нахождение адресов в Интернете с помощью DNS
Все адреса в Интернете имеют размер 32 бита и обычно записываются
в виде значений четырёх октетов, разделённых точкой. Адрес состоит
из адреса подсети и адреса узла в этой подсети. Такой адрес называется
IP-адресом системы.
Однако, IP-адреса всех используемых узлов запомнить довольно
сложно, и к тому же, в них легко запутаться. Поэтому для обращения к
узлам в Интернете используют более удобные имена. Для того чтобы по
имени узла найти его IP-адрес, существуют специальные серверы,
которые преобразуют имена узлов в IP-адреса. Такая система
называется системой доменных имён, или DNS. Когда компьютеру
нужно узнать IP-адрес веб-сайта, на который хочет зайти пользователь,
он направляет запрос к одному из DNS-серверов, который выдаёт
необходимый результат.
В сети Интернет работает так много устройств, что при использовании
протокола IPv4 всех доступных IP-адресов недостаточно для того,
чтобы выделить каждому устройству отдельный IP-адрес. Поэтому
большинство устройств находятся в локальных подсетях, каждая из
которых подключается к Интернету через маршрутизатор, который имеет
прямой выход в Интернет. При этом, локальные адреса устройств
позволяют получать доступ только к устройствам в той же подсети и к
устройствам, подключённым к Интернету напрямую. Соответственно,
два телефона обычно не могут соединяться друг с другом напрямую —
для этого необходимо промежуточное устройство для связи телефонов в
одну подсеть, например, Wi-Fi-маршрутизатор.
Сетевые порты
Если между двумя компьютерами установлено сетевое подключение, то
его могут использовать любые приложения, которым разрешён доступ к
268
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
сети. Например, сервер может предоставлять подключённым клиентам
доступ к различным службам. При этом, клиентам нужен способ
определения местонахождения службы, которую они хотят использовать
на сервере.
Для этих целей в Интернете используются порты. Порт — это число,
которое идентифицирует службу, которую предоставляет компьютер.
Некоторые из портов являются общепринятыми, например порт номер
80 обычно используется веб-серверами. Когда браузер клиента
запрашивает веб-страницу, он использует Интернет-адрес сервера и
использует порт 80, чтобы получить веб-страницу с этого сервера.
Когда на сервере запускается служба, она сообщает системе, какой порт
будет использовать. Когда на определённый порт сервера приходят
сообщения, сервер передаёт их соответствующей службе. Чтобы
получить к доступ к нужной службе, необходимо знать номер порта, на
котором эта служба работает.
Программисты могут создавать программы, которые используют любой
номер порта, но многие сети используют брандмауэры, которые
пропускают пакеты, адресованные определённым номерам портов, а
если пакеты приходят на другие порты — они блокируются. Эта мера
позволяет повысить безопасность сервера от сетевых атак.
Сеансы подключения и дейтаграммы
Интернет поддерживает два способа обмена информацией между
устройствами: сеансы подключения и дейтаграммы. Дейтаграмма — это
сообщение, которое передаётся из одной системы в другую. Если между
двумя системами создаётся сеанс подключения, это приводит к
выполнению дополнительной работы по управлению подключением,
например, отправлять сообщения о подтверждении принятия пакетов
данных или сообщения о возникшей ошибке передачи данных.
Сеансы подключения используются, когда необходимо получать
подтверждения об успешной передаче сообщений. Например, когда
браузер загружает веб-страницу с сервера, необходимо быть уверенным,
что все части веб-страницы доставлены, а если некоторые части
269
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
страницы не доставлены, то необходима их повторная передача.
Дополнительная работа по управлению сеансами подключения снижает
скорость передачи данных, а также предъявляет дополнительные
требования к каналам связи.
Дейтаграммы используются для передачи данных в тех случаях, когда не
нужно получать подтверждения передачи данных. Если переданная по
сети дейтаграмма будет потеряна, об этом не нужно сообщать, поскольку
к тому времени, когда прибудет новая копия дейтаграммы, она уже
устареет. Дейтаграммы удобно использовать, если необходимо
отправлять данные с максимальной скоростью, и их потеря некритична.
Дейтаграммы используются для потоковой трансляции аудио или
видео, где главным приоритетом является скорость передачи данных.
В Интернете используются протокол управления подключениями TCP,
который позволяет настраивать и управлять подключениями между
сетевыми станциями, и протокол пользовательских дейтаграмм UDP,
который позволяет передавать дейтаграммы.
Сетевые средства Windows Phone позволяют отправлять дейтаграммы и
создавать сеансы подключения. Программисты решают сами, какой тип
подключения лучше использовать в конкретной ситуации.
17.2. Создание подключения по протоколу UDP
Рассмотрим процесс создания программы, которая будет использовать
протокол UDP для обмена сообщениями с удалённой службой под
названием echo. Эта служба принимает входящие сообщения и
отправляет их назад. Такая служба полезна для тестирования сетевых
подключений. Это одна из самых первых Интернет-служб, и ей выделен
порт с номером 7. Службу echo можно запустить на компьютере и
использовать её для обмена дейтаграммами.
Создадим метод, который будет использовать протокол UDP для
отправки сообщения на удалённый сервер. Пользователь должен будет
ввести в текстовые поля программы сообщение для отправки и адрес
целевого узла, а программа выполнит все необходимые действия. Метод
может выглядеть так:
270
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
/// <summary>
/// Отправляет сообщение по указанному адресу, используя протокол UI
/// </summary>
/// <param name="message">сообщение для отправки</рагат>
/// <param name='hostUrl">URL узла</param>
/// <param name="portNllmber">порт</param>
/// <retums>сообщение об ошибке^е^!^
public string SendMessageUDP(string message, string hostUrl, int portNumber)
{
// создать сокет и отправить сообщение
// возвратить сообщение об ошибке, если оправка сообщения заверши
// возвратить пустую строку, если сообщение будет передано успешно
}
Этот метод можно использовать так:
const int ECHO_PORT = 7;
string sendResponse = SendMessageUDP(MessageTextBox.Text, HostTextBox
ECHO_PORT);
Этот код передаёт методу SendMessageUDP строки из текстовых
полей, которые содержат текст сообщения и адрес узла, и номер порта
на удалённом сервере. В данном случае будет использоваться порт 7.
Для того чтобы создать соединение между программой и сетью,
необходимо создать экземпляр класса Socket.
Класс Socket
Класс Socket позволяет использовать в программе сетевые подключения
для взаимодействия с сетевой службой. Если в программе нужно
использовать несколько сетевых служб, необходимо создать несколько
экземпляров этого класса.
Несмотря на то, что Windows Phone поддерживает несколько способов
подключения к Интернету, программа будет использовать ту же самую
технологию сокетов для управления подключением. Класс Socket
выбирает наиболее подходящий способ подключения. Если доступная
271
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
сеть Wi-Fi, то будет использоваться она, а при её отсутствии будет
установлено подключение к сети оператора сотовой связи.
В отличие от компьютеров, которые чаще всего используют
фиксированное проводное подключение, при использовании Windows
Phone существует вероятность того, что пользователь переключит
телефон в режим В самолёте, что приведёт к отключению телефона от
всех доступных сетей. В этой ситуации программа должна продолжать
работу без подключения к сети или выдать пользователю сообщение о
состоянии.
Класс Socket описан в пространстве имён System.Net.Sockets,
ссылку на которое рекомендуется добавить с помощью директивы
using. Обычно файл библиотеки для работы с сетью уже является
частью проекта, и его не нужно добавлять в проект вручную.
Для начала необходимо создать экземпляр класса Socket, который
программа будет использовать для работы с сетевым подключением, и
указать необходимые параметры для конструктора класса:
Socket hostSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dg
ProtocolType.Udp);
Этот код создаёт экземпляр класса Socket, который использует
адресацию IPv4 и дейтаграммы протокола UDP.
Класс SocketAsyncEventArgs
Теперь необходимо создать экземпляр класса
SocketAsyncEventArgs, который используется для того чтобы
сконфигурировать созданный сокет. Этот класс позволяет создать
асинхронное подключение.
Для начала нужно задать конечную точку подключения, с которой будет
взаимодействовать программа. Конечная точка состоит из адреса узла и
номера порта на этом узле. Номер порта фактически идентифицирует
программу на компьютере, с которой будет взаимодействовать наша
программа. В нашем примере будет производиться передача сообщений
272
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
в программу echo, которая использует порт 7.
Класс SocketAsyncEventArgs содержит свойство
RemoteEndPoint, которое описывает конечную точку подключения:
SocketAsyncEventArgs socketEventArgs = new SocketAsyncEventArgsO;
socketEventArgs.RemoteEndPoint = new DnsEndPoint(hostUrl, portNumber);
Этот код создаёт новый экземпляр класса SocketAsyncEventArgs
и использует класс DnsEndPoint для указания Интернет-адреса узла
и номера порта. При создании экземпляра класса DnsEndPoint
указывается строка URL целевой системы, и класс будет использовать
систему доменных имён, чтобы найти фактический IP-адрес узла,
который необходим для создания подключения. Если этот адрес не будет
найден, класс сгенерирует исключение.
После указания конечной точки подключения необходимо указать
сообщение, которое необходимо передать программе echo, чтобы она
отправила его назад:
// поместить сообщение в буфер
byte[] messageBytes = Encoding.UTF8.GetBytes(message);
socketEventArgs.SetBuffer(messageBytes, 0, messageBytes.Length);
Чтобы передать любое сообщение, оно должно быть представлено в
виде последовательности октетов. При этом, само сообщение может
быть текстом, изображением, аудио- или видеофайлом и т.д. Служба
echo просто возвращает переданную ей последовательность октетов,
независимо от того, какая информация в ней закодирована.
Чтобы преобразовать текст в последовательность 8-битовых значений,
можно использовать класс Encoding, который описан в пространстве
System.Text. Этот класс использует метод GetBytes для
преобразования строки, закодированной в системе UTF-8, в массив
байтов. Кодировка UTF-8 используется в системе Windows Phone для
кодирования символов.
Создание метода SendMessageUDP
273
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
На следующем шаге необходимо определить метод, который будет
вызываться после выполнения передачи, поскольку мы используем
класс SocketAsyncEventArgs для создания асинхронных
подключений. В отличие от синхронных, асинхронные подключения не
требуют ожидания завершения работы. Для программ Windows Phone
это может быть весьма критично.
Класс SocketAsyncEventArgs содержит свойство Completed,
которое генерирует событие при завершении взаимодействия с сетью.
При наступлении события можно выполнить код, который проверит
результат выполнения сетевого запроса. Этот код необходимо связать со
свойством C omp leted.
public string SendMessageUDP(string message, string hostUrl, int portNumber)
{
// строка для хранения ответного сообщения
string response =
// создание аргумента для запроса
SocketAsyncEventArgs socketEventArgs = new SocketAsyncEventArgs();
// создание конечной точки подключения
socketEventArgs.RemoteEndPoint = new DnsEndPoint(hostUrl, portNumber,
AddressF amily. InterN etwork);
// поместить сообщение в буфер
byte[] messageBytes = Encoding.UTF8.GetBytes(message);
socketEventArgs.SetBuffer(messageBytes, 0, messageBytes.Length);
// подключить обработчик события завершения запроса
socketEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>
(delegate(object s, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
response = "";
}
else
{
response = e.SocketError.ToStringQ;
274
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
}
// запустить все ожидающие потоки
transferDoneFlag. S et();
});
}
В этом коде блок программы связывается с событием Completed. В
этом случае код обработчика события может получить доступ к
локальным переменным в методе SendMessageUDP, в частности, к
переменной response, которая будет содержать строку с сообщением
об ошибке. Обработчик события Completed вызывается только когда
будет завершена сетевая операция.
Событие Completed использует ссылку на объект класса
SocketAsyncEventArgs, который описывает состояние
транзакции. Он устанавливает значение флага состояния
SocketError, которое сообщает, успешно ли было передано
сообщение. Если передача сообщения завершилась неудачей, в
переменную response записывается сообщение об ошибке.
Также обработчик события устанавливает флаг для указания программе,
что был получен ответ от сокета. Все действия, выполняемые в
асинхронном режиме, выполняются параллельно с действиями
программы после вызова асинхронной команды. В какой-то момент
асинхронная операция завершается и вызывает обработчик события,
чтобы сообщить о завершении операции.
В .NET асинхронные операции выполняются в отдельных потоках.
Запускаемая в Windows Phone программа, по сути, является потоком,
который становится активным потоком устройства. Программы могут
запускать другие потоки для выполнения асинхронных операций, и
иногда один поток должен ожидать завершения другого потока. Среда
.NET предоставляет возможность взаимодействия потоков с помощью
класса ManualResetEvent:
static ManualResetEvent transferDoneFlag = new ManualResetEvent(false);
275
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Программа содержит переменную transferDoneFlag, которая
может использоваться в качестве флага. Переменная объявлена как
static, чтобы все экземпляры класса использовали один флаг,
поскольку можно создать ограниченное количество экземпляров класса
ManualResetEvent.
Переменная transferDoneFlag может находиться в одном из двух
состояний. Изначально значение флага равно false, т.е. флаг сброшен.
Поток может ожидать завершения другого потока, чтобы установить
этот флаг, т.е. изменить его значение на true, используя метод
WaitOne. Это остановит текущий поток, пока другой поток не
установит флаг, вызвав метод Set.
В описанном подходе имеется проблема, которая состоит в том, что
метод WaitOne приостановит текущий поток, пока флаг не будет
установлен. Если флаг никогда не будет установлен, то поток не
возобновит выполнение. Чтобы избежать подобной проблемы, при
вызове метода WaitOne можно указать значение тайм-аута в
миллисекундах. В этом случае ожидающий поток продолжит работу,
если флаг будет установлен другим потоком, или по истечении
заданного времени.
Этот подход особенно полезен на платформе Windows Phone, поскольку в
мобильных устройствах высока вероятность, что сетевой запрос
завершится неудачей. При создании приложения, которое использует
сетевые подключения, рекомендуется задавать тайм-аут и обрабатывать
ситуацию, когда подключение недоступно. Кроме того, ожидание
завершения других потоков позволяет экономить системные ресурсы.
Фактически, в нашей программе будет использоваться главный поток,
который создаётся при запуске программы, и фоновый поток, который
запускается для выполнения сетевой операции. Если главный поток
должен ожидать, пока флаг не будет установлен, перед этим флаг нужно
сбросить, вызвав метод Reset , иначе программа не будет ожидать
завершения потока, поскольку флаг может быть установлен перед
вызовом метода WaitOne.
После выполнения всех необходимых настроек, можно отправить
сообщение удалённому компьютеру:
276
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
// отправка сообщения
hostSocket.SendToAsync(socketEventArgs);
// ожидание события
// работа будет продолжена после получения ответа или по истечению ]
transferDoneF]ag.WaitOne(MESSAGE_TIMEOUT_MSECS);
Полная версия метода SendMessageUDP будет выглядеть следующим
образом:
static ManualResetEvent transferDoneFlag = new Manua]ResetEvent(faise);
const int MESSAGE_TIMEOUT_MSECS = 10000;
public string SendMessageUDP(string message, string hostUrl, int portNumber)
{
string response = "Истекло время ожидания";
SocketAsyncEventArgs socketEventArgs = new SocketAsyncEventArgs();
socketEventArgs.RemoteEndPoint = new DnsEndPoint(hostUr], portNumber,
AddressF amily. InterN etwork);
byte[] messageBytes = Encoding.UTF8.GetBytes(message);
socketEventArgs.SetBuffer(messageBytes, 0, messageBytes.Length);
socketEventArgs.Completed += new EventHand]er<SocketAsyncEventArgs>
(delegate(object s, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
response = "";
}
else
{
response = e.SocketError.ToStringQ;
}
transferDoneFlag.Set();
});
277
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
transferDoneF]ag.ResetO;
hostSocket.SendToAsync(socketEventArgs);
transferDoneF]ag.WaitOne(MESSAGE_TIMEOUT_MSECS);
return response;
}
В этом методе переменной response изначально присваивается значение
"Истекло время ожидания". Если подключение не отвечает в течение
заданного времени, метод возвращает эту строку, что будет
свидетельствовать о возникновении ошибки. Если сетевой запрос
выполнится успешно, то метод вернёт пустую строку.
Отправка и получение сообщения
Созданный метод можно использовать, указав текст передаваемого
сообщения, имя узла и номер порта. Метод вернёт ответ, который мы
можно проверить в программе:
string sendResponse = SendMessageUDP(MessageTextBox.Text, HostTextBox
ECHO_PORT);
Если адрес узла окажется недоступным, то метод завершится неудачей.
Однако, это единственный вариант, при котором метод завершится
неудачей. Поскольку информация будет передана в виде дейтаграммы,
программа не сможет узнать, получила ли удаленная система
переданное сообщение, если она не отправит ответное сообщение.
Для того чтобы получить ответ от службы echo после отправки
сообщения нужно настроить другое подключение с удалённым узлом.
Можно создать другой метод для отправки запроса на чтение:
public string ReceiveMessageUDP(int portNumber, out string result)
{
string response = "Ошибка: тайм-аут запроса";
278
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
string message ="";
SocketAsyncEventArgs socketEventArgs = new SocketAsyncEventArgsO;
socketEventArgs.RemoteEndPoint = new IPEndPoint(IPAddress.Any, portNi
byte[] responseBytes = new byte[MAX_BUFFER_SIZE];
socketEventArgs.SetBuffer(responseBytes, 0, MAX_BUFFER_SIZE);
socketEventArgs.Completed += new EventHandler<SocketAsyncEventArgs:
(delegate(object s, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
response = "";
message = Encoding.UTF8.GetString(e.Buffer, e.Offset, e.BytesTransfer
message = message.Trim('\0');
}
else
{
response = e.SocketError.ToStringQ;
}
transferDoneFlag. S et();
});
// сбросить флаг, он будет установлен после обработки запроса
transferDoneFlag.Reset();
// отправить запрос на чтение
hostSocket.ReceiveFromAsync(socketEvenlArgs);
// приостановить поток, пока не будет получен ответ или не истечёт ]
transferDoneFlag.WaitOne(MESSAGE_TIMEOUT_MSECS);
// скопировать полученный текст в выходной параметр
result = message;
// вернуть результат запроса
// если запрос выполнился успешно, возвращается пустая строка
return response;
279
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
}
Этот метод похож на метод SendMessageUDP. Он будет
прослушивать указанный порт для получения ответа из сети. Однако,
теперь адрес удалённого узла указывается с помощью класса
IPEndPoint. Адрес конечной точки задаётся значением
IPAddress.Any, что соответствует любому адресу, т.е. программа
получит сообщение, отправленное на заданный порт с любого узла в
сети. Если нужно получать сообщения только от одного адреса, здесь
можно указать этот адрес.
Для получения сообщения с удалённого узла создаётся буфер, в котором
будут сохраняться байты полученного сообщения. Созданный буфер
указывается при вызове метода SetBuffer.
Также отличается код, который выполняется при завершении запроса.
После получения результата программа должна считать данные,
переданные удаленной системой. Как и раньше, метод возвращает
пустую строку при успешном выполнении запроса, и текст сообщения
об ошибке в случае неудачи.
Если запрос успешно считывает сообщение, оно должно быть
преобразовано из последовательности 8-битовых значений в тип
данных, с которым будет работать программа. Поскольку программа
работает с текстовыми сообщениями, для декодирования сообщения
используется класс Encoding для получения строки в кодировке UTF-
8. Последним действием обработчик событий устанавливает флаг для
обеспечения синхронизации потоков.
Созданный метод можно использовать так:
string receiveResponse;
string message;
receiveResponse = ReceiveMessageUDP(ECHO_PORT, out message);
Отправка дейтаграммы службе echo
2820
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Теперь можно создать код, который отправит сообщение службе echo.
Сначала нужно вызвать метод SendMessageUDP для отправки
сообщения службе, и затем вызвать ReceiveMessageUDP для
получения ответа.
string sendResponse = SendMessageUDP(MessageTextBox.Text, HostTextBox
ECHO_PORT);
if (sendResponse.Length == 0)
{
string receiveResponse;
string message;
receiveResponse = ReceiveMessageUDP(ECHO_PORT, out message);
if (receiveResponse.Length == 0)
{
ResponseTextBox.Text = message;
}
else
{
ErrorTextBox.Text = "Ошибка получения: ” + receiveResponse;
}
}
else
{
ErrorTextBox.Text = "Ошибка отправки: " + sendResponse;
}
Если метод SendMessageUDP возвращает пустую строку, это значит,
что сообщение отправлено успешно, и программа может вызвать метод
ReceiveMessageUDP, чтобы получить ответное сообщение от
службы echo.
Для проверки правильности работы программы необходима система, в
которой есть служба echo. Такая служба есть в операционной системе
Windows, но по умолчанию эта служба не устанавливается. Чтобы
использовать службу echo, нужно в панели управления выбрать пункт
Включение и отключение компонентов Windows и поставить галочку
напротив пункта Простые службы TCPIP (такие как echo, datetime
281
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
и т.п.). После этого можно либо перезагрузить компьютер, либо в
оснастке Службы запустить службу Простые службы TCP/IP. Описанная
последовательность действий работает в Windows 7, а в других версиях
Windows может отличаться некоторыми деталями.
После запуска службы можно отправлять ей сообщения, в ответ на
которые служба будет возвращать переданный текст. В качестве имени
удалённого узла нужно использовать имя компьютера. Кроме этого,
можно указать имя сервера в Интернете, который предоставляет службу
echo, если известны адреса таких серверов.
17.3. Создание подключения по протоколу TCP
Проблема использования протокола UDP заключается в том, что
система, которая передаёт информацию по этому протоколу, не знает,
принял ли эту информацию получатель. Если необходимо создать
надёжное подключение, нужно использовать протокол TCP.
Протокол TCP позволяет создавать сеансы подключения между двумя
устройствами. Сообщения создаются и передаются точно так же, как и
при использовании протокола UDP, но каждое сообщение является
частью сеанса. Сеанс будет продолжаться, пока одна из сторон не решит
его прекратить. Ответ, который передаётся после приёма сообщения,
позволяет программам определить, успешно ли было передано
сообщение. В конце сеанса одна из сторон закрывает подключение.
Рассмотрим процесс создания метода для запроса веб-страницы:
private string RequestWebPage(string url, string page, out string pageContent)
Этот метод принимает в качестве параметров адрес веб-сервера, имя
запрашиваемой страницы, и в третий параметр заносится содержимое
веб-страницы. Метод возвращает пустую строку, если запрос был
выполнен успешно, или описание ошибки, если запрос завершился
неудачей.
В Интернете используется протокол передачи гипертекста HTTP. Этот
протокол определяет язык, используемый браузером для запроса
страниц содержимого веб-сервера. Например, чтобы получить с сервера
282
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
веб-страницу, браузер отправляет команду GET и адрес веб-страницы на
сервере.
Поскольку важно, чтобы все части веб-страницы были доставлены
клиенту, протокол HTTP использует TCP-подключение. Для получения
веб-страницы программа должна выполнить следующие действия:
1. Создать TCP-подключение к веб-серверу, используя порт 80,
который зарезервирован для HTTP-запросов.
2. Отправить веб-серверу запрос GET, в котором указать нужную
страницу.
3. Получить содержимое запрошенной веб-страницы. Если страница
большая, может потребоваться несколько операций чтения.
4. Закрыть подключение.
Создание TCP-подключения
Подключение по протоколу TCP создаётся аналогично рассмотренному
ранее примеру.
private string ConnectTCP(string host, int port)
{
string response = "Истекло время ожидания";
DnsEndPoint hostEntry = new DnsEndPoint(host, port);
hostSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream,
ProtocolType.Tcp);
SocketAsyncEventArgs socketEventArgs = new SocketAsyncEventArgs();
socketEventArgs.RemoteEndPoint = hostEntry;
socketEventArgs.Completed += new EventHandler<SocketAsyncEventArgs>
(delegate(object s, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
response = "";
28225
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
}
else
{
// получить результат запроса
response = e.SocketError.ToStringQ;
// очистить параметры подключения
hostSocket = null;
}
transferDoneFlag. S et();
});
transferDoneFlag.Reset();
hostSocketConnectAsync(socketEventArgs);
transferDoneFlag.WaitOne(MESSAGE_TIMEOUT_MSECS);
return response;
}
В отличие от предыдущего примера, в этом методе вызывается метод
ConnectAsync класса Socket. Если этот метод выполнится
успешно, то он создаст настроенное TCP-подключение к удаленной
системе, с помощью которого можно будет отправлять и получать
сообщения, пока подключение не будет закрыто. Однако, подключение
создаётся для передачи только одной веб-страницы. Если пользователь
перейдёт на другую страницу, необходимо будет создать новое TCP-
подключение к другой странице.
Отправка сообщения через TCP-подключение
Далее нужно сформировать текст сообщения и отправить его через
созданное подключение:
private string SendMessageTCP(string message)
{
if (hostSocket == null)
return "Подключение не установлено";
284
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
string response = 'Тайм-аут подключения";
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
// использование параметров конечной точки для настройки передач]
socketEventArg.RemoteEndPoint = hostSocket.RemoteEndPoint;
byte[] messageBytes = Encoding.UTF8.GetBytes(message);
socketEventArg.SetBuffer(messageBytes, 0, messageBytes.Length);
socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>
(delegate(object s, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
response = "";
}
else
{
response = e.SocketError.ToStringQ;
CloseTCPO;
}
transferDoneFlag. S et();
});
transferDoneFlag.Reset();
hostSocket.SendAsync(socketEventArg);
transferDoneFlag.WaitOne(MESSAGE_TIMEOUT_MSECS);
return response;
}
Этот код почти такой же, как и для отправки сообщения по UDP-
подключению. Перед передачей сообщения проверяется, установлено
ли подключение.
285
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Если в процессе передачи произошла ошибка, подключение закрывается
методом CloseTCP:
void CloseTCP()
{
if (hostSocket != null)
{
hostSocket.Close();
hostSocket = null;
}
}
Получение сообщения через TCP-подключение
Для получения содержимого веб-страницы используется код, который
аналогичен получению сообщения через UDP-подключение:
private string ReceiveMessageTCP(out string message)
{
message = "";
if (hostSocket == null)
{
return "Подключение не установлено";
}
string response = "Тайм-аут подключения";
string result = "";
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgsQ;
socketEventArg.RemoteEndPoint = hostSocket.RemoteEndPoint;
// создания буфера для получения сообщения
byte[] responseBytes = new Byte[MAX_BUFFER_SIZE];
socketEventArg.SetBuffer(responseBytes, 0, MAX_BUFFER_SIZE);
socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>
(delegate(object s, SocketAsyncEventArgs e)
2 86
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
{
if (e.SocketError == SocketError.Success)
{
response =
if (e.BytesTransferred > 0)
{
result = Encoding.UTF8.GetString(e.Buffer, e.Offset,
e.BytesTransferred);
result = result.Trim('\0');
}
}
else
{
response = e.SocketError.ToStringQ;
}
transferDoneFlag. S et();
});
transferDoneFlag.Reset();
hostSocket.ReceiveAsync(socketEventArg);
transferDoneFlag.WaitOne(MESSAGE_TIMEOUT_MSECS);
message = result;
return response;
}
Эта версия метода проверяет, передал ли сервер какую-либо
информацию, и если да, то декодирует полученную информацию и
возвращает её в виде строки.
Создание запроса
Теперь можно использовать созданные методы для построения запроса
веб-страницы. Метод отправит запрос и получит содержимое веб¬
страницы. Об окончании передачи свидетельствует получение пустого
287
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
результата от метода ReceiveMessageTCP.
private string RequestWebPage(string url, string page, out string pageContent)
{
pageContent =
// создание подключения
string response = ConnectTCP(url, 80);
if (response != "")
{
return response;
}
// отправка запроса страницы с помощью HTTP-команды GET
response = SendMessageTCP("GET " + page + " HTTP/1.1\r\nHost: " + url +
"\r\nConnection: Close\r\n\r\n");
if (response != "")
{
CloseTCP();
return response;
}
string wholePage = "";
string fetchText;
// повторение получения пакетов от сервера
// до тех пор, пока метод не вернёт пустую строку
do
{
response = ReceiveMessageTCP(out fetchText);
if (response != "")
{
CloseTCP();
return response;
}
2828
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
wholePage += fetchText;
}
while (fetchText != "");
pageContent = wholePage;
CloseTCP();
return response;
}
Этот метод возвращает полный текст запрошенной веб-страницы. Если
какой-либо метод вернёт сообщение об ошибке, метод
RequestWebPage закроет TCP-подключение и завершит работу. Код
метода CloseTCP для закрытия подключения выглядит так:
void CloseTCP()
{
if (hostSocket != null)
{
hostSocket.Close();
hostSocket = null;
}
}
Если в приложении вызывать созданный метод при нажатии на кнопку,
то событие нажатия на кнопку не завершится до тех пор, пока не будет
получено всё содержимое страницы или сообщение об ошибке. При
этом, пользователь не сможет в это время выполнять другие действия.
Если необходимо разрешить пользователю параллельно выполнять
другую работу, рекомендуется выполнять загрузку страницы в
отдельном потоке.
17.4. Подключение к сетевому ресурсу
Часто программам приходится получать информацию из различных
сетевых ресурсов. Обычно это довольно утомительный процесс, но его
можно упростить, используя класс WebClient.
2829
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Класс WebClient является частью сетевой библиотеки^ЕХ которую
можно использовать как в программах для Windows Phone, так и в
программах для компьютеров под управлением Windows. Можно
использовать класс для взаимодействия с удалённым сервером по
протоколу HTTP.
Создадим простую программу, которая при нажатии на кнопку выведет
на экран код веб-страницы, адрес которой вводит пользователь в
текстовое поле. Фактически, аналогичное действие выполняют веб¬
браузеры, только последние обрабатывают код страницы и выводят её в
том виде, в каком её ожидает увидеть пользователь.
Сначала нужно объявить переменную типа WebClient в классе
MainPage. Эта переменная будет использоваться для управления веб¬
запросами, которые будут использоваться в программе. Экземпляр
класса WebClient создаётся в конструкторе страницы:
WebClient client;
public MainPage()
{
InitializeComponent();
client = new WebClient();
client.DownloadStringCompleted +=
new DownloadStringCompletedEventHandler(dient_DownloadStringComf
}
В конструкторе также создаётся обработчик события
DownloadStringCompleted, который выводит код веб-страницы в
визуальный элемент pageTextBlock, если загрузка веб-страницы
выполнилась успешно:
void client_DownloadStringCompleted(object sender, DownloadStringComplete
{
if (e.Error == null)
{
pageTextBlock.Text = e.Result;
}
290
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
}
Остаётся добавить в программу обработчик нажатия на кнопку, в
котором будет загружаться веб-страница, адрес которой ввёл
пользователь:
private void loadButton_Click(object sender, RoutedEventArgs e)
{
dient.DownloadStringAsync(new Uri(urlTextBox.Text));
}
При нажатии на кнопку выполняются следующие действия:
1. Строка, введённая в текстовое поле urlTextBox, используется
для создания URI требуемой веб-страницы.
2. Вызывается метод DownloadStringAsync класса
WebClient, который запускает новую веб-транзакцию, после
чего завершает свою работу и передаёт управление программе.
3. Через какое-то время класс WebClient считает содержимое
запрошенной веб-страницы и сгенерирует событие
DownloadStringCompleted, которое сигнализирует об
окончании приёма сообщения.
4. Событие вызовет метод-обработчик
client_DownloadStringCompleted, который проверит,
возникли ли при получении данных ошибки, и если нет —
выводит полученный код страницы в визуальный элемент
pageTextBlock.
17.5. Чтение данных из XML-потока с помощью LINQ
Приложения могут взаимодействовать с различными
информационными службами, например c Twitter, используя протокол
передачи состояния представления REST. REST использует URL для
указания необходимого действия. Например, если в браузере указать
адрес http://twitter.com/statuses/user_timeline/user_name.xml, будет выдан
XML-документ, который содержит новые сообщения пользователя
"user_name". Если заменить в этой строке "user_name" на имя
291
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
другого пользователя Twitter, будет выдана информация о сообщениях
этого пользователя.
Можно изменить программу, созданную в предыдущем примере, так,
чтобы она создавала запрос для Twitter и использовала его для
получения информации об указанном пользователе. Достаточно
изменить имя элемента текстового поля на nameTextBox (но можно
этого не делать — имя элемента несёт только смысловую нагрузку) и
изменить код метода loadButto n_C lick:
private void loadButton_Click(object sender, RoutedEventArgs e)
{
string url = 'http://twitter.com/statuses/user_timeline/" + nameTextBox.Text
+ ".xml";
client.DownloadStringAsync(new Uri(url));
}
Twitter предоставляет информацию о состоянии в формате XML. XML
представляет информацию в структурированном виде, и её можно
обработать и вывести на экран в удобном виде. Для обработки XML
можно использовать LINQ.
XML-документ похож на базу данных, в которой содержатся элементы и
атрибутами. Кроме инструментов для создания запросов к базе данных
и получения из них структурированной информации, LINQ также
содержит инструменты для создания объектов на основе данных XML.
Информация, полученная от Twitter, является структурированным XML-
документом, который содержит элементы и атрибуты, которые
описывают содержание сообщений Twitter:
< ?xml version= "1.0" encoding=' UTF -8"? >
<statuses type="array">
<status>
<created_at>Tue Oct 11 11:57:37 +0000 2011</created_at>
<id>27131245083</id>
<text>
Had 12,000 hits on www.csharpcourse.com for my C# Yellow Book. No i(
</text>
292
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
<source>web</source>
<truncated>false</tmncated>
<in_reply_to_status_id></in_reply_to_status_id>
<in_reply_to_user_id></in_reply_to_user_id>
<favorited>false</favorited>
<in_reply_to_screen_name></in_reply_to_screen_name>
<retweet_count>0</retweet_count>
<retweeted>false</retweeted>
<user>
<id>2479801</id>
<name>Rob Miles</name>
<screen_name>robmiles</screen_name>
<location>HuH, UK</location>
<description>A Computer Science lecturer and Microsoft MVP.</descriptio:
<profile_image_url>
http ://a3.twimg. ram/prof_im/157/me2_normaLjpg
</profile_image_url>
<url>http ://www.robmiles.com</url>
<protected>false</protected>
<friends_count>21</friends_count>
<created_at>Tue Mar 27 12:35:28 +0000 2007</created_at>
<favourites_count>0</favourites_count>
<utc_offset>0</utc_offset>
<time_zone >London</time_zone >
<profile_background_image_url>
http://s.twimg.com/a/1286/images/themes/theme1/bg.png
</profile_background_image_url>
<notifications>false</notifLcations>
<geo_enabled>true</geo_enabled>
<verified>false</verified>
<following>true</following>
<statuses_count>731</statuses_count>
<lang>en</lang>
<contributors_enabled>false</contributors_enabled>
<follow_request_sent>false</follow_request_sent>
<listed_count>61</listed_count>
<show_all_inline_media>false</show_all_inline_media>
</user>
<geo/>
293
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
<coordinates/>
<place/>
<contributors/>
</status>
</statuses>
В этой XML-структуре представлена небольшая часть информации,
которую выдаёт Twitter в виде XML-файла. В действительности, этот
файл бывает гораздо большего объёма.
С помощью LINQ можно создать запрос к базе данных, который
возвратит коллекцию найденных объектов, а можно создать
конструкцию, которая представляет содержание XML-документа:
XElement TwitterElement = XElementParse(twitterText);
Класс XElement является частью LINQ и представляет собой элемент
XML. Строка twitterText содержит информацию, полученную от
Twitter с помощью класса WebClient. Экземпляр класса XElement
позволяет сохранить эту информацию в виде структурированного
документа. Необходимо преобразовать эту информацию в форму,
удобную для вывода на экран.
Как было рассмотрено в предыдущих главах, можно создать классы C#
для хранения информации об объектах и применить привязку данных для
связи этих классов с визуальными элементами Silverlight. В эти классы
можно загружать данные как из базы данных, так и из XML-файла.
В нашем случае можно использовать не все элементы XML-структуры
сообщения Twitter, а только те, которые представляют интерес: фотографию
пользователя Twitter, который создал сообщение, дату и текст сообщения.
Класс, который содержит эту информацию, может выглядеть так:
public class TwitterPost
{
public string PostText { get; set; }
public string DatePosted { get; set; }
294
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
public string UserImage { get; set; }
}
Эти свойства будут содержать значения, полученные от Twitter, и
пользователь не будет их изменять. Обратите внимание, что свойство
UserImage имеет строковый тип и содержит URI изображения,
которое будет загружаться из Интернета.
Теперь необходимо использовать LINQ для получения коллекции
объектов из элемента XElement, который содержит всю информацию,
полученную от Twitter.
var postList = from tweet in twitterElements.Descendants("status')
select new TwitterPost
{
UserImage =
tweet.Element("user").Element("profile_image_url").Value,
PostText = tweet.Element("text").Value,
DatePosted = tweet.Element("created_at").Value
};
В этом коде в секции from выполняется перебор элементов с именем
<status>. Эти элементы программа обрабатывает по очереди. В секции
select для каждого элемента создаётся экземпляр класса TwitterPost,
и его свойствам присваиваются значения указанных XML-элементов,
вложенных в элемент <status>. Метод Element возвращает
содержимое XML-элемента с заданным именем.
Результат запроса заносится в переменную postList, которая
фактически будет являться коллекцией объектов класса TwitterPost.
Если применить запрос к XML-документу который был представлен
выше, то запрос создаст список из одного элемента. Однако, в общем
случае полученный список будет содержать несколько объектов.
Далее, необходимо вывести сообщения из списка на экран в виде,
удобном для чтения сообщений. Например, одно сообщение может
выглядеть так, как изображено на рис. 17.2.
295
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
И Wed Oct 13 21:42:34 +0000 2010
New btog post: http://
tinyurl.com/36<Jcxg6 - Hull Fair
2010
Рис. 17.2. Внешний вид сообщения, полученного из сети Twitter
Это изображение можно разделить на три блока: слева будет размещена
фотография пользователя, в верхней части — дата создания сообщения,
по центру — текст сообщения (рис. 17.3).
Рис. 17.3. Структура сообщения, полученного из сети Twitter
В Silverlight эту разметку можно выполнить, используя элементы-
контейнеры StackPanel:
<StackPanel Orientation="Horizontal" Height="132">
<Image Source="{Binding UserImage}" Height="73" Width="73" VerticalAlign
Margin="0,10,8,0"/>
<StackPanel Width="370">
<TextBlock Text="{Binding DatePosted}" Foreground="#FFC8AB14" FontS
<TextBlock Text="{Binding PostText}" TextWrapping="Wrap" FontSize="24'
</StackPanel>
</StackPanel>
Класс StackPanel позволяет автоматически располагать и
выравнивать элементы на странице программы. В этом коде
используется привязка данных, которая связывает элементы со
свойствами класса TwitterPost.
Полученную разметку необходимо указать в качестве шаблона разметки
элементов списка ListBox:
2 96
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
<ListBox Height="442" HorizontalAlignment="Left" Name="tweetsListBox"
Vertica]Alignment='Top" Width="468">
<ListBox. ItemTemplate >
<DataTemplate>
<StackPanel Orientation="Horizontal" Height="132">
<Image Source="{Binding Userlmage}" Height="73" Width="73"
VerticalAignment= "Top" Margin= "0,10,8,0"/>
<StackPanel Width="370">
<TextBlock Text="{Binding DatePosted}" Foreground="#FFC8AB14"
FontSize="22" />
<TextBlock Text="{Binding PostText}" TextWrapping="Wrap" FontSize=
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox. ItemTemplate >
</ListBox>
После этого остаётся только указать переменную postList, в которой
хранятся сообщения из Twitter, в качестве источника данных для списка
ListBox:
tweetsListBox.ItemsSource = postList;
Элемент ListBox предоставляет много полезных функций. В
частности, он поддерживает автоматическое добавление прокрутки
элементов списка вверх и вниз с её ускорением и остановкой пальцем.
17.6. Взаимодействие приложений с сетевыми
службами
Приложения для Windows Phone могут взаимодействовать с веб¬
серверами, используя протоколы Интернета. Также можно создавать
сетевые службы и использовать их в устройствах Windows Phone.
Службы Windows Communication Foundation, или WCF, предоставляют
возможность процессам взаимодействовать друг с другом по сети.
Процессы могут обмениваться сообщениями по сети, используя
различные сетевые среды. Службы работают на сервере, к которому
297
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
могут получать доступ клиентские программы. В нашем случае
клиентская программа будет работать в Windows Phone.
На рис. 17.4 представлен принцип взаимодействия программы с
сетевой службой. Программное обеспечение телефона взаимодействует
с прокси-объектом, который содержит методы, предоставляемые
службой. Вызов метода прокси-объекта приводит к созданию и оправке
сетевого сообщения службе на сервере. При получении сообщения
сервер вызывает код метода серверного объекта. Результат,
возвращаемый методом, упаковывается в другое сетевое сообщение,
которое отправляется клиенту, который пересылает возвращаемое
значение программе, которая вызвала этот метод. При этом, система
выполняет всю работу по созданию и передаче сообщений. Необходимо
только создать серверные методы и вызывать их на клиентской системе.
Рис. 17.4. Взаимодействие программы для Windows Phone с сетевой
службой
Также служба предоставляет описание её методов. Это описание
использует среда разработки (в нашем случае — Visual Studio) для
создания прокси-объекта в клиентской программе. Это упрощает
создание клиентского приложения.
Рассмотрим пример создания службы Новость дня, которая будет
возвращать одну из новостей по запросу клиента. Клиент должен
передать в качестве параметра цифру 1, 2 или 3, которая, для удобства,
будет обозначать категорию новостей.
Приложение будет состоять из двух частей: программа на сервере,
которая экспортирует службу, и программа на клиенте, которая её
298
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
использует. Сервер будет службой WCF, а клиент — приложением для
Windows Phone, которое подключается к службе и запрашивает новость.
Для создания службы WCF нужно при создании проекта Visual Studio
выбрать шаблон Приложение службы WCF в группе WCF. Службу
можно тестировать в среде Visual Studio. После тестирования файлы
проекта можно будет загрузить на рабочий сервер. Обратите внимание,
что службу можно создать в Visual Web Developer 2010 Express.
Службы и клиенты
Службы и клиенты похожи на методы. При создании сервера создаётся
метод, который выполняет какие-то действия и возвращает результат.
Клиента вызывает метод сервера и обрабатывает результат. При этом,
служба WCF выполняет все необходимые действия по упаковке
параметров и возвращаемого значения метода в сетевые сообщения.
При создании проекта службы в файле .cs создаётся интерфейс, который
определяет предоставляемый службой метод:
[ServiceContract]
public interface INewsOfTheDayService
{
[OperationC ontract]
string GetData(int value);
}
В общем случае, служба может предоставить несколько методов, но в
нашем примере достаточно одного метода. Этот метод принимает один
параметр и возвращает результат. Также при создании службы будут
автоматически созданы метод GetDataUsingDataContract и
класс CompositeType, которые являются примерами использования
сложных типов данных в службах, и их можно удалить.
После создания интерфейса можно создать код метода, который будет
предоставлять служба. Заготовка метода создаётся по умолчанию в
файле службы с расширением .svc, с которым связан одноимённый файл
.cs. Атрибуты [ServiceContract] и [OperationContract]
предоставляют средства для создания описания службы при
299
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
построении проекта, которые будут использоваться клиентами для
взаимодействия с этими службами.
public class NewsOfTheDayService : INewsOfTheDayService
{
public string GetData(int value)
{
string result;
switch (value)
{
// категория "Компьютеры"
case 1:
result = "Intel Xeon E5-2600: "облачные" процессоры ставят реке
break;
// категория "Программное обеспечение"
case 2:
result =
"Вышла в свет ОС Windows 8 Consumer Preview";
break;
// категория "Мобильные устройства"
case 3:
result =
"Nokia выпускает новые телефоны с ОС Windows Phone 7.5 ]
break;
// если указан неверный номер категории
default:
result = "Выбрана несуществующая категория";
break;
}
return result;
}
}
Этот метод возвращает строку с новостью в соответствии с
запрошенной категорией. Если будет передан номер несуществующей
категории, будет выдано сообщение об ошибке.
300
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Если попытаться запустить проект, нажав клавишу F5 (или другим
способом), Visual Studio создаст веб-сервер, на котором будет запущена
служба, и откроется окно программы Тестовый клиент WCF, в котором
можно вызвать метод службы с различными параметрами и
просмотреть результаты, которые метод возвращает (рис. 17.5).
Рис. 17.5. . Окно программы Тестовый клиент WCF
Также можно просмотреть описание службы в браузере, указав URL
службы, который можно найти в окне программы Тестовый клиент WCF
(рис. 17.6).
301
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 17.6. Страница службы, открытая в браузере
В окне браузера выводится ссылка на описание службы на языке WSDL
и программный код, который можно использовать для создания
приложения для тестирования службы.
Создание клиентского приложения
Для того чтобы создать приложение Windows Phone, которое будет
работать с созданной службой, нужно создать новый проект.
302
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Клиентское приложение должно подключаться к службе
NewsOfTheDayService. Ссылка на службу добавляется в проект так
же, как и ссылка на ресурс, только в контекстном меню в окне
обозревателя решений нужно выбрать пункт Добавить ссылку на
службу.... Откроется диалоговое окно Добавить ссылку на службу, в
котором нужно указать URL запущенной службы. Visual Studio найдёт
описание службы и все предоставляемые ею методы. Также можно
изменить пространство имён по умолчанию, которое будет
использоваться в создаваемом приложении, на
NewsOfTheDayService.
После добавления ссылки на службу её можно использовать в решении.
Теперь необходимо создать прокси-объект, который будет
использоваться для вызова методов службы. Лучше сделать это в
конструкторе главной страницы приложения:
N ewsO fTheDayS ervice.N ewsO fTheDayS erviceClient newsclient;
// Конструктор
public MainPageO
{
InitializeComponentO;
newsclient = new NewsOfTheDayService.NewsOfTheDayServiceClientO;
newsclient.GetDataCompleted +=
new EventHandler<NewsO fTheDayS ervice. GetDataC ompletedEventArgs>
(newsclient_GetDataCompleted);
}
Этот код создаёт прокси-объект для службы и связывает метод-
обработчик с событием GetDataCompleted, которое происходит
при получении ответа от службы. Вызов метода службы выполняется
асинхронно. Метод-обработчик должен выводить на экран полученную
новость:
void newsclient_GetDataCompleted(object sender,
N ewsO fTheDayS ervice. GetDataC ompletedEventArgs e)
{
303
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
if (!e.Cancelled)
{
newsTextBlock.Text = e.Result;
}
}
Этот метод проверяет, успешно ли завершился вызов метода службы, и
если да, то выводит полученный результат экран.
После этого необходимо создать обработчик события нажатия на кнопку,
в котором будет вызываться метод WCF для обращения к серверу:
private void getNewsButton_Click(object sender, RontedEventArgs e)
{
int category = 0;
if (int.TryParse(newsTextBox.Text, out category))
{
newsclient. GetDataAsync(category);
}
}
Этот метод получает номер категории новости и передаёт его в качестве
параметра при вызове метода GetDataAsync. Если текст в поле
newsTextBox не может быть преобразован в целое число, метод
TryParse вернёт значение false.
Если служба будет недоступна, при вызове метода GetDataAsync
будет сгенерировано исключение. Это может произойти, если во время
выполнения программы в телефоне сигнал сети не будет доступен. В
приложениях для Windows Phone необходимо обрабатывать исключения
в блоке try—catch и выдавать пользователю сообщение о
недоступности сети.
Приложение при необходимости может взаимодействовать сразу с
несколькими удалёнными службами. В этом случае для каждой службы
добавляются ссылки в проект приложения, и работа с ними
организуется точно таким же образом, что и в рассмотренном примере.
30-4
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Краткие итоги
1. Компьютерные сети предоставляют возможность отправки
сообщений из одной системы в другую. Устройства могут
объединяться в локальную сеть. В локальной сети может быть
маршрутизатор, который отправляет пакеты из локальной сети
удалённым узлах. Маршрутизаторы являются устройствами
передачи данных, которые позволяют создавать межсетевые
подключения.
2. Полный адрес системы в сети содержит адрес этой станции в её
локальной сети и адрес этой сети в Интернете.
3. Данные могут передаваться между системами в виде отдельных
дейтаграмм (UDP) или как часть подключения между двумя
системами (TCP).
4. К различным службам системы можно обращаться, указав номер
порта, на котором работает требуемая служба. Некоторые номера
портов зарезервированы и являются общепринятыми, например
веб-сервер обычно работает на порту с номером 80.
5. Приложения Windows Phone могут создавать и использовать
объекты, которые представляют подключение к сетевой службе.
Эти объекты работают в асинхронном режиме, при котором
сетевые операции выполняются в отдельном потоке. Результаты
асинхронного запроса обрабатываются при наступлении события
окончания выполнения запроса без необходимости ожидания
завершения запроса в программе.
6. Сокеты являются абстракцией сетевого подключения.
7. Некоторые сетевые вызовы могут возвращать структурированные
данные, которые содержат XML-описание содержимого.
8. Библиотеки LINQ могут создавать динамические объекты для
представления структурированных данных и их использования в
программе.
9. Технология Windows Communication Foundation (WCF)
предоставляет возможность настроить сервер так, чтобы можно
было вызывать их методы в клиентских приложениях.
10. Клиентское приложение может прочитать описание службы,
которое предоставляет сервер WCF, и использовать его для
создания прокси-объекта, который содержит методы,
предоставляемые службой. При вызове в клиентском коде метод
305
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
прокси-объекта запускается сетевая операция, которая передаёт
параметры метода на сервер. Затем вызывается метод сервера, и
сетевая операция возвращает результат коду, который вызвал
серверный метод.
Ключевые термины
IP-адрес — уникальный сетевой адрес узла в компьютерной сети,
построенной по протоколу IP.
Windows Communication Foundation — технология компании Microsoft,
основанная на .NET Framework, которая используется для обмена
данными между приложениями, находящихся обычно на разных
устройствах.
Асинхронное подключение — тип подключения, которое работает
паралллельно с основной программой и обычно обрабатывается в
отдельном потоке.
Брандмауэр — комплекс аппаратных или программных средств,
осуществляющий контроль и фильтрацию проходящих через него
сетевых пакетов в соответствии с заданными правилами.
Дейтаграмма — блок информации, посланный как пакет сетевого
уровня через передающую среду без предварительного установления
соединения и создания виртуального канала.
Конечная точка подключения — удалённый узел, к которому
подключается программа на текущем узле.
Маршрутизация — процесс определения маршрута следования
информации в сетях связи.
Октетами — наименьшая единица информации, которая может быть
передана по сети, равняется 8 битам.
Порт — условный номер, который соответствует программе или
службе, которая может принимать входящие сообщения из
компьютерной сети. В рамках одного устройства каждая подключенная к
сети программа или служба должна иметь уникальный номер порта.
30(5
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Сетевой маршрутизатор — сетевое устройство, пересылающее пакеты
данных между различными сегментами сети.
Сетевой протокол — набор соглашений, которые определяют, как
происходит обмен данными между устройствами в сети.
Сетевые сигналы — носитель информации, которая передаётся через
компьютеную сеть.
Система доменных имён — компьютерная распределённая система для
получения информации о доменах, позволяет связать имя узла с его IP-
адресом.
Широковещательный адрес — условный адрес, который используется
для передачи широковещательных пакетов в компьютерных сетях.
Широковещательный адрес не может быть присвоен какому-либо узлу
сети.
Вопросы
1. Какие типы подключений к сети доступны в Windows Phone?
2. Какие образом данные передаются по сети?
3. Для чего используется система доменных имён?
4. Каким образом несколько взаимодействующих с сетью служб
могут работать на одном сервере только с теми сообщениями,
которые для них предназначены?
5. В чём отличие сеансов подключений от дейтаграмм?
6. Для чего используется класс Socket?
7. Как в программе можно создать подключение по протоколу UDP?
8. Как в программе можно создать подключение по протоколу TCP?
9. Для чего используется класс WebClient?
10. Как получить необходимые данные из XML-структуры с помощью
LINQ?
11. Для чего предназначена технология Windows Communication
Foundation?
12. Как создать службу WCF ?
13. Как создать приложение для Windows Phone для использования
методов службы WCF?
307
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Упражнения
Для выполнения упражнений необходимо работающее сетевое
подключение, а также среда Visual Studio для создания службы WCF.
Упражнение 1. Создание службы TimeTracker
В этом упражнении вы создадите службу, которая получает и хранит
отчёты о встречах, получаемые от приложения
TimeTrackerClient, работающего на удалённом устройстве.
Служба будет предоставлять два метода: один — для получения отчётов
о встречах, другой — для предоставления отчётов о встречах.
Создание службы
1. Откройте Visual Studio.
2. Выберите в главном меню пункт Файл -> Создать проект.
Откроется диалоговое окно Создать проект.
3. В списке Установленные шаблоны выберите в группе WCF
шаблон Приложение службы WCF.
4. Назовите проект TimeTrackerService и нажмите OK, чтобы
создать проект. Visual Studio создаст новый проект и откроет файл
Service1.svc.cs.
5. Задайте службе и её интерфейсу более удобные имена. Для этого
выберите в обозревателе решений файл IService1.cs, нажмите F2 и
введите новое имя ITimeTrackerService.cs. При нажатии клавиши
Enter Visual Studio предложит переименовать интерфейс и все
ссылки на него, чтобы его имя соответствовало новому имени
файла. Нажмите OK для подтверждения.
6. Аналогичным образом переименуйте файл службы от Service1.svc
в TimeTrackerService.svc.
7. Откройте файл TimeTrackerService.svc.cs и щёлкните правой
кнопкой по названию класса Servicel. В контекстном меню
выберите пункт Рефакторинг -> Переименовать..., укажите в
открывшемся окне новое имя класса TimeTrackerService и
подтвердите переименование.
Создание интерфейсов методов службы
308
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Наша служба будет содержать два метода: один метод будет использовать
удалённый клиент для сохранения отчёта о встрече, а другой будет
возвращать список сохранённых встреч. Visual Studio автоматически
создаёт некоторые методы, которые мы удалим из проекта.
1. Откройте файл ITimeTrackerServlce.cs. Он содержит интерфейс,
который описывает методы, предоставляемые службой.
2. Удалите весь код внутри интерфейса и добавьте следующее
описание методов:
[OperationC ontract]
void SaveSession(string employeeName, string companyName, int startHc
int endHour, int endMin);
[OperationContract]
string GetSessionListO;
3. Удалите описание класса CompositeType.
Создание методов службы
1. Откройте файл TimeTrackerService.svc.cs.
2. Удалите всё содержимое класса TimeTrackerService и
добавьте в него следующий код:
class Session
{
public string EmployeeName { get; set; }
public string CompanyName { get; set; }
public int StartHour { get; set; }
public int StartMin { get; set; }
public int EndHour { get; set; }
public int EndMin { get; set; }
public override string ToStringQ
{
return EmployeeName + ” ” + CompanyName;
}
}
309
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
static List<Session> sessions = new List<Session>();
Этот класс будет хранить информацию о каждой встрече, а также
содержит список встреч, который будет формироваться во время
работы службы. В реальном приложении этот список должен
заполняться информацией из базы данных.
3. Добавьте в класс TimeTrackerService следующие методы:
public void SaveSession(string employeeName, string companyName,
int startHour, int startMin, int endHour, int endMin)
{
sessions.Add(new Session
{
EmployeeName = employeeName,
CompanyName = companyName,
StartHour = startHour,
StartMin = startMin,
EndHour = endHour,
EndMin = endMin
});
}
public string GetSessionList()
{
StringBuilder result = new StringBuilder();
for (int i = 0; i < sessions.Count; i++)
{
result.AppendLine(sessions[i].ToStringO);
}
return result.ToStringO;
}
Метод SaveSession сохраняет информацию о сеансе на сервере.
Метод GetSessionList возвращает сохранённую информацию о
встречах в виде многострочного текста.
Развёртывание службы
310
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
1. Выберите в обозревателе решений файл TimeTrackerService.svc и
нажмите F5 для запуска проекта. После построения решения
откроется окно тестового клиента WCF.
2. Дважды щёлкните мышью по методу SaveSession () . Введите
следующие значения параметров метода:
° employeeName — Test Employee
0 companyName — Test Company
0 startHour — 1
° startMin — 2
° endHour—3
° endMin — 4
3. Нажмите на кнопку Вызвать, чтобы вызвать метод службы с
указанными параметрами. Метод вернёт пустое значение.
4. Дважды щёлкните мышью по методу GetSessionList() и
нажмите на кнопку Вызвать. Метод вернёт строку,
соответствующую встрече, добавленной в систему при вызове
метода SaveSession.
5. Нажмите клавиши Shift + F5 для остановки службы.
6. В обозревателе решений щёлкните правой кнопкой мыши по
файлу TimeTrackerService.svc и выберите в контекстом меню пункт
Просмотр в обозревателе. Обратите внимание на URL службы в
адресной строке браузера — это значение понадобится для
подключения к службе клиента:
http://localhost:30975/TimeTrackerService.svc
В вашем случае номер порта может отличаться, поскольку Visual
Studio генерирует его автоматически.
7. Закройте браузер и запустите службу в Visual Studio ещё раз.
Запущенная служба будет использоваться в следующем
упражнении.
Упражнение 2. Создание клиента службы
В этом упражнении мы создадим приложение, которое будет
подключаться к созданной в предыдущем упражнении службе и
использовать её методы.
Подключение клиентского приложения к службе
311
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
1. Убедитесь в том, что созданная в предыдущем упражнении
служба запущена.
2. Запустите другую копию Visual Studio и откройте в ней проект
TimeTrackerClient в папке Lab6 TimeTrackerClient. В текстовые поля
пользователь может ввести имя сотрудника, название компании, с
которой проводится встреча, а также время начала и окончания
встречи. При нажатии на кнопку сохранить, программа должна
сохранить информацию о встрече на сервере, и при нажатии на
кнопку список встреч — вывести информацио о встречах,
полученную от службы.
3. В обозревателе решений щёлкните правой кнопкой мыши по
элементу Ссылки и выберите пункт Добавить ссылку на службу....
4. В открывшемся диалоговом окне Добавить ссылку на службу в
поле Адрес введите URL службы, полученный в предыдущем
упражнении в результате запуска службы, и нажмите кнопку
Перейти. Visual Studio загрузит описание службы с сервера и
выведет на экран информацию о службе.
5. Откройте описание службы, щёлкнув по стрелке слева от её
имени, и выберите имя интерфейса ITimeTrackerService. В
поле операции будут отображены имена двух созданных методов
службы.
6. Измените пространство имён на TimeTrackerService и
нажмите кнопку OK. Visual Studio добавит в проект ссылку на
службу.
7. Щёлкните правой кнопкой мыши по созданной ссылке на службу
TimeTrackerService и выберите пункт Настроить ссылку на
службу..
8. В открывшемся диалоговом окне снимите галочку Повторно
использовать типы в сборках, на которые есть ссылки и нажмите
OK.
Использование метода службы SaveSession в приложении
1. Откройте файл MainPage.xaml.cs.
2. Добавьте в начало объявления класса следующую строку:
private TimeTrackerService.TimeTrackerServiceClient timeTracker;
3. Добавьте в конструктор класса после вызова метода
312
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
InitializeComponent следующий код для создания
связанного со службой объекта и обработчиков событий службы
(для создания обработчиков событий можно использовать
Intellisense — в этом случае автоматически будет создана
большая часть кода):
timeTracker = new TmeTrackerService.TmeTrackerServiceClientQ;
timeTracker.SaveSessionCompleted +=
new EventHandler<System.ComponentModeLAsyncCompletedEventA
timeTracker_S ave SessionC ompleted);
timeTracker.GetSessionListCompleted +=
new EventHandler<TimeTrackerS ervice. GetSessionListC ompletedEver
timeTracker_GetSessionListC ompleted);
4. Добавьте код метода saveButton_Click для асинхронного
вызова метода службы и передачи введённых пользователем
значений:
private void saveButton_Click(object sender, RoutedEventArgs e)
{
int startHour, startMin, endHour, endMin;
if (int.TryParse(staitHourTextBox.Text, out startHour) &&
int.TryParse(startMinTextBox.Text, out startMin) &&
int.TryParse(endHourTextBox.Text, out endHour) &&
int.TryParse(endMinTextBox.Text, out endMin))
{
timeTracker.SaveSessionAsync(employeeNameTextBox.Text,
companyNameTextBox.Text, startHour, startMin, endHour, endM
}
}
5. Добавьте код метода-обработчика
timeTracker_SaveSessionCompleted, который будет
вызываться при завершении выполнения метода службы:
void timeTracker_SaveSessionCompleted(object sender,
313
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
System.ComponentModel.AsyncCompletedEventArgs e)
{
if (!e.Cancelled)
{
employeeNameTextBox.Text = 'Введите имя сотрудника...";
companyNameTextBox.Text = "Введите название компании...";
}
}
Если метод службы выполнится успешно, то текст в текстовых полях
приложения будет изменён на первоначальный.
Тестирование метода SaveSession
1. Нажмите F5, чтобы запустить программу в эмуляторе.
2. Введите в текстовые поля информацию о встрече и нажмите на
кнопку сохранить. Текст в текстовых полях должен измениться на
первоначальный.
3. Таким же образом добавьте информацию о второй встрече.
4. Остановите выполнение программы.
Использование метода службы GetSessionList
1. Добавьте в приложение код метода listButton_click для
вызова метода службы:
private void listButton_Click(object sender, RoutedEventArgs e)
{
timeTracker.GetSessionListAsync();
}
2. Добавьте в приложение код метода
timeTracker_GetSessionListCompleted для вывода на
экран результата выполнения метода службы:
void timeTracker_GetSessionListCompleted(object sender,
TimeTrackerS ervice. GetSessionListC ompletedEventArgs e)
{
if (!e.Cancelled)
314
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
{
sessionsTextBlock.Text = e.Result;
}
}
3. Запустите программу и нажмите кнопку список встреч. На экран
будет выведена информация о двух введённых встречах.
315
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Использование сетевых ресурсов в приложении
Цель работы: изучение возможностей создания служб WCF и их
использования в приложениях для Windows Phone.
Основные теоретические сведения
Приложения для Windows Phone могут взаимодействовать с веб¬
серверами, используя протоколы Интернета. Также можно создавать
сетевые службы и использовать их в устройствах Windows Phone.
Службы Windows Communication Foundation, или WCF, предоставляют
возможность процессам взаимодействовать друг с другом по сети.
Процессы могут обмениваться сообщениями по сети, используя
различные сетевые среды. Службы работают на сервере, к которому
могут получать доступ клиентские программы. В нашем случае
клиентская программа будет работать в Windows Phone.
На рисунке представлен принцип взаимодействия программы с сетевой
службой. Программное обеспечение телефона взаимодействует с
прокси-объектом, который содержит методы, предоставляемые
службой. Вызов метода прокси-объекта приводит к созданию и оправке
сетевого сообщения службе на сервере. При получении сообщения
сервер вызывает код метода серверного объекта. Результат,
возвращаемый методом, упаковывается в другое сетевое сообщение,
которое отправляется клиенту, который пересылает возвращаемое
значение программе, которая вызвала этот метод. При этом, система
выполняет всю работу по созданию и передаче сообщений. Необходимо
только создать серверные методы и вызывать их на клиентской системе.
316
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Рис. 18.1. Взаимодействие программы для Windows Phone с сетевой
службой
Также служба предоставляет описание её методов. Это описание
использует среда разработки (в нашем случае — Visual Studio) для
создания прокси-объекта в клиентской программе. Это упрощает
создание клиентского приложения.
Рассмотрим пример создания службы Новость дня, которая будет
возвращать одну из новостей по запросу клиента. Клиент должен
передать в качестве параметра цифру 1, 2 или 3, которая, для удобства,
будет обозначать категорию новостей.
Приложение будет состоять из двух частей: программа на сервере,
которая экспортирует службу, и программа на клиенте, которая её
использует. Сервер будет службой WCF, а клиент — приложением для
Windows Phone, которое подключается к службе и запрашивает новость.
Для создания службы WCF нужно при создании проекта Visual Studio
выбрать шаблон Приложение службы WCF в группе WCF. Службу
можно тестировать в среде Visual Studio. После тестирования файлы
проекта можно будет загрузить на рабочий сервер. Обратите внимание,
что службу можно создать в Visual Web Developer 2010 Express.
Службы и клиенты похожи на методы. При создании сервера создаётся
метод, который выполняет какие-то действия и возвращает результат.
Клиента вызывает метод сервера и обрабатывает результат. При этом,
служба WCF выполняет все необходимые действия по упаковке
параметров и возвращаемого значения метода в сетевые сообщения.
При создании проекта службы в файле .cs создаётся интерфейс, который
определяет предоставляемый службой метод:
[ServiceContract]
public interface INewsOfTheDayService
{
[OperationC ontract]
string GetData(int value);
}
В общем случае, служба может предоставить несколько методов, но в
317
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
нашем примере достаточно одного метода. Этот метод принимает один
параметр и возвращает результат. Также при создании службы будут
автоматически созданы метод GetDataUsingDataContract и
класс CompositeType, которые являются примерами использования
сложных типов данных в службах, и их можно удалить.
После создания интерфейса можно создать код метода, который будет
предоставлять служба. Заготовка метода создаётся по умолчанию в
файле службы с расширением .svc, с которым связан одноимённый файл
.cs. Атрибуты [ServiceContract] и [OperationContract]
предоставляют средства для создания описания службы при
построении проекта, которые будут использоваться клиентами для
взаимодействия с этими службами.
public class NewsOfTheDayService : INewsOfTheDayService
{
public string GetData(int value)
{
string result;
switch (value)
{
// категория "Компьютеры"
case 1:
result = "Intel Xeon E5-2600: "облачные" процессоры ставят реке
break;
// категория "Программное обеспечение"
case 2:
result =
"Вышла в свет ОС Windows 8 Consumer Preview";
break;
// категория "Мобильные устройства"
case 3:
result =
"Nokia выпускает новые телефоны с ОС Windows Phone 7.5 ]
break;
// если указан неверный номер категории
318
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
default:
result = "Выбрана несуществующая категория";
break;
}
return result;
}
}
Этот метод возвращает строку с новостью в соответствии с
запрошенной категорией. Если будет передан номер несуществующей
категории, будет выдано сообщение об ошибке.
Если попытаться запустить проект, Visual Studio создаст веб-сервер, на
котором будет запущена служба, и откроется окно программы Тестовый
клиент WCF, в котором можно вызвать метод службы с различными
параметрами и просмотреть результаты, которые метод возвращает.
Рис. 18.2. Окно программы Тестовый клиент WCF
Создание клиентского приложения
Для того чтобы создать приложение Windows Phone, которое будет
319
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
работать с созданной службой, нужно создать новый проект.
Клиентское приложение должно подключаться к службе
NewsOfTheDayService. Ссылка на службу добавляется в проект так
же, как и ссылка на ресурс, только в контекстном меню в окне
обозревателя решений нужно выбрать пункт Добавить ссылку на
службу.... Откроется диалоговое окно Добавить ссылку на службу, в
котором нужно указать URL запущенной службы. Visual Studio найдёт
описание службы и все предоставляемые ею методы. Также можно
изменить пространство имён по умолчанию, которое будет
использоваться в создаваемом приложении, на
NewsOfTheDayService.
После добавления ссылки на службу её можно использовать в решении.
Теперь необходимо создать прокси-объект, который будет
использоваться для вызова методов службы. Лучше сделать это в
конструкторе главной страницы приложения:
N ewsO fTheDayS ervice.N ewsO fTheDayS erviceClient newsclient;
// Конструктор
public MainPageO
{
InitializeComponentO;
newsclient = new NewsOfTheDayService.NewsOfTheDayServiceClientO;
newsclient.GetDataCompleted +=
new EventHandler<NewsO fTheDayS ervice. GetDataC ompletedEventArgs>
(newsclient_GetDataCompleted);
}
Этот код создаёт прокси-объект для службы и связывает метод-
обработчик с событием GetDataCompleted, которое происходит
при получении ответа от службы. Вызов метода службы выполняется
асинхронно. Метод-обработчик должен выводить на экран полученную
новость:
void newsclient_GetDataCompleted(object sender,
N ewsO fTheDayS ervice. GetDataC ompletedEventArgs e)
320
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
{
if (!e.Cancelled)
{
newsTextBlock.Text = e.Result;
}
}
Этот метод проверяет, успешно ли завершился вызов метода службы, и
если да, то выводит полученный результат экран.
После этого необходимо создать обработчик события нажатия на кнопку,
в котором будет вызываться метод WCF для обращения к серверу:
private void getNewsButton_Click(object sender, RontedEventArgs e)
{
int category = 0;
if (int.TryParse(newsTextBox.Text, out category))
{
newsclient. GetDataAsync(category);
}
}
Этот метод получает номер категории новости и передаёт его в качестве
параметра при вызове метода GetDataAsync. Если текст в поле
newsTextBox не может быть преобразован в целое число, метод
TryParse вернёт значение false.
Если служба будет недоступна, при вызове метода GetDataAsync
будет сгенерировано исключение. Это может произойти, если во время
выполнения программы в телефоне сигнал сети не будет доступен. В
приложениях для Windows Phone необходимо обрабатывать исключения
в блоке try—catch и выдавать пользователю сообщение о
недоступности сети.
Приложение при необходимости может взаимодействовать сразу с
несколькими удалёнными службами. В этом случае для каждой службы
добавляются ссылки в проект приложения, и работа с ними
организуется точно таким же образом, что и в рассмотренном примере.
321
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Дополнительные материалы
Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/bb907578.
Задание к работе
1. Создайте в Visual Studio проект службы WCF, которая
предоставляет 2—3 метода, и запустите её.
2. Создайте в Visual Studio проект программы Silverlight для Windows
Phone для вызова методов службы и вывода на экран полученных
результатов.
3. Запустите программу и проверьте правильность её работы.
4. Составьте отчёт о проделанной работе. Включите в отчёт
необходимые листинги программы и службы.
322
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Создание приложений XNA
Технология XNA предназначена для создания игр. Она предоставляет
необходимые средства для разработки игр, включая управление
содержимым (звуковые эффекты, карты и текстуры для игры), и процесс
сборки игр (объединение всех элементов в единый распространяемый
игровой файл). В этой главе в ы познакомитесь с основными
принципами разработки игр и графических приложений, основанных на
технологии XNA. Цель: изучение принципов создания приложений на
основе технологии XNA.
Презентацию к данной главе Вы можете скачать здесь - h ttp://
old.intuit.ru/department/se/devmobwphn/19/07.pptx.
19.1. Основные сведения о технологии XNA
Технология XNA является библиотекой объектов C#, которая
используется для создания игровых программ. XNA позволяет
разработчикам игр использовать C# для создания
высокопроизводительных игр для различных платформ, включая
компьютеры под управлением Windows, Xbox 360 и Windows Phone.
При грамотном проектировании структуры программы возможно
повторное использование большой части кода для портирования игр под
эти три платформы.
Игры могут быть двухмерными (2D) (изображения, представленные в
одной плоскости), или трёхмерными (3D) ( визуальное моделирование
трёхмерной окружающей среды). XNA позволяет создавать игры обоих
типов, и аппаратное ускорение Windows Phone способствует
реалистичному изображению трёхмерных игровых миров. В этой главе
мы ограничимся рассмотрением 2D игр, основанных на спрайтах.
При создании проекта приложения для Windows Phone можно выбрать
тип приложения: Silverlight или XNA. Visual Studio использует
соответствующий шаблон и создаёт решение с необходимыми
элементами для создания программы. Шаблоны для создания
приложений XNA собраны в группу XNA Game Studio 4.0 в диалоговом
окне Создание нового проекта. Здесь представлены шаблоны для
323
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
создания игр XNA для Windows Phone и Xbox 360. Также можно
использовать существующий проект XNA для одной платформы в
качестве основы приложения для другой платформы.
Решение XNA похоже на решение Silverlight, но между ними есть
некоторые различия. В решении XNA создаётся два проекта, из которых
один предназначен для хранения игрового контента. Им управляет
контент-менеджер, который предоставляет набор входных фильтров для
различных типов ресурсов, например изображения PNG, звуковые
файлы WAV и т.д. Эти ресурсы хранятся в проекте и являются частью
игры для целевой платформы. При загрузке игры контент-менеджер
загружает эти ресурсы для использования в игре. В результате,
независимо от целевой платформы управление контентом выполняется
одинаково.
Необходимо учитывать, что экран Windows Phone имеет меньший размер
по сравнению с компьютером и платформой Xbox 360. Максимальное
разрешение игры для Windows Phone составляет 800x480 пикселей.
Чтобы игры XNA загружались быстрее и занимали меньше памяти,
стоит изменить размеры игровых ресурсов для платформы Windows
Phone.
Принципы работы XNA
Программы на основе Silverlight выполняют какие-либо действия
обычно только в ответ на события, например, при нажатии на кнопку,
или при завершении сетевой операции, или при загрузке новой
страницы приложения.
В отличие от приложений Silverlight, программы XNA всегда выполняют
какие-либо действия: обновляют игровой мир и перерисовывают экран.
Вместо ожидания ввода от устройства, игра XNA проверяет устройства,
в которых, возможно, пользователь выполнил ввод, и используют их,
чтобы обновить игровую модель и как можно быстрее перерисовать
экран. В контексте игры это имеет большое значение. В XNA игровой
мир всё время обновляется вокруг игрока, а не игрок инициирует
действия.
324
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
При запуске игры XNA фактически выполняются следующие действия:
1. Загрузка всех необходимых для игры ресурсов. Сюда входят все
звуки, текстуры и модели, необходимые для создания игровой
среды.
2. Периодический запуск игрового движка:
° обновление игрового мира: получение информации с
контроллеров ввода, обновление состояния и положения
игровых элементов;
° отрисовка игрового мира: обновление информации в
игровом мире, который может быть двух- или трёхмерным в
зависимости от типа игры.
Эти действия выполняются в трёх методах класса Game, который
создаёт Visual Studio как часть нового проекта игры.
partial class Game1 : Microsoft.Xna.Framework.Game
{
protected override void LoadContent(bool loadAllContent)
{
}
protected override void Update(GameTime gameTime)
{
}
protected override void Draw(GameTime gameTime)
{
}
}
При создании игры нужно добавить в эти методы программный код.
Эти методы XNA автоматически вызывает во время работы игры.
Метод LoadContent вызывается при запуске игры. Метод Draw
вызывается настолько часто, насколько это возможно, а метод Update
вызывается с частотой 30 раз в секунду, в отличие от версии игр для
компьютеров и Xbox 360, где этот метод вызывается 60 раз в секунду,
что позволяет уменьшить потребление электроэнергии.
Рассмотрим пример создания приложения, в котором по экрану будет
перемещаться белый шар.
325
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Игровой контент
Под словом контент понимаются все ресурсы игры: все текстуры игры,
звуковые эффекты и трёхмерные модели. Система управления
контентом XNA может считать элемент контента из файла в память
игры, работающей на целевом устройстве, преобразовать их и
использовать в игре.
Управление контентом выполняется в Visual Studio. Управление
элементами контента выполняется таким же образом, как и файлами
кода программы. Их можно добавить в проект и затем просмотреть их и
управлять их свойствами.
В нашем примере будет использоваться изображение белого шара,
которое хранится в файле WhiteDot.png. Соответственно, в рамках
приложения у этого ресурса будет имя WhiteDot. Как и в
приложениях Silveriight, все добавленные ресурсы будут являться частью
решения Visual Studio. Однако, контент-менеджер предназначен только
для игр XNA, а не для Silverlight.
Метод LoadContent вызывается для загрузки контента в игру один
раз при запуске игры:
protected override void LoadContent()
{
// создание группы спрайтов, которая можно использовать для отрис
spriteBatch = new SpriteBatch(GraphicsDevice);
}
Этот метод генерируется автоматически и создаёт новый экземпляр
класса SpriteBatch, который будет использоваться для отрисовки
элементов на экране. Сюда можно добавить код для загрузки
изображения в игру:
Texture2D bailTexture = Content.Load<Texture2D>('WhiteDot");
Метод Load входит в состав контент-менеджера. Для него необходимо
указать тип ресурса, который будет загружен (в нашем случае тип
Texture2D). При этом вызывается соответствующий метод-загрузчик,
3 26
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
который загружает текстуру в игру. Класс XNA Texture2D
представляет собой двухмерную текстуру, которую можно выводить на
экран.
Создание спрайтов в XNA
В компьютерных играх используется понятие "спрайт", обозначающее
изображение, которое может быть отрисовано в заданном месте экрана.
В XNA можно создать спрайт из текстуры, которая содержит
изображение, и прямоугольника, который определяет позицию на
экране.
XNA использует систему координат, в которой начало координат
находится в верхнем левом углу экрана, как и во многих других
графических инструментах. Соответственно, при увеличении значения
координаты Y объекта он будет располагаться ниже.
В большинстве устройств Windows Phone разрешение экрана составляет
800*480 пикселей. Если попытаться вывести объекты за пределами
этой области, то XNA их просто не выведет.
Для определения положения и размера области на экране в XNA
используется класс Rectangle.
Rectangle baHRectangle = new Rectange(0, 0, ballTexture.Width, ballTexture.He
Этот код создаёт прямоугольник в главном левом углу экрана с
заданными размерами, которые совпадают с размерами текстуры шара.
Для вывода текстуры на экран используется метод Draw, который при
создании проекта содержит следующий код:
protected override void Draw(GameTime gameTime)
{
GraphicsDevice. C lear(C olor.C ornflowerBlue);
base.Draw(gameTime);
}
327
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Этот метод задаёт синий фон экрана. Необходимо добавить в этот метод
код для вывода на экран изображение шара.
В современных устройствах есть специализированные графические
аппаратные средства, которые выполняют все операции вывода
изображений на экран. В Windows Phone есть графический процессор
(GPU), которому нужно указать текстуры и их положение, и затем он
выводит изображение на экран. Если программе нужно отобразить
объект на экране, она отправляет GPU набор инструкций для
отрисовки. Для достижения максимальной эффективности эти
инструкции объединяются в пакет, чтобы их можно было передать GPU
за одну операцию. Это делается с помощью класса SpriteBatch,
который выполняет группировку инструкций:
protected override void Draw(GameTime gameTime)
{
GraphicsDevice. C lear(C olor.C ornflowerBlue);
spriteBatch.Begin();
// сюда нужно добавить код для отрисовки объектов
spriteBatch.End();
base.Draw(gameTime);
}
Необходимо помнить, что код в методе Draw должен вызывать методы
Begin и End класса SpriteBatch для начала и окончания операций
отрисовки, иначе отрисовка не будет выполняться.
Для отрисовки спрайта вызывается метод Draw, которому необходимо
указать текстуру, её положение на экране и оттенок, который
применяется к текстуре. Если в качестве третьего параметра задать
значение Color .White, то оттенок применяться не будет:
spriteBatch.Draw(balTTexture, ballRectangle, Color.White);
Полный код метода будет выглядеть так:
328
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
protected override void Draw(GameTime gameTime)
{
GraphicsDevice. C lear(C olor.C ornflowerBlue);
spriteBatch.Begin();
spriteBatch.Draw(baHTexture, ballRectangle, Color.White);
spriteBatch.End();
base.Draw(gameTime);
}
При запуске программы шар будет выводиться в верхнем левом углу
экрана телефона. При этом, по умолчанию игра XNA ожидает, что игрок
будет держать телефон горизонтально, т.е. в альбомной ориентации.
При необходимости игра может изменять ориентацию экрана.
В программе можно изменять положение и размер текстуры, и при
этом, XNA будет масштабировать текстуру, как показано на рис. 19.1.
Рис. 19.1. Масштабирование текстуры при различных размерах экрана
При создании игры важно, чтобы она выглядела одинаково, независимо
от размера экрана используемого устройства. Устройства Windows Phone
используют ограниченный набор разрешений, как и на компьютерах и
329
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
платформе Xbox 360. Чтобы игра выглядела одинаково на каждом
устройстве, она должна определять размеры экрана устройства, и в
зависимости от размеров масштабировать объекты.
Игра XNA может узнать размер экрана из свойств окна просмотра,
используемого графическим адаптером:
ballRectangle = new Rectangle(0, 0, GraphicsDevice.ViewportWidth / 20,
GrapMcsDevice.ViewportWidth / 20);
Этот код создает прямоугольную область для шара, размер которого
составит 1/20 часть ширины экрана, независимо от его размера.
Обновление игрового процесса
При перемещении игровых объектов их положение на экране
изменяется перед перерисовкой экрана. Положение объектов нужно
обновлять в методе Update, который вызывается с частотой 30 раз в
секунду во время работы игры. Для обновления положения шара можно
использовать следующий код:
protected override void Update(GameTime gameTime)
{
ballRectangle.X++;
ballRectangle.Y++;
base.Update(gameTime);
}
Этот метод увеличивает значения координат X и Y прямоугольника шара
на один пиксель при каждом вызове. При этом, шар спускается вниз и в
сторону на 30 пикселей каждую секунду. Через 15 секунд шар выходит за
пределы экрана, но продолжает перемещаться и дальше.
Если нужно, чтобы шар перемещался по экрану медленнее, для задания
положения шара можно использовать вещественные переменные,
которые могут хранить дробные числа. При этом, перед выводом шара
эти переменные необходимо преобразовать в целые числа, так как
330
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
свойства, определяющие положение, имеют целочисленный тип:
float ballX;
float ballY;
// значения скорости шара по соответствуюзей координате
float ballXSpeed = 3;
float ballYSpeed = 3;
// новые координаты шара
ballRectangle.X = (int)(ballX + ballXSpeed);
ballRectangle.Y = (int)(ballY + ballYSpeed);
В этом коде используются вещественные значения в форме с плавающей
точкой, которые округляются до целых чисел.
Теперь необходимо сделать так, чтобы шар отлетал от краёв экрана. Игра
должна обнаружить, когда шар достигает края экрана, и обновить
направление его движения. Если шар касается края экрана в
горизонтальном направлении, игра должна изменить значение скорости
шара по оси X, а если шар касается верхней или нижней части экрана —
значение скорости шара по оси Y. Для того чтобы шар двигался в
обратном направлении, достаточно изменить знак значения скорости по
соответствующей координате. Программый код, выполняющий эти
действия, может выглядеть так:
if (ballX < 0 || ballX + ballRectange.Width > GraphicsDevice.Viewport.Width)
{
ballXSpeed = -ballXSpeed;
}
if (ballY < 0 || ballY + ballRectangle.Height > GraphicsDevice.Viewport.Height)
{
ballYSpeed = -ballYSpeed;
}
19.2. Создание игрового мира
331
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Создание игровых объектов
Практически в любой игре игровой процесс зависит от действия
пользователя. Пользователь управляет каким-то игровым объектом. В
нашем примере таким объектом будет прямоугольная вертикальная
платформа (рис. 19.2), которая может двигаться вверх и вниз.
Рис. 19.2. Игровой объект "Платформа"
Текстура для платформы загружается и отрисовывается на экране точно
так же, как и шар. В игре будут использоваться две платформы: одна —
для левого игрока, другая — для правого. Пусть левой платформой будет
управлять игрок, а правой — компьютер. На экране должны
отображаться три спрайта, каждый из которых использует переменную
для хранения текстуры и переменную для хранения положения
соответствующей текстуры на экране.
// игровой мир
Texture2D baUTexture;
Rectangle baHRectangle;
float ballX;
float ballY;
float ballXSpeed = 3;
float ballYSpeed = 3;
Texture2D lPaddleTexture;
Rectangle lPaddleRectangle;
float lPaddleSpeed = 4;
332
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
float lPaddleY;
Texture2D rPaddleTexture;
Rectangle rPaddleRectangle;
float rPaddleY;
// значение отступа платформ от краёв экрана
int margin;
Эти переменные представляют игровой мир. Метод Update должен
обновлять значения переменных, а метод Draw использует их для
вывода платформ и шара на экран в нужном месте.
При запуске игры метод LoadContent загружает изображения с
помощью контент-менеджера и настраивает начальное положение для
элементов на экране:
protected override void LoadContent()
{
// создание группы спрайтов, которая можно использовать для отрис
spriteBatch = new SpriteBatch(GraphicsDevice);
ballTexture = Content.Load<Texture2D>('ball");
lPaddleTexture = Content.Load<Texture2D>("lpaddle");
rPaddleTexture = Content.Load<Texture2D>("rpaddle");
ballRectangle = new Rectangle(
GraphicsDevice.ViewportWidth / 2, GraphicsDevice.Viewport.Height / 2,
GraphicsDevice.ViewportWidth / 20, GraphicsDevice.ViewportWidth / 20
margin = GraphicsDevice.ViewportWidth / 20;
lPaddleRectangle = new Rectangle(margin, 0,
GraphicsDevice.ViewportWidth / 20, GraphicsDevice.ViewportHeight / 5)
rPaddleRectangle = new Rectangle(
GraphicsDevice.ViewportWidth - lPaddleRectangle.Width - margin, 0,
GraphicsDevice.ViewportWidth / 20, GraphicsDevice.Viewport.Height / 5)
333
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
IPaddleY = lPaddleRectange.Y;
rPaddleY = rPaddleRectangle.Y;
}
В результате выполнения этого метода на экран будет выведено
изображение, представленное на рис. 19.3.
Рис. 19.3. Игровые объекты на экране
После запуска игры шар будет перемещаться по экрану. При этом, игрок
должен управлять движением платформы.
Управление объектами с помощью сенсорного экрана
Для управления движением платформы можно использовать
сенсорный экран Windows Phone. Использовать сенсорный экран для
управления игровыми объектами можно по-разному В нашем примере
будет применяться следующий принцип: если игрок коснётся верхней
части экрана, то его платформа будет двигаться вверх, а если коснётся
нижней части экрана — то вниз.
Для взаимодействия с сенсорным экраном используется класс
TouchPanel. Его метод GetState возвращает коллекцию объектов,
которые описывают точки касания:
TouchCollection touches = TouchPaneLGetStateQ;
33-4
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Каждый элемент коллекции является экземпляром класса
TouchLocation и содержит много свойств, которые хранят
информацию о месте экрана, к которому прикоснулся пользователь.
Можно использовать свойство Y этого класса, чтобы управлять
движением платформы.
if (touches.Count > 0)
{
if (touches[0].Position.Y > GraphicsDevice.Viewport.Height / 2)
{
lPaddleY = lPaddleY + lPaddleSpeed;
}
else
{
lPaddleY = lPaddleY - lPaddleSpeed;
}
}
Первая строка этого блока программы проверяет, был ли сенсорный
ввод. Если да, то проверяется, в какой части экрана пользователь
коснулся экрана — выше или ниже середины экрана — ив
соответствии с этим изменяется положение левой платформы.
Также можно использовать расширенные возможности сенсорного
ввода, среди которых — несколько одновременных прикосновений,
отслеживание местоположение и движения особого типа сенсорных
жестов.
Обнаружение столкновений. В настоящее время платформа и шар никак
не взаимодействуют друг с другом. Необходимо, чтобы шар отскакивал
от платформы. Для этого необходимо определить, пересекаются ли два
прямоугольника.
Для этого можно использовать метод Intersects класса
Rectangle:
if (baHRectangle.Intersects(lPaddleRectangle))
{
ballXSpeed = -ballXSpeed;
}
335
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Этот код проверяет, коснулся ли шар левой платформы, и если да —
направление движения шара по горизонтали меняется на
противоположное.
Ведение счёта. Часто в играх ведётся счёт, который выводится на экран.
В нашем примере очки будет зарабатывать противник игрока, который
пропустил шар, и в этом случае шар касается боковой границы экрана.
Для этого можно использовать существующий код, который изменяет
направление движения шара по горизонтали при касании боковой
границы экрана, и добавить переменную для ведения счёта для каждого
игрока, увеличивая её каждый раз, когда забит "гол". Кроме этого,
необходимо, чтобы текущий счёт отображался на экране. Для этого
необходимо рассмотреть, как на экран вывести произвольный текст.
Вывод текста на экран
Среда XNA не предоставляет прямой доступ к выводу текста. Чтобы
вывести текст на экран, игра должна загрузить символьный шрифт и
использовать это для рисования символов. Используемый шрифт
является элементом игрового контента, который нужно добавить в игру
и настроить его размер и начертание. При построении проекта игры
контент-менеджер создаёт набор символьных изображений и добавит
их в игру. После этого игра сможет рисовать текст на экране наряду с
другими игровыми элементами.
Чтобы добавить в игру шрифт, нужно в контент-менеджере добавить
новый файл Шрифт спрайта. Файл шрифта имеет формат XML, который
можно редактировать в Visual Studio:
<?xml version="1.0" encoding="utf-8"?>
<!--
Этот файл содержит XML-описание шрифта и будет считываться конве
платформы XNA. Следуйте комментариям, чтобы настроить внешний i
шрифта в игре и изменить символы, которыми можно
рисовать.
-->
<XnaContent xmlns:Graphics="Microsoft.Xna.Framework.Content.Pipe]ine.Gra
<Asset Type=' 'Graphics F ontDescription' >
336
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
<!--
Измените эту строку, чтобы сменить импортируемый шрифт.
-->
<FontName>Segoe UI Mono</FontName>
<!--
Size — это вещественное значение, задаваемое в пунктах. Измените е
чтобы поменять размер шрифта.
-->
<Size>14</Size>
<!--
Spacing — это вещественное значение, задаваемое в пикселях. Измен
чтобы поменять расстояние между символами.
-->
<Spacing>0</Spacing>
<!--
UseKerning задает кернинг шрифта. Если это значение равно "true", св'
о кернинге будут использованы при размещении символов.
-->
<UseKerning>true</UseKerning>
<!--
Style задает стиль шрифта. Допустимые значения: "Regular", "Bold", "Its
и "Bold, Italic", регистр учитывается.
-->
< Style >Regular</Style >
<!--
Если снять знак комментария с этой строки, символ по умолчанию б
при отрисовке или измерении текста вместо символов, не включенн
-->
<!-- <DefaultCharacter>*</DefaultCharacter> -->
<!--
CharacterRegions указывает, какие буквы доступны в шрифте. Все сим1
от Start до End будут построены и доступны для отрисовки. Диапазон
337
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
по умолчанию: от 32 (пробел ASCII) до 126 ("~"), что покрывает базо
символов латиницы. Символы упорядочены согласно Юникоду.
Дополнительные сведения см. в документации.
-->
<CharacterRegions>
<CharacterRegion>
<Start> </Start>
<End>~</End>
</CharacterRegion>
</CharacterRegions>
</Asset>
</XnaContent>
В этом файле выбран шрифт Segoe UI Моно размером 14 пт. После
добавления шрифта в контент-менеджер его можно загружать в
программу так же, как и другие ресурсы:
SpriteFont font;
font = Content.Load<SpriteFont>('MessageFont");
После этого в программе можно использовать загруженный шрифт для
вывода текста на экран:
spriteBatch.DrawString(font, "Hello", new Vector2(50, 100), Color.White);
Метод DrawString принимает четыре параметра: шрифт, выводимый
на экран текст, положение текста на экране и цвет текста. Позиция на
экране задаётся с помощью класса Vect or2.
19.3. Использование средств Windows Phone в играх
Сенсорный экран — не единственное новое устройство ввода в
Windows Phone. Можно использовать акселерометр для создания игр, в
которых управление сводится к перемещению и вращению телефона.
Акселерометр может измерять ускорение по трём осям, а также
определять ориентацию телефона, поскольку на акселерометр действует
сила тяжести, которая задаёт постоянное ускорение к центру земли.
338
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Визуально можно представить акселерометр как груз, подвешенный к
центру задней части телефона (рис. 19.4).
Рис. 19.4. Расположение осей измерения акселерометра
Если держать телефон горизонтально, то подвес будет расположен
перпендикулярно плоскости телефона. Если выразить координаты груза
в системе координат .V. У, Z относительно точки, в которой груз
прикреплён к телефону его можно считать равным (0, 0, -1), если
принять длину подвеса равной 1.
Если повернуть на некоторый угол телефон от себя, груз удаляется на
некоторое расстояние относительно начального положения, и значение
координаты У будет больше нуля. Если повернуть телефон к себе, чтобы
было видно его экран, значение координаты 1" будет меньше нуля. Если
расположить телефон вертикально экраном к себе, то Y = -1, а
Z 0. Е[ри наклоне телефона влево или влево будет соответственно
уменьшаться или увеличиваться значение координаты X •
Такие значения будет выдавать акселерометр в телефоне. Эти
координаты позволяют определить ориентацию телефона.
Аналогичным образом измеряется ускорение, если телефон перемещать
в пространстве. В этом случае груз будет отклоняться от вертикали, на
некоторый угол, что можно использовать для измерения ускорения.
339
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Получение значений ускорения с помощью класса
Accelerometer
Драйвер акселерометра встроен в Windows Phone, и его можно
применять для получения значений как в программах XNA, так и в
программах Silverlight.
В программе необходимо создать экземпляр класса Accelerometer и
назначить обработчик события ReadingChanged, которое
происходит каждый раз, когда акселерометр фиксирует новые значения.
В программе Silverlight может использовать эти значения как обычные
переменные, а также их можно связать со свойствами визуальных
элементов. В программе XNA нужно сделать локальную копию новых
значений и использовать их в методе Update.
Чтобы использовать класс Accelerometer, нужно добавить в проект
ссылку на библиотеку Microsoft.Devices.Sensors, а также
директиву using в файл кода. Для создания экземпляра класса
Accelerometer и добавления обработчика события можно
использовать следующий код:
protected override void Initialize()
{
Accelerometer acc = new Accelerometer();
acc.ReadingChanged +=
new EventHandler<AccelerometerReadingEventArgs>(acc_ReadingChang
acc.StartO;
base.InitializeQ;
}
Метод XNA Initialize вызывается при запуске программы. После
добавления обработчика вызывается метод Start, чтобы программа
начала получать значения от акселерометра.
Метод-обработчик acc_ReadingChanged будет вызываться при
каждом изменении значений:
Vector3 accelState = Vector3.Zero;
3-40
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
void acc_ReadingChanged(object sender, AccelerometerReadingEventArgs e)
{
accelState.X = (float)e.X;
accelState.Y = (float)e.Y;
accelState.Z = (float)e.Z;
}
Этот метод сохраняет полученные значения в переменной типа
Vector3, и их можно использовать для управления движением
платформы в создаваемой нами игре:
lPaddleY = lPaddleY - (accelState.X * IPaddleSpeed);
Этот код использует полученное значение координаты X для управления
движением левой платформы вверх и вниз. Обратите внимание, что
игра работает в альбомной ориентации, а значения акселерометра
всегда выдаются для портретной ориентации.
Акселерометр довольно просто использовать для создания игр, в
которых для управления объектом нужно перемещать и наклонять
телефон, например, игра Лабиринт.
Тестировать программы, использующие акселерометр, можно в
эмуляторе. Для эмуляции работы акселерометра используется вкладка
Акселерометр окна Дополнительные инструменты. В этом окне можно
выбрать произвольную ориентацию телефона, перемещая красную
точку. Однако, при создании реальных приложений настоятельно
рекомендуется тестировать их в физическом устройстве.
Решение возможных проблем
Созданная в нашем примере игра может время от времени работать
некорректно, поскольку код программы не учитывает некоторые важные
моменты.
Проблема связана с методом, в котором происходит считывание и
сохранение значений с акселерометра. При этом одновременно
341
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
выполняются две операции:
• акселерометр генерирует и сохраняет новые значения;
• метод Update использует эти значения для управления игровым
объектом.
Однако, в Windows Phone одновременно может быть активным только
один процесс, а параллельная работа сводится к быстрому
переключению между активными процессами.
Проблема может возникнуть при выполнении следующей
последовательности действий:
1. Метод Update запускается и считывает значение по оси X.
2. Происходит событие класса Accelerometer, которое генерирует
новые значения по осям X, Y и Z.
3. Метод Update считывает новые значения по осям Y и Z.
Получается, что будут использоваться старые и новые значения разных
осей. Если приложение будет использовать все три значения, то
периодически в программе может быть использована неверная
информация, что может привести к непредсказуемому поведению.
Эту проблему можно решить, если указать, что операции получения
значений по осям должны выполняться как одна операция, чтобы
между ними не выполнялся код другого процесса, который использует
эти значения. В языке C# для этого существует инструкция lock,
которая не позволяет получить доступ к заданному объекту блокировки
до тех пор, пока не выполнится полностью указанный блок кода. Для
этого в программе нужно создать и использовать объект блокировки:
object accelLock = new object();
void acc_ReadingChanged(object sender, AccelerometerReadingEventArgs e)
{
lock (accelLock)
{
accelState.X = (float)e.X;
accelState.Y = (float)e.Y;
342
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
accelState.Z = (float)e.Z;
}
}
Переменная accelLock имеет самый простой тип данных object. В
этой переменной не хранятся никакие данные. Вместо этого он
используется в качестве маркера, который может быть назначен только
одному процессу. В методе Update должна использоваться изменённая
версия кода, которая также будет использовать этот объект блокировки:
lock (accelLock)
{
lPaddleY = lPaddleY - (accelState.X * lPaddleSpeed);
}
Когда процесс попытается выполнить блок кода программы, связанный
с инструкцией lock, он попытается получить доступ к объекту
блокировки. Если объект будет недоступен (его будет использовать
другая секция lock), то процесс приостановит работу и будет ожидать,
пока объект не будет освобождён. Соответственно, теперь один метод
не сможет прервать выполнение другого метода.
Однако, такой подход требует повышенного внимания со стороны
программиста. Очень важно, чтобы любой код в секции lock
выполнялся как можно быстрее, чтобы другим процессам не
приходилось долго ожидать доступа к объекту блокировки. Другая
проблема, которую необходимо избегать, — это взаимная блокировка.
Она возникает в случае, если один процесс заблокировал объект A и
ожидает, пока не освободится объект B, а другой процесс заблокировал
объект B (перед тем как доступ к нему запросил первый процесс) и
ожидает, пока не освободится объект A (который заблокировал первый
процесс). В результате получается, что оба процесса приостанавливают
работу и могут ждать сколь угодно долго. При создании программы
необходимо всячески избегать потенциальной возможности создания
подобной ситуации.
Добавление звуков в игру
343
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Для того чтобы сделать игру более интересной, в неё можно добавить
звуковые эффекты. Звуковые файлы добавляются в игру так же, как и
другие ресурсы, и управляются контент-менеджером. Различают два
вида звуков в игре: звуковые эффекты, которые сопровождают
определённые игровые моменты, и фоновая музыка игры.
Звуковые эффекты загружаются в игру как контент. Они представляют
собой WAV-файлы, загружаются в память при запуске игры и
воспроизводятся по запросу. Музыкальные файлы также могут являться
частью игрового контента, но воспроизводятся медиапроигрывателем.
Для создания звуковых файлов существуют различные программы.
Однако, создание и обработка звуковых файлов не входит в темы нашего
курса.
Использовать в игре звуковые элементы позволяет класс
SoundEffect:
// звуковые эффекты
SoundEffect dingSound;
SoundEffect explodeSound;
dingSound = ContentLoad<SoundEffect>("ding");
explodeSound = Content.Load<SoundEffect>("explode");
Класс SoundEffect содержит метод Play, при вызове которого звук
воспроизводится:
if (baflRectangle.Intersects(rPaddleRectangle))
{
ballXSpeed = -ballXSpeed;
dingSound.Play();
}
Этот код воспроизводит звук при столкновении шара с платформой. Это
самая простая форма воспроизведения звукового эффекта. Звук
воспроизводится сразу при вызове метода, и программа продолжает
работать, не ожидая окончания его воспроизведения. Windows Phone
может одновременно воспроизводить несколько звуковых эффектов.
Аппаратных средства Windows Phone поддерживает до 64 звуковых
34-4
А.И. Гарибов
каналов.
Основы разработки приложений для мобильных устройств на платформе Windows Phone
Использование класса SoundEffectInstance
Класс SoundEffect удобно использовать для быстрого
воспроизведения звуков. Однако, в некоторых случаях звуковые эффекты
игры должны многократно повторяться, изменять тон или использовать
панорамирование. Для получения дополнительного контроля над
звуком можно создать экземпляр класса SoundEffectInstance для
особого звукового эффекта. Его можно рассматривать как дескриптор
звука игры.
Например, можно создать звук непрерывно работающего двигателя. Для
этого можно использовать экземпляр класса SoundEffect, который
содержит образец звука двигателя, загруженный из элемента игрового
контента. Используя этот объект, нужно создать экземпляр класса
SoundEffectInstance, который будет представлять дескриптор
звука:
SoundEffect engineSound;
SoundEffectInstance engineInstance = engineSound.CreateInstance();
Теперь можно использовать методы и свойства класса
SoundEffectInstance для управления воспроизведением звука и
добавления звуковых эффектов:
// начать воспроизведение
engineInstance.P]ay();
// приостановить воспроизведение
engineInstance.Pause();
// остановить воспроизведение
engineInstance.Stop();
engineInstance.Volume = 1; // громкость в интервале от 0 до 1
345
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
enginelnstance.Pitch = 0; // тон в интервале от -1 до +1
// -1 - на октаву ниже
// +1 - на октаву выше
enginelnstance.Pan = 0; // панорамирование в интервале от -1 до +1
// -1 - звук слева
// +1 - звук справа
enginelnstance.IsLooped = true; // циклическое повторение
Также в программе можно проверить состояние воспроизведения звука
if (enginelnstance.State == SoundState.Stopped)
{
engineInstance.P]ay();
}
Этот код воспроизводит звук, если бы он был остановлен.
Класс SoundEffectInstance рассматривается как дескриптор
звукового канала в устройстве Windows Phone. Не рекомендуется
создавать их в большом количестве, чтобы приложение не исчерпало
звуковые каналы.
Воспроизведение звука в программе Silverlight
Программа Silverlight может использовать XNA для воспроизведения
звуков. Для этого нужно добавить в программу Silverlight ссылки на
библиотеки XNA и загрузить звук из ресурсов проекта. Рекомендуется
использовать директиву using в файлах кода, где будет вызываться
воспроизведение звуков:
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
При этом, нельзя использовать многие элементы XNA, но можно
использовать классы аудио.
Для добавляемых звуковых ресурсов можно создать в проекте
346
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
отдельную папку, например, Sound. Звуковые ресурсы должны
добавляться как элемент контента.
Поскольку в программе Silverlight нет контент-менеджера, для загрузки
звука из файла нужно использовать другие возможности, например,
можно использовать методы, загружающие звук из потока:
SoiindEffect beep =
SoundEffect.FromStream(TitleContainer.OpenSl;ream("Sounds/beep.wav"));
Класс TitleContainer является частью решения Silverlight и может
открыть любой элемент контента в проекте как поток. После
выполнения этой команды в программе Silverlight можно использовать
звук, загруженный в переменную beep класса SoundEf fect.
Воспроизводить звук в программе Silverlight можно так же, как и в
программе XNA:
beep.Play();
Также можно использовать SoundEffectInstance для управления
звуковыми эффектами.
Однако, в программу Silverlight необходимо добавить выполнение
некоторых действий для проверки правильности воспроизведения
звука. Как было изложено ранее, в игре XNA метод Update вызывается
30 раз в секунду. При этом обновляются некоторые системные
элементы, включая воспроизведение звука. Программа Silverlight таких
действий не выполняет, и их нужно реализовать, чтобы звук правильно
воспроизводился:
FrameworkDispatcher.Update();
Этот метод нужно вызывать 30 раз в секунду, иначе воспроизведение
звука может завершиться неудачей, а сама программа может быть
остановлена. Для этого можно использовать таймер, который
генерирует события через определённые промежутки времени, и к
обработчику события можно добавить нужный код.
В пространстве имён System.Windows.Threading описан класс
347
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
DispatcherTimer. Код для создания и запуска таймера может
выглядеть так:
using System.Windows.Threading;
DispatcherTimer timer = new DispatcherTimer();
timer.Tick += new EventHandler(timer_Tick);
timer.Interval = TimeSpan.FromTicks(333333);
timer.StartO;
Метод-обработчик timer_Tick должен просто обновлять XNA:
void timer_Tick(object sender, EventArgs e)
{
FrameworkDispatcher.UpdateO;
}
С помощью таймера в программе Silverlight можно создавать различные
дополнительные эффекты, например, анимированный фон, тикающие
часы и т.п.
Управление размерами и ориентацией экрана
Программы Windows Phone могут поддерживать разные типы
ориентации. По умолчанию при создании игры XNA используется
альбомная ориентация, при которой телефон повёрнут влево. Однако,
иногда бывает удобнее использовать в игре портретную ориентацию.
Игры XNA могут поддерживать разные типы ориентации телефона и
получать события при изменении ориентации телефона.
Объект игры graphics предоставляет много свойств, которые можно
использовать в играх для управления размером и ориентацией экрана:
graphics.SupportedOrientations = DisplayOrientatioaPortrait
| DisplayOrientation.LandscapeLeft | DisplayOrientation.LandscapeRight;
Для поддержки различных режимов ориентации можно объединять
соответствующие значения с помощью логической операции ИЛИ.
348
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Если в игре нужно обработать событие изменения ориентации экрана,
можно создать метод-обработчик события OrientationChanged:
Window.OrientationChanged += new EventHandler<EventArgs>(Window_Orie:
В методе Window_OrientationChanged можно изменить размеры
всех объектов на экране для новой ориентации игры. Ориентацию по
умолчанию лучше всего задать в конструкторе класса Game.
Выбор размера экрана
В игре можно указать определённый размер экрана:
graphics.PreferredBackBufferWidth = 480;
graphics.PreferredBackBufferHeight = 800;
Если задать определённый произвольный размер экрана, игра
вынуждает экран работать в заданном разрешении. Размеры также
влияют на ориентацию экрана. При этом, аппаратные средства экрана
Windows Phone будут масштабировать изображение с указанным
разрешением под реальный размер экрана. Таким образом, игра будет
выглядеть одинаково и на будущих устройствах с другим разрешением
экрана.
Автоматическое масштабирование экрана можно использовать для
повышения производительности разрабатываемой игры:
graphics.PreferredBackBufferWidth = 240;
graphics.PreferredBackBufferHeight = 400;
Эти строки указывают размер экрана, который меньше чем экран
большинства устройств Windows Phone. Фактически экран с такими
размерами в четыре раза меньше стандартного экрана. Однако,
аппаратные средства Windows Phone масштабируют изображение, и оно
будет выглядеть правильно и на большем экране. В играх, в которых
изображение быстро изменяется, это не будет заметно, но фактически в
четыре раза меньшее разрешение значительно повысит эффективность
работы графической подсистемы.
349
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
По умолчанию игра XNA не использует часть экранного пространства,
отведённую под главную панель экрана телефона, в которой
отображаются сообщения о состоянии. Если необходимо, чтобы игра
использовала весь экран, это нужно явно указать:
graphics.IsFullScreen = true;
По умолчанию значение свойства IsFullScreen равно false.
Отключение тайм-аута экрана
Владелец Windows Phone может установить тайм-аут экрана, то есть,
время бездействия, по истечении которого экран будет выключен и
заблокирован для сохранения срока службы аккумулятора. Телефон
контролирует сенсорный экран для обнаружения ввода данных от
пользователя, и если нет в течение заданного времени ввод не был
осуществлён, экран выключится, или запустится экранная заставка. При
этом, телефон не проверяет акселерометр. Однако, если в игре
управление осуществляется перемещением и поворотом телефона,
лучше отключить тайм-аут. Это можно сделать с помощью класса XNA
Guide:
Guide.IsScreenSaverEnabled = false;
Класса Guide является частью XNA и позволяет получать
информацию об учётной записи игрока в Xbox Live, игровых
достижениях и т.д. Использовать возможность отключения экранной
заставки следует с осторожность, так как при этом будет расходоваться
энергия аккумулятора, пока игра не будет закрыта, даже если
пользователь не будет выполнять никаких действий.
19.4. Совместное использование XNA и Silverlight
Можно создать решение Visual Studio, содержащее и приложение
Silverlight, и компонент игры XNA. Эту возможность удобно
использовать, например, для создания игровых меню, или можно
добавить элементы 3D графики в приложение Silverlight.
350
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Для этого нужно создать решение Visual Studio, используя шаблон
Приложение Siiverlight и XNA для Windows Phone. Новое решение
содержит три проекта.
Главным проектом будет приложение Silverlight, которое является
начальным проектом. Второй проект содержит набор необходимых
библиотек. Третий предназначен для хранения контента XNA для
игровой части решения.
При создании объединённого приложения также будет создана новая
страница Silverlight, которая будет содержать игру XNA. Игровой процесс
XNA размещается на странице GamePage.
Создание игровой среды XNA в Silverlight
При запуске игры XNA вызывается набор методов для инициализации
игры, загрузки игрового контента и периодического выполнения
обновления игрового мира и его перерисовки на экране. Когда игра
работает на странице Silverlight, необходимо обеспечить выполнение
этих действий.
protected override void OnNavigatedTo(NavigationEventArgs e)
protected override void OnNavigatedFrom(NavigationEventArgs e)
private void OnUpdate(object sender, GameTimerEventArgs e)
private void OnDraw(object sender, GameTimerEventArgs e)
Эти методы находятся на странице игры, и их необходимо заполнить.
Метод OnNavigatedTo выполняет функции методов Initialise и
LoadContent, а методы OnUpdate и OnDraw выполняют функции
методов Update и Draw соответственно. Метод OnNavigatedTo
всегда вызывается, когда пользователь переходит на страницу, и здесь
игра должна загрузить контент и начать выполнение. Этот метод также
создаёт таймер, который выполняет вызовы методов OnUpdate и
OnDraw во время работы игры.
Обратите внимание, что программа XNA работает на странице
Silverlight, и пользователь может перейти на другую страницу
приложения. При этом вызывается метод OnNavigatedFrom,
351
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
который можно использовать, чтобы автоматически приостановить
игру при переходе на другую страницу приложения.
Чтобы запустить игру при нажатии на кнопку; в обработчик нажатия на
кнопку нужно добавить следующий код:
private void Button_Click(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri("/GamePage.xaml", UriKind.Relative));
}
Если во время работы игры нажать кнопку телефона Назад, то
произойдёт переход к предыдущей странице, и игра закроется. Обратите
внимание, что игра перезапускается каждый раз при переходе на
страницу. При этом, игра перезагружает все текстуры и игровые
ресурсы. Было бы разумно сохранить текстуры и состояние игры в
отдельном классе и кэшировать данные, чтобы пользователь мог
вернуться на то место в игре, на котором он закончил её в прошлый раз.
Взаимодействие XNA и Silverlight
Существует возможность наложить визуальные элементы Silverlight
поверх игры XNA. Это позволяет легко добавить к игре кнопки и текст,
используя элементы Button и TextBlock. Для добавления
элементов Silverlight на экран игры сначала нужно создать элементы и
добавить их в файл GamePage.xaml:
<Grid xName="LayoutRoot">
<StackPanel>
<TextBlock x:Name="ScoreTextBlock" Text="0:0" TextAlignment="Center
Style="{StaticResource PhoneTextTitlelStyle}" />
<Button Content-Quit" Name="quitButton" Width="480"
Click="quitButton_C]ick" />
</StackPanel>
</Grid>
Этот код создаёт элемент StackPanel с кнопкой и блоком текста.
Кнопка будет завершать игру, а в текстовом блоке будет отображаться
352
А.И. Гарибов
счёт игры.
Основы разработки приложений для мобильных устройств на платформе Windows Phone
Теперь эти элементы нужно вывести на экран. Рендеринг элементов
Silverlight выполняется в классе UIElementRenderer. Экземпляр
этого класса создаётся при загрузке страницы:
UIElementRenderer elementRenderer;
if (elementRenderer == null)
{
elementRenderer = new UIElementRenderer(this, (int)ActualWidth,
(int)ActualHeight);
}
Этот код проверяет, существует ли elementRenderer, и если нет — создаёт
его. Обратите внимание, конструктор этого элемента принимает в
качестве параметров ссылку на используемую страницу, ширину и
высота области для отрисовки.
Теперь этот объект можно использовать его в методе OnDraw для
создания элементов Silverlight:
private void OnDraw(object sender, GameTimerEventArgs e)
{
// рендеринг элементов Silverlight с помощью объекта UIElementRender
elementRenderer.Render();
SharedGraphicsDeviceManager. C urrent. GraphicsDevice .Clear(C olor.C ornflo
spriteBatch.BeginQ;
spriteBatch.Draw(ballTexture, ballRectangle, Color.White);
spriteBatch.Draw(elementRenderer.Texture, Vector2.Zero, Color.White);
spriteBatch.End();
3525
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
}
Элементы Silverlight будут выводиться поверх игровых объектов. Если
нужно использовать элементы Silverlight в качестве фона для игры, их
нужно выводить первыми. Во время работы игры XNA элементы
Silverlight отвечают на действия пользователя, и их можно связать с
обработчиками событий. Обработчики событий элементов можно
использовать даже если элементы не выводятся на экран.
Краткие итоги
1. XNA предоставляет среду для создания 2D и 3D игр для
компьютеров под управлением Windows, Xbox 360 или Windows
Phone.
2. Принцип работа игр XNA существенно отличается от
приложений Silverlight. Игра XNA содержит методы для загрузки
контента, обновления и отрисовки игрового мира, которые
вызывает XNA во время работы игры.
3. При создании нового проекта игры XNA в Visual Studio создаётся
класс, содержащий пустые методы LoadContent, Update и
Draw, в которые нужно добавить код игры. Метод
LoadContent должен загружать весь необходимый игровой
контент. Метод Update вызывается с частотой 30 раз в секунду
для обновления игрового контента, а метод Draw вызывается для
отрисовки игры на экране.
4. Любым контентом (например, изображения или звуки),
добавленным к игре XNA, управляет контент-менеджер, который
использует фильтры для различных типов файлов и процессоры
вывода, которые готовят контент к развертыванию на целевом
устройстве. В пределах игры XNA способ загрузки и
использования контента одинаков независимо от целевых
аппаратных средств.
5. Спрайт состоит из текстуры, которая определяет внешний вид
объекта, и положения, которое определяет, где будет отрисован
элемент и его размер. XNA предоставляет объекты для хранения
этой информации.
6. При отрисовке двумерных изображений в системе XNA начало
координат находится в левом верхнем углу экрана.
354
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
7. Сенсорный экран Windows Phone предоставляет низкоуровневый
массив, в котором хранится информация о сенсорном вводе,
которая может содержать детали, по крайней мере, 4 точек
касания.
8. Игры XNA могут выводить на экран текст с помощью шрифтов
спрайта, сделанных на основе шрифтов системы Windows для
компьютеров.
9. Программы XNA и Silverlight могут воспроизводить звуковые
эффекты. Для управления воспроизведением звуковых эффектов в
программе можно создать экземпляр класса
SoundEffectInstance, который является дескриптором звука
игры.
10. Программы XNA для Windows Phone могут задавать разрешение и
ориентацию экрана. Если будет выбрано разрешение ниже, чем
поддерживаемое экраном телефона, то графический процессор
будет автоматически масштабировать выбранный размер под
экран устройства.
11. В программах XNA для Windows Phone могут отключать строку
состояния в верхней части экрана, чтобы использовать область
экрана целиком. Также можно отключать экранную заставку:
12. XNA и Silverlight можно совместно использовать в одном решении.
Игра XNA может запускаться на странице приложения Silverlight и
может содержать компоненты Silverlight.
13. Страница XNA не содержит файла с кодом XAML, поскольку
элементы Silverlight преобразуются в текстуру XNA.
14. Для вывода на экран элементов Silverlight используется
класс UIElementRenderer.
Вопросы
1. Для чего предназначена технология XNA?
2. В чём отличие решений XNA от Silverlight?
3. Какие действия выполняются при загрузке игр XNA?
4. Как в программе используется контент-менеджер?
5. Как в программе создать и вывести на экран графический объект?
6. Как можно использовать сенсорный экран для управления
игровыми объектами?
7. Какие действия необходимо выполнить для вывода текста на
355
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
экран приложения?
8. Каково назначение и принцип работы акселерометра?
9. Как использовать акселерометр в приложениях для Windows
Phone?
10. Какие классы XNA используются для воспроизведения звуков в
игре?
11. Как управлять воспроизведением звука в игре?
12. Как воспроизводить звук в программе Silverlight?
13. Как в приложении можно управлять настройками экрана?
14. Каким образом можно совместно использовать технологии
Silverlight и XNA в одном приложении?
Упражнения
Для выполнения этих упражнений рекомендуется использовать
физическое устройство Windows Phone для возможности
мультисенсорного ввода и использования акселерометра.
Упражнение 1. Создание многопользовательской игры
В этом упражнении вы доработаете созданную игру.
Ограничение движения игрового объекта
На текущий момент левая платформа может перемещаться за пределы
экрана. Необходимо предотвратить такую возможность.
1. Откройте в Visual Studio проект PongGame в папке Lab7 PongGame.
2. Добавьте в метод Draw следующий код, который не позволит
левой платформе уйти за пределы экрана:
if (lPaddleY < 0)
{
lPaddleY = 0;
}
if (lPaddleY + lPaddleRectangle.Height > GraphicsDevice.Viewport.Heigl
{
lPaddleY = GraphicsDevice.Viewport.Height - lPaddleRectangle.Heigh
35(5
А.И. Гарибов
}
Основы разработки приложений для мобильных устройств на платформе Windows Phone
3. Добавьте аналогичный код для правой платформы.
4. Запустите игру и проверьте правильность её работы.
Добавление возможности играть вдвоём
На текущий момент правая платформа управляется компьютером.
Благодаря возможности мультисенсорного ввода, можно добавить в
игру возможность управления правой платформы вторым игроком.
1. Измените код для управления движением платформы следующим
кодом для обработки нескольких одновременных касаний экрана:
TouchCollection touches = TouchPaneLGetStateO;
foreach (TouchLocation touch in touches)
{
if (touch.Position.Y > GraphicsDevice.Vlewport.Height / 2)
{
lPaddleY = lPaddleY + lPaddleSpeed;
}
else
{
lPaddleY = lPaddleY - lPaddleSpeed;
}
}
2. Запустите программу и убедитесь в том, что управление
платформой работает правильно.
Теперь нужно изменить программный код для управления правой
платформой, чтобы ей мог управлять второй игрок. Для этого
экран можно поделить на четыре части. При обнаружении
касания в каждой из областей определяется направление
перемещения соответствующей платформы. Условия
принадлежности касания соответствующей области показаны на
рисунке:
357
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
3. Измените код программы, чтобы управление обеими
платформами осуществлялось с сенсорного экрана. (Решите эту
задачу самостоятельно.)
4. Удалите из программы код, который автоматически управляет
правой платформой.
5. Запустите игру и проверьте правильность её работы.
Упражнение 2. Использование акселерометра для управления в игре
В этом упражнении вы создадите приложение, которое использует
акселерометр Windows Phone для определения положения телефона в
пространстве. Существующая программа выводит на экран зелёный
шарик, расположенный над красной точкой, которая расположена в
центре экрана. Шарик должен управляться с помощью акселерометра.
1. Откройте в Visual Studio проект Level в папке Lab7 Level.
2. Откройте файл Game1.cs.
3. Добавьте следующий код в конструктор класса Gamel для
указания поддерживаемой в приложении ориентации телефона,
размеров экрана и задания полноэкранного режима.
graphics.SupportedOrientations = DisplayOrientation.LandscapeLeft;
graphics.PreferredBackBufferWidth = 480;
graphics.PreferredBackBufferHeight = 800;
graphics.IsFullScreen = true;
4. Добавьте в проект ссылку на библиотеку
Microsoft.Devices.Sensors.
5. Добавьте в файл Game1.cs ссылку на пространство имён
Microsoft.Devices.Sensors.
6. Добавьте в метод Initialise метод следующий код для
создания и запуска объекта для работы с акселерометром:
358
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Accelerometer acc = new Accelerometer();
acc.ReadingChanged +=
new EventHandler<AccelerometerReadingEventArgs>(acc_ReadingCl
acc.StartO;
7. Добавьте сразу после метода Initialise следующий код для
определения обработчика события акселерометра:
Vector3 accVector = Vector3.Zero;
void acc_ReadingChanged(object sender, AccelerometerReadingEventAr
{
accVector.X = (float)e.X;
accVector.Y = (float)e.Y;
accVector.Z = (float)e.Z;
}
Для управления движением шарика можно использовать
значения, получаемые от акселерометра и сохраняемые в
переменную accVector. Переменные bubbleX и bubbleY
содержат координаты шарика, когда он находится в центре экрана.
8. В методе Update удалите следующие строки кода:
bubbleRectangle.X = (int)(bubbleX + 0.5f);
bubbleRectangle.Y = (int)(bubbleY + 0.5f);
и добавьте код для вычисления новых координат шарика, в
которые он будет перемещаться:
float accBubbleX = bubbleX - (accVector.X * 200);
float accBubbleY = bubbleY + (accVector.Y * 200);
bubbleRectangle.X = (int)(accBubbleX + 0.5f);
bubbleRectangle.Y = (int)(accBubbleY + 0.5f);
9. Запустите программу и проверьте правильность её работы.
359
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Создание приложения XNA
Цель работы: изучение возможностей создания приложений XNA для
Windows Phone и использования сенсорного ввода для управления
объектами программы.
Основные теоретические сведения
Программы XNA всегда выполняют какие-либо действия: обновляют
игровой мир и перерисовывают экран. Вместо ожидания ввода от
устройства, игра XNA проверяет устройства, в которых, возможно,
пользователь выполнил ввод, и используют их, чтобы обновить
игровую модель и как можно быстрее перерисовать экран. В контексте
игры это имеет большое значение. В XNA игровой мир всё время
обновляется вокруг игрока, а не игрок инициирует действия.
При запуске игры XNA фактически выполняются следующие действия:
1. Загрузка всех необходимых для игры ресурсов. Сюда входят все
звуки, текстуры и модели, необходимые для создания игровой
среды.
2. Периодический запуск игрового движка:
° обновление игрового мира: получение информации с
контроллеров ввода, обновление состояния и положения
игровых элементов;
° отрисовка игрового мира: обновление информации в
игровом мире, который может быть двух- или трёхмерным в
зависимости от типа игры.
Эти действия выполняются в трёх методах класса Game, который
создаёт Visual Studio как часть нового проекта игры.
partial class Game1 : Microsoft.Xna.Framework.Game
{
protected override void LoadContent(bool loadAllContent)
{
}
protected override void Update(GameTime gameTime)
3(50
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
{
}
protected override void Draw(GameTime gameTime)
{
}
}
При создании игры нужно добавить в эти методы программный код.
Эти методы XNA автоматически вызывает во время работы игры.
Метод LoadContent вызывается при запуске игры. Метод Draw
вызывается настолько часто, насколько это возможно, а метод Update
вызывается с частотой 30 раз в секунду, в отличие от версии игр для
компьютеров и Xbox 360, где этот метод вызывается 60 раз в секунду,
что позволяет уменьшить потребление электроэнергии.
Для управления игровыми объектами можно использовать сенсорный
экран. Для взаимодействия с сенсорным экраном используется класс
TouchPanel. Его метод GetState возвращает коллекцию объектов,
которые описывают точки касания. Каждый элемент коллекции
является экземпляром класса TouchLocation и содержит много
свойств, которые хранят информацию о месте экрана, к которому
прикоснулся пользователь.
Сенсорный экран — не единственное новое устройство ввода в
Windows Phone. Можно использовать акселерометр для создания игр, в
которых управление сводится к перемещению и вращению телефона.
Акселерометр может измерять ускорение по трём осям, а также
определять ориентацию телефона, поскольку на акселерометр действует
сила тяжести, которая задаёт постоянное ускорение к центру земли.
Драйвер акселерометра встроен в Windows Phone, и его можно
применять для получения значений как в программах XNA, так и в
программах Siiverlight.
В программе необходимо создать экземпляр класса Accelerometer и
назначить обработчик события ReadingChanged, которое
происходит каждый раз, когда акселерометр фиксирует новые значения.
В программе Silverlight может использовать эти значения как обычные
переменные, а также их можно связать со свойствами визуальных
3(51
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
элементов. В программе XNA нужно сделать локальную копию новых
значений и использовать их в методе Update.
Чтобы использовать класс Accelerometer, нужно добавить в проект
ссылку на библиотеку Microsoft.Devices.Sensors, а также
директиву using в файл кода. Для создания экземпляра класса
Accelerometer и добавления обработчика события можно
использовать следующий код:
protected override void InitializeQ
{
Accelerometer acc = new Accelerometer();
acc.ReadingChanged +=
new EventHandler<AccelerometerReadingEventArgs>(acc_ReadingChang
acc.StartO;
base.InitializeQ;
}
Метод XNA Initialize вызывается при запуске программы. После
добавления обработчика вызывается метод Start, чтобы программа
начала получать значения от акселерометра.
Метод-обработчик acc_ReadingChanged будет вызываться при
каждом изменении значений:
Vector3 accelState = Vector3.Zero;
void acc_ReadingChanged(object sender, AccelerometerReadingEventArgS e)
{
accelState.X = (float)e.X;
accelState.Y = (float)e.Y;
accelState.Z = (float)e.Z;
}
Дополнительные материалы
Windows Phone 7.5 Training Kit - https://
rusdpe.blob.core.windows.net/downloads/RusWP7TrainingKit.zip: Labs
\GameDevelopmentWithXNA\GameDevelopmentWithXNA.html\html\
3(536.
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
DocSet_defaute.html.
Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/ff434573.
Задание к работе
1. Создайте в Visual Studio проект программы XNA для Windows
Phone.
2. Добавьте в программу код для вывода на экран какого-либо
объекта и для его перемещения по экрану. Обратите внимание,
чтобы объект не выходил за пределы экрана.
3. Создайте необходимые ресурсы для приложения.
4. Добавьте в программу возможность управления движением
объекта с помощью сенсорного экрана (например, чтобы при
касании экрана объект изменял направление движения и двигался
к точке касания).
5. Запустите программу и проверьте правильность её работы.
6. Добавьте в программу один—два дополнительных объекта
(неподвижных или движущихся) и добавьте необходимый код для
обнаружения столкновений объектов друг с другом.
7. Запустите программу и проверьте правильность её работы.
8. Составьте отчёт о проделанной работе. Включите в отчёт
необходимые листинги программы.
363
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Совместное использование Silverlight и XNA
Цель работы: изучение возможностей совместного использования
технологий Silverlight и XNA в программе для Windows Phone.
Основные теоретические сведения
Можно создать решение Visual Studio, содержащее и приложение
Silverlight, и компонент игры XNA. Эту возможность удобно
использовать, например, для создания игровых меню, или можно
добавить элементы 3D графики в приложение Silverlight.
Для этого нужно создать решение Visual Studio, используя шаблон
Приложение Silverlight и XNA для Windows Phone. Новое решение
содержит три проекта.
Главным проектом будет приложение Silverlight, которое является
начальным проектом. Второй проект содержит набор необходимых
библиотек. Третий предназначен для хранения контента XNA для
игровой части решения.
При создании объединённого приложения также будет создана новая
страница Silverlight, которая будет содержать игру XNA. Игровой процесс
XNA размещается на странице GamePage.
Создание игровой среды XNA в Silverlight
При запуске игры XNA вызывается набор методов для инициализации
игры, загрузки игрового контента и периодического выполнения
обновления игрового мира и его перерисовки на экране. Когда игра
работает на странице Silverlight, необходимо обеспечить выполнение
этих действий.
protected override void OnNavigatedTo(NavigationEventArgs e)
protected override void OnNavigatedFrom(NavigationEventArgs e)
private void OnUpdate(object sender, GameTimerEventArgs e)
private void OnDraw(object sender, GameTimerEventArgs e)
364
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Эти методы находятся на странице игры, и их необходимо заполнить.
Метод OnNavigatedTo выполняет функции методов Initialise и
LoadContent, а методы OnUpdate и OnDraw выполняют функции
методов Update и Draw соответственно. Метод OnNavigatedTo
всегда вызывается, когда пользователь переходит на страницу, и здесь
игра должна загрузить контент и начать выполнение. Этот метод также
создаёт таймер, который выполняет вызовы методов OnUpdate и
OnDraw во время работы игры.
Обратите внимание, что программа XNA работает на странице
Silverlight, и пользователь может перейти на другую страницу
приложения. При этом вызывается метод OnNavigatedFrom,
который можно использовать, чтобы автоматически приостановить
игру при переходе на другую страницу приложения.
Чтобы запустить игру при нажатии на кнопку, в обработчик нажатия на
кнопку нужно добавить следующий код:
private void Button_Click(object sender, RoutedEventArgs e)
{
NavigationService.Navigate(new Uri("/GamePage.xaml", UriKind.Relative));
}
Если во время работы игры нажать кнопку телефона Назад, то
произойдёт переход к предыдущей странице, и игра закроется. Обратите
внимание, что игра перезапускается каждый раз при переходе на
страницу. При этом, игра перезагружает все текстуры и игровые
ресурсы. Было бы разумно сохранить текстуры и состояние игры в
отдельном классе и кэшировать данные, чтобы пользователь мог
вернуться на то место в игре, на котором он закончил её в прошлый раз.
Взаимодействие XNA и Silverlight
Существует возможность наложить визуальные элементы Silverlight
поверх игры XNA. Это позволяет легко добавить к игре кнопки и текст,
используя элементы Button и TextBlock. Для добавления
элементов Silverlight на экран игры сначала нужно создать элементы и
добавить их в файл GamePage.xaml:
365
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
<Grid xName="LayoutRoot">
<StackPanel>
<TextBlock x:Name="ScoreTextBlock" Text="0:0" TextAlignment="Center
Style="{StaticResource PhoneTextTitle1Style}" />
<Button Content="Quit" Name="quitButton" Width="480"
Click="quitButton_C]ick" />
</StackPanel>
</Grid>
Этот код создаёт элемент StackPanel с кнопкой и блоком текста.
Кнопка будет завершать игру, а в текстовом блоке будет отображаться
счёт игры.
Теперь эти элементы нужно вывести на экран. Рендеринг элементов
Silverlight выполняется в классе UIElementRenderer. Экземпляр
этого класса создаётся при загрузке страницы:
UIElementRenderer elementRenderer;
if (elementRenderer == null)
{
elementRenderer = new UIElementRenderer(this, (int)ActualWidth,
(int)ActualHeight);
}
Этот код проверяет, существует ли elementRenderer, и если нет —
создаёт его. Обратите внимание, конструктор этого элемента принимает
в качестве параметров ссылку на используемую страницу, ширину и
высота области для отрисовки.
Теперь этот объект можно использовать его в методе OnDraw для
создания элементов Silverlight:
private void OnDraw(object sender, GameTimerEventArgs e)
{
// рендеринг элементов Silverlight с помощью объекта UIElementRender
elementRenderer.Render();
SharedGraphicsDeviceManager. C urrent. GraphicsDevice .Clear(C olor.C ornflo
366
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
spriteBatch.Begin();
spriteBatch.Draw(baHTexture, ballRectange, Color.White);
spriteBatch.Draw(elementRenderer.Texture, Vector2.Zero, Color.White);
spriteBatch.End();
}
Элементы Silverlight будут выводиться поверх игровых объектов. Если
нужно использовать элементы Silverlight в качестве фона для игры, их
нужно выводить первыми. Во время работы игры XNA элементы
Silverlight отвечают на действия пользователя, и их можно связать с
обработчиками событий. Обработчики событий элементов можно
использовать даже если элементы не выводятся на экран.
Дополнительные материалы
Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/hh202931.
Задание к работе
1. Создайте в Visual Studio проект программы для Windows Phone,
использующей технологии Silverlight и XNA.
2. Добавьте в проект XNA код, созданный в предыдущей работе.
3. Добавьте в проект Silverlight необходимые элементы и код для
запуска проекта XNA.
4. Добавьте в программу необходимый код для приостановки
программы XNA, когда пользователь нажимает кнопку Назад, и
возобновления программы XNA, когда пользователь возвращается
к ней.
5. Запустите программу и проверьте правильность её работы.
6. Составьте отчёт о проделанной работе. Включите в отчёт
необходимые листинги программы.
367
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Использование системных функций в приложениях
Интерфейс приложений для Windows Phone основывается на концепции
Metro-стиля, который включает концепцию "'живых плиток"'. В телефоне
может быть установлено множество приложений, но одновременно
может работать только одно приложение. При этом, пользователь
может переключаться между приложениями, и у него должно быть
ощущение, что приложения работают параллельно. Приложения могут
создавать фоновые задачи, а также использовать различные системные
функции телефона, например, создавать сообщения SMS и электронной
почты, использовать камеру, мультимедиа ресурсы библиотеки телефона
и др. В этой главе вы познакомитесь с особенностями создания Metro-
приложений и особенностями их работы в Windows Phone.
Презентацию к данной главе Вы можете скачать здесь - h ttpy/old.intuit.ru/
department/se/devmobwphn/22/08.pplx
22.1. Значки и экраны-заставки приложений для
Windows Phone
Установленные в Windows Phone программы содержат два изображения,
по которым пользователи могут отличить одно приложение от другого.
В Windows Phone при нажатии на аппаратную кнопку Пуск на экран
выводится меню Пуск. Это меню является экраном, который содержит
плитки. Каждая плитка связана с одним из установленных приложений.
Пользователь может коснуться любой плитки и запустить связанную с
ней программу.
Кроме этого, пользователь может "'пролистать"' экран меню Пуск влево
(или нажать небольшую стрелку в верхнем правом углу экрана)!
перейти к списку всех установленных в устройстве приложений. Этот
список можно прокручивать вверх и вниз, и в нём также можно
запустить программу. Если пользователь хочет, чтобы интересующее его
приложение можно было запустить из главного экрана, он может
"'прикрепить"' это приложение к экрану.
При создании нового проекта приложения Silverlight Visual Studio создаёт
368
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
в проекте два файла со значками. В файле ApplicationIcon.png хранится
изображение, которое используется в списке приложений. Изображение
в файле Backgrounding используется, если приложение "прикреплено" к
главному экрану. При создании приложений XNA Visual Studio создаёт
такие же файлы, только вместо ApplicationIcon.png используется имя
файла GameThumbnaiLpng.
Файлы со значками можно редактировать в любом графическом
редакторе. При этом, необходимо сохранять тип файла и размеры
изображений. Значки в программе также помогают более успешно
продвинуть приложение в Marketplace.
Экран-заставка — это первый экран приложения, который выводится
на экран Windows Phone при запуске приложения. Экран-заставка может
содержать информацию о приложении, логотип и название компании и
т.п. Пользователь видит экран-заставку приложения, пока оно
загружается в память устройства.
Система Silverlight поддерживает использование экранов-заставок. При
создании нового проекта Silverlight создаётся файл изображения,
который отображается на экране с момента запуска приложения до тех
пор, пока на экран не выведется страница MainPage. Если в программе
используется много элементов и ресурсов, для загрузки приложения
может понадобиться некоторое время. Для создания собственной экран¬
заставки нужно отредактировать файл SplashScreenImage.jpg в проекте
Silverlight.
В отличие от Silverlight, ресурсы программы XNA не содержат экранов-
заставок как таковых, поскольку программы XNA выполняются иначе.
При запуске программы XNA вызывается метод LoadContent,
который загружает все ресурсы игры, после чего вызываются методы
Draw и Update, и использование экрана-заставки может привести к
проблемам. Среда XNA ожидает, что приложение выведет на экран
какое-нибудь изображение в течение пяти секунд после запуска
программы. Если за это время ничего не выводится, выполнение
приложения прерывается.
Однако, среда XNA не должна загружать сразу весь контент при запуске
приложения. Игра может использовать контент-менеджер для загрузки
369
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
ресурсов в любое время, и даже может выполнять фоновую загрузку
ресурсов в несколько потоков. Таким образом, при создании
приложения XNA необходимо разработать стратегию загрузки контента.
Например, в методе LoadContent можно загружать только текстуру
экран-заставки, которая может выводиться на экран в то время, как
приложение будет загружать остальные элементы контента.
Такая проблема характерна для игр на всех платформах. Главным
ограничивающим фактором при разработке игр для консолей является
ограниченная скорость доступа и скорость передачи данных с устройств
для чтения оптических дисков, используемых для загрузки информации
с игровых носителей.
22.2. Быстрое переключение приложений
Устройства Windows Phone являются довольно мощными устройствами,
однако, по сравнению с настольными системами их ресурсы несколько
ограничены. Например, мощность процессоров телефонов ограничена
ёмкостью аккумулятора, и хотя телефон может выполнять большой
объём работы, лучше стараться сводить её к минимуму, чтобы продлить
время автономного использования аккумулятора.
Операционная система Windows Phone, по сути, является
многозадачной. Это означает, что одновременно в ней может
выполняться несколько процессов. Например, телефон может
воспроизводить музыку в программе Zune, и в это время можно
проверить электронную почту. Однако, по многим техническим
причинам такая многозадачность не распространяется на запущенные в
системе приложения. Создатели системы Windows Phone приняли
решение не позволять более чем одному приложению быть активным в
любой момент времени.
При создании приложения основная задача заключается в том, чтобы
приложение не завершалось, когда пользователь оставляет это
приложение и переходит к выполнению других задач. В этом случае
необходимо сохранить данные приложения, используя запоминающее
устройство телефона, и загрузить данные, когда пользователь вернётся к
приложению. Выполнение этих операций создаёт иллюзию того, что
программа никогда не останавливается.
370
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
В Windows Phone есть специальные средства для переключения между
программами. Они основаны на использовании аппаратных кнопок
Назад и Пуск, которые есть во всех устройствах Windows Phone.
Кнопка Пуск позволяет пользователю запустить новую программу, а
кнопка Назад переносит пользователя к предыдущему экрану.
Пользователь может в любое время нажать кнопку Пуск, чтобы открыть
экран меню Пуск и запустить в нём другую программу, а при нажатии
на кнопку Назад вернуться к запущенной ранее программе. Таким
образом, кнопки Пуск и Назад позволяют пользователю перемещаться
между часто используемыми приложениями.
При нажатии на кнопку Пуск приложение не удаляется из памяти —
вместо этого оно становится неактивным и позже может продолжить
работу, если пользователь снова вызовет это приложение. Однако,
пользователь может не скоро вернуться к этому неактивному
приложению, поэтому оно должно сохранить все важные данные.
В дополнение к обычному нажатию на кнопку Назад пользователь
может удерживать её в течение секунды, чтобы увидеть список
запущенных приложений. Если пользователь выбирает одно из этих
приложений, оно снова запускается, как если бы пользователь вернулся
к нему, нажав кнопку Назад. Так пользователь может вернуться к ранее
запущенному приложению.
В Windows Phone реализована концепция, которая получила название
"быстрое переключение приложений". Поскольку неактивные
программы обычно сохраняют своё состояние в оперативной памяти,
переключение между ними выполняется довольно быстро.
В файле приложения Silveriight App.xaml.cs описаны методы, которые
вызываются, когда происходят события, связанные с переключением
приложений:
// Код для выполнения при запуске приложения (например, из меню "П
// Этот код не будет выполняться при повторной активации приложени
private void Application_Launching(object sender, LaunchingEventArgs e)
{
}
371
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
// Код для выполнения при активации приложения (переводится в осно
// Этот код не будет выполняться при первом запуске приложения
private void Application_Activated(object sender, ActivatedEventArgs e)
{
}
// Код для выполнения при деактивации приложения (переводится в фо
// Этот код не будет выполняться при закрытии приложения
private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
}
// Код для выполнения при закрытии приложения (например, при нажг
// кнопки "Назад")
// Этот код не будет выполняться при деактивации приложения
private void Application_Closing(object sender, ClosingEventArgs e)
{
}
Класс App контролирует процесс создания и управления страницами
Silverlight. При создании приложений необходимо использовать эти
методы, которые связаны с соответствующими событиями, чтобы
программа всегда была готова к работе. Подобный набор сообщений
доступен программам XNA, с помощью которого игры могли быть
сохранять своё состояние.
Жизненный цикл приложения для Windows Phone
Запуск программы. Пользователь запускает установленную в телефоне
программу. В процессе запуска программные файлы загружаются в
память и обрабатываются процессором Windows Phone. При этом,
вызывается метод Application_Launching, который загружает
необходимые данные из изолированного хранилища. Однако, если
требуется загрузить большой объём данных, лучше выполнять загрузку в
отдельном потоке (то есть в фоновом режиме) — иначе приложение
ничего не будет выводить на экран, пока этот метод не закончит работу.
После этого пользователь может завершить работу программы, нажав
372
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
кнопку Назад, если он находится на главной странице программы, или
перейти в другую программу, нажав кнопку Пуск.
Завершение работы программы при нажатии на кнопку Назад. В
приложениях для Windows Phone нет кнопки Закрыть, которая закрывала
бы приложение. Однако, приложение можно закрыть, если
пользователь находится на главной странице приложения (то есть, на
той странице, которая выводится на экран при запуске приложения) и
нажмёт кнопку Назад. В этом случае оно выгружается из памяти, и
происходит переход к открытому ранее приложению (если такое есть).
Таким образом, пользователь может перейти к другому приложению и
после завершения работы с ним вернуться к текущему приложению.
Как и приложения для настольных компьютеров, приложение Windows
Phone может использовать событие, которое происходит при закрытии
приложения, для сохранения открытых файлов. Соответствующий код
нужно указать в методе Application_Closing. Также можно
добавить вывод окна, в котором пользователь может подтвердить
намерение закрыть приложение.
Однако, пользователи не всегда закрывают приложения "правильно" и
могут перейти к другому приложению, не закрыв текущее. При
разработке приложения необходимо обратить внимание на то, чтобы
оно не теряло важные данные, если пользователь забыл сохранить (или
отменить) сделанные в программе изменения.
Деактивация приложения нажатием кнопки Пуск. Если пользователь
нажмёт на кнопку Пуск, работающая в этот момент программа
деактивируется. При этом, программа останется в памяти, но будет
неактивной, и её работу можно будет возобновить, используя быстрое
переключение приложений.
При деактивации приложения происходит событие, которое
обрабатывается в методе Application_Deactivated, и после
этого приложение переходит в состояние бездействия. Этот метод
должен содержать код для сохранения текущего состояния работы
программы и данных в изолированном хранилище на тот случай, если
пользователь не возобновит работу приложения, и оно будет выгружено
из памяти. Также программа деактивируется, когда телефон отображает
373
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
экран блокировки, или когда пользователь нажимает кнопку Поиск, или
когда пользователь использует камеру и т.д.
Выгрузка из памяти бездействующего приложения. При увеличении
количества бездействующих приложений память телефона рано или
поздно заканчивается. В этом случае некоторые приложения должны
удаляться из памяти, чтобы освободить место для других приложений. В
терминах Windows Phone приложение изменяет статус "бездействующее"
(которое хранится в памяти и доступно для быстрого переключения
приложений) на "выгруженное" (удалённое из памяти). Пользователь
все ещё может возобновить выгруженное приложение, если достаточно
много раз будет нажимать на кнопку Назад или выберет его из меню
диспетчера запущенных приложений. При этом, для возобновления
работы выгруженного приложения понадобится больше времени по
сравнению с возобновлением работы бездействующего приложения.
При возобновлении работы выгруженной программы она будет заново
загружаться в память и также заново создавать все её объекты, как если
бы программа запускалась впервые. Однако, есть отличия в процессе
возобновления выгруженной программы от запуска программы.
Система Windows Phone предоставляет программе некоторый объём
памяти для сохранения информации о состоянии приложения. В случае
возобновления работы программы её можно загрузить обратно. Эта
информация сохраняется, если приложение деактивировано,
бездействует или выгружено.
Система Windows Phone также использует эту область памяти. Если
деактивировать приложение, то при возврате к нему открывается та же
самая страница приложения, которая была открыта перед деактивацией
приложений. Система Silverlight использует хранилище состояния для
сохранения в памяти активной страницы приложения при его
деактивации.
Возобновление бездействующего или выгруженного приложения. При
запуске приложения происходит событие Launching, а при
возобновлении работы приложения — событие Activated. В
последнем случае приложение может проверить, из какого состояния
оно восстанавливается — из состояния "бездействует" или состояния
"выгружено":
374
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
private void Application_Activated(object sender, ActivatedEventArgs e)
{
if (e.IsApplicationInstancePreserved)
{
// восстановление из состояния "бездействует"
// все объекты сохранены в памяти
}
else
{
// восстановление из состояния "выгружено"
// требуется повторная загрузка объектов
}
}
Этот метод выполняется при возобновлении работы приложения и
проверяет, из какого состояния оно возобновляет работу. В зависимости
от этого, можно выполнять различные действия. Обратите внимание,
что при изменении статуса приложения с "бездействует" на "выгружено"
никакие события не генерируются, и определить предыдущий статус
приложения можно только после того, как приложение возобновит
работу.
Добавление возможности быстрого переключения
приложений
Рассмотрим, как приложение должно использовать возможность
быстрого переключения приложений на примере приложения для
создания текстовых заметок, которое было рассмотрено в главе 5.
Обновлённое приложение будет называться Журнал заметок (рис. 22.1).
Оно позволит пользователю хранить последовательность записей в файле
журнала. Каждая запись имеет "штамп времени", который добавляется при
сохранении введённой записи и затем добавляется в журнал, который
является длинной строкой текста. При запуске программы на экран
выводится главная страница, на которой можно добавить запись.
Пользователь может ввести текст в текстовое поле и нажать кнопку
сохранить, чтобы добавить запись в журнал, или нажать
375
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
кнопку журнал для перехода к другой странице программы, на которую
выводятся сохранённые ранее записи.
L
журнал Заметок
заметка
3 апреля 2012 г. а Самаре состоялась
конференция Microsoft
WebProf essi опэ I s
сохранить
журнал
W
е
г
t
У
и
*
0
а
S
d
f
g
h
j
k
t
t
Z
X
c
V
b
г
m
<*Г
*12 3
t
space
FNG
*
<->
Рис. 22.1. Экран программы Журнал заметок
Если во время работы с нашей программой пользователь откроет
376
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
другую программу, и позже вернётся к Журналу заметок, то программа
должна сохранять данные о состоянии в память, чтобы у пользователя
сложилось впечатление, что программа всё это время была загружена в
память. Если пользователь нажимает кнопку Пуск для перехода к
другому приложению, можно сохранять данные приложения во
временной памяти, а не на основном запоминающем устройстве. Тогда
пользователь может позже вернуться к приложению и сохранить
сделанные ранее изменения, а если пользователь не обращается к
приложению довольно долго или перезагружает телефон, то сделанные
несохранённые изменения ему, скорее всего, не нужны.
Данные программы. Программа Журнал заметок содержит только два
строковых элемента данных: один содержит все заметки, которые
выводятся на экран на странице журнала, а другой содержит рабочий
текст новой заметки, который пользователь редактирует на странице
добавления заметки.
// эта переменная используется всеми страницами приложения
// она содержит текст всех заметок в виде длинной строки
public string LogText;
// эта переменная используется только на странице добавления новой з
public string LogEntry = "";
Эти переменные лучше объявить в классе App, который объявлен в
файле App.xaml.cs. Этот файл является "контейнером" для всего
приложения, и в нём можно разместить данные, которые совместно
используются всеми страницами приложения. Также этот класс
содержит методы, которые используются для управления быстрым
переключением приложений и позволяют сохранять и загружать
данные о программе.
Перемещение между страницами приложения. В этом приложении
будет две страницы, между которыми пользователь может
перемещаться. Важно, чтобы страница всегда отображала правильные
данные. Для этого можно использовать метод OnNavigatedTo:
protected override void OnNavigatedTo(System.Windows.Navigation.Navigatio:
{
377
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
// получение ссылки на активное приложение
App thisApp = App.Current as App;
// вывод текста заметки на экран
logTextBox.Text = thisApp.LogEntry;
}
Silverlight вызывает этот метод, когда пользователь программы переходит
на эту страницу. Код метода получает ссылку на класс App приложения,
получает текст заметки и выводит его на страницу в элемент TextBox.
При каждом выводе страницы на экран, она будет отображать
последнюю версию текста заметки.
Когда пользователь переходит на другую страницу, необходимо
сохранить текст заметки, который ввёл пользователь, чтобы при
возврате пользователя на эту страницу его можно было загрузить в
текстовое поле:
protected override void OnNavigatedFrom(
System.Windows.NavigatioaNavigationEventArgs e)
{
base.OnNavigatedFrom(e);
// получение ссылки на активное приложение
App thisApp = App.Current as App;
// сохранение текста заметки в памяти приложения
thisApp.LogEntry = logTextBox.Text;
}
Метод OnNavigatedFrom вызывает Silverlight при переходе
пользователя на другую страницу. Метод копирует текст текстового поля
в память приложения. Фактически, выполняются действия, обратные
действиям метода OnNavigatedTo.
Эти методы не играют особой роли для быстрого переключения
приложений, а позволяют перемещаться между страницами и
гарантируют, что страницы всегда выводят на экран правильную
информацию.
378
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Сохранение данных при закрытии приложения. Если пользователь
нажимает кнопку Назад, находясь на главной странице приложения,
система Silverlight закроет приложение. При этом будут вызываться два
метода:
1. Метод OnNavigatedFrom страницы, на которой находится
пользователь.
2. Метод Application_Closing для сохранения данных
приложения.
Метод OnNavigatedFrom копирует данные с текущей страницы в
память приложения, а метод Application_Closing должен
сохранять эти данные в изолированном хранилище.
private void Application_Closing(object sender, ClosingEventArgs e)
{
SaveToIsolatedStorage();
}
Метод SaveToIsolatedStorage должен сохранять значения
переменных logText и LogEntry в изолированном хранилище.
Загрузка данных при запуске приложения. Код для загрузки данных из
изолированного хранилища при запуске приложения можно поместить
в метод Application_Activated:
private void Application_Launching(object sender, LaunchingEventArgs e)
{
LoadFromIsolatedStorage();
}
Метод LoadFromIsolatedStorage должен загружать данные из
изолированного хранилища в переменные приложения.
После выполнения метода Application_Launching система
Silverlight загружает страницу приложения и вызывает её метод
OnNavigatedTo, который выведет на страницу необходимые данные.
Обработка нажатия кнопки Пуск. Если во время работы приложения
379
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
пользователь нажмёт кнопку Пуск, приложение перейдёт в состояние
"бездействует". При этом, последовательно вызываются методы
OnNavigatedFrom и Application_Deactivated. В последний
метод можно добавить код для сохранения данных приложения.
private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
SaveToIsolatedStorageQ;
S aveTo StateObj ect();
}
Этот метод сохраняет данные в изолированном хранилище на случай,
если пользователь не вернётся к этому приложению, а также в
хранилище состояния, которое можно использовать для восстановления
состояния приложения, если пользователь возобновляет работу
программы.
Возобновление работы программы. Если пользователь возобновляет
работу программы, она должна восстановить сохранённые данные.
Приложение может быть активировано в одном из двух случаев:
• приложение активируется из состояния "бездействует". В этом
случае все данные программы остаются в памяти, и их не нужно
восстанавливать;
• приложение активируется из состояния "выгружено". В этом
случае программа должна заново загрузить все данные. При этом,
можно использовать данные, сохранённые в хранилище
состояния при деактивации приложения.
Эти действия выполняет следующий метод:
private void Application_Activated(object sender, ActivatedEventArgs e)
{
if (!e.IsApp]icationInstancePreserved)
{
// восстановление всех объектов приложения,
// поскольку оно активировано из состояния "выгружено"
LoadFromStateObject();
}
380
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
}
Если приложение активировано из состояния "выгружено", то флаг
IsApplicationInstancePreserved будет иметь значение true, а
если из состояния "бездействует" — значение false.
Сохранение состояния. Программа может использовать изолированное
хранение для хранения информации о её состоянии, даже если оно
бездействует. Однако, для сохранения небольших объёмов данных этот
способ является довольно громоздким. Для этого в Windows Phone
можно использовать хранилище состояния. Разные программы
используют разные хранилища состояния, и эти хранилища недоступны
другим программам. Хранилище состояния сохраняет данные, даже
если приложение находится в состоянии "выгружено".
Программа Журнал заметок может использовать эту область для
сохранения данных при переходе в состояние "выгружено".
Возобновление работы программы будет осуществляться гораздо
быстрее, чем из изолированного хранилища.
private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
SaveToIsolatedStorage();
S aveTo StateObj ect();
}
Этот метод вызывается, когда приложение переходит в состояния
"выгружено". Метод SaveToStateObject описывается в файле
App.xaml.cs и сохраняет состояние программы в памяти, используя
вспомогательный метод для сохранения в хранилище состояния одной
строки:
private void SaveToStateObject()
{
SaveTextToStateObject("Log", LogText);
SaveTextToStateObject('Entry", LogEntry);
}
Метод SaveTextToStateObject принимает два параметра: имя
сохраняемого элемента и его значение:
381
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
private void SaveTextToStateObject(string filename, string text)
{
IDictionary<string, object> stateStore = PhoneAppHcationService.Ciirrent.Sla
stateStore.Remove(filename);
stateStore.Add(filename, text);
}
Хранилище состояния представляет собой словарь объектов, который
хранится в PhoneApplicationService.Current.State.
Чтобы получить доступ к этому словарю, в программу нужно добавить
ссылку на пространство имён Microsoft.Phone.Shell. Вся
работа с хранилищем данных выполняется точно так же, как и с любым
словарём.
Аналогично выполняется код для загрузки значений из хранилища
состояния:
private bool LoadTextFromStateObject(string filename, out string result)
{
IDictionary<string, object> stateStore = PhoneApplicationService.Current.Sts
result = "";
if (!stateStore.ContainsKey(filename))
return false;
result = (string)stateStore[filename];
return true;
}
Класс словаря содержит метод ContainsKey, который проверяет,
были ли сохранены данные приложения, и если этот метод возвращает
true, данные можно загрузить из памяти. В противном случае данные
необходимо загрузить из изолированного хранилища.
Использование навигации и быстрого переключения приложений.
382
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Система Silverlight запоминает последнюю используемую страницу
приложения, а также последовательность страниц, которые открыл
пользователь до перехода на эту страницу. Когда пользователь
возвращается к приложению, эта информация используется для того,
чтобы пользователь мог перейти к предыдущим страницам
приложения.
Однако, необходимо помнить, что при этом сохраняется только история
открытых страниц, но не содержимое каждой страницы. Для загрузки
содержимого на каждой странице можно использовать метод
OnNavigatedTo на каждой странице.
Использование быстрого переключения приложений
при разработке приложения
При отладке приложения в Visual Studio также можно переключиться на
другое приложение, нажав в эмуляторе кнопку Пуск. При перезапуске
приложения все сеансы отладки в среде разработки автоматически
возобновляются. Это работает, даже если отладка приложения
выполняется в физическом устройстве Windows Phone.
При выполнении программы необходимо удостовериться, что она
работает правильно, в том числе при выгрузке из памяти и
возобновлении работы. Windows Phone выгружает программу, только
когда вся память устройства будет заполнена.
В Visual Studio можно указать, что программа должна выгружаться из
памяти при переходе в состояние "бездействует". Для этого в свойствах
проекта на вкладке Отладка нужно поставить галочку в пункте
Отметить как удаленный в результате деактивации во время. Эту
возможность удобно использовать при тестировании программы и
использовании быстрого переключения приложений.
Игра XNA также может обрабатывать события приостановки и
деактивации приложения. Таким образом, игры могут сохранять
состояние и рекорды, когда пользователь переключается к другому
приложению.
383
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
22.3. Задачи запуска и задачи выбора
В приложениях для Windows Phone можно вызывать системные
функции телефона. Эта возможность реализована с помощью
программных объектов, называемых задачи запуска и задачи выбора.
Задачи запуска позволяют вызывать функции телефона, которые не
возвращают данных. Задачи выбора позволяют выбирать какие-либо
объекты в функциях телефона и обрабатывать возвращаемые функциями
значения.
Задачи запуска и задачи выбора при их вызове автоматически
деактивируют программу, поскольку при этом происходит переход к
другой программе. По завершении задачи программа возобновляет свою
работу.
Использование задач запуска
Существует множество задач запуска, которые вызывают различные
функции телефона. Классы для работы с задачами объявлены в
пространстве имён Microsoft. Phone .Tasks:
• PhoneCallTask — запускает приложение Телефон и задаёт
номер телефона и отображаемое имя. При этом, программа не
может инициировать звонок — это должен сделать пользователь;
• EmailComposeTask — запускает приложение электронной
почты и создаёт новое письмо, которое пользователь может
отправить;
• SmsComposeTask — запускает приложение Сообщения и
выводит на экран новое SMS-сообщение, которое пользователь
может отправить;
• SearchTask — запускает приложение Поиск в Интернете и
задаёт поисковый запрос;
• WebBrowserTask — запускает веб-браузер и выводит на экран
заданный URL;
• MediaPlayerLauncher — запускает медиапроигрыватель и
воспроизводит заданный файл мультимедиа;
• MarketplaceReviewTask — запускает клиентское
384
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
приложение Windows Phone Marketplace и отображает страницу
обзора для указанного программного продукта;
• MarketplaceDetailTask — запускает клиентское
приложение Windows Phone Marketplace и отображает страницу
подробной информации для указанного программного продукта;
• MarketplaceHubTask — запускает клиентское приложение
Windows Phone Marketplace;
• MarketplaceSearchTask — запускает клиентское
приложение Windows Phone Marketplace и отображает результаты
поиска по указанному запросу;
• BingMapsDirectionsTask — запускает приложение Bing
Maps и задаёт начальный и конечный пункты маршрута;
• BingMapsTask — запускает приложение Bing Maps и выводит
на экран карту по текущему или заданному расположению;
• ConnectionSettingsTask — позволяет пользователям
изменять настройки подключения телефона;
• ShareStatusTask — позволяет отображать сообщение о
состоянии, которое пользователь может отправить в выбранные
социальные сети;
• ShareLinkTask — позволяет пользователю опубликовать URL
в выбранных социальных сетях.
В приложении можно вызвать одну из этих задач, и после её
выполнения приложение возобновит работу. Однако, не гарантируется,
что приложение возобновит работу, поскольку пользователь может
перейти к другому приложению.
Рассмотрим пример использования задачи запуска для отправки
сообщений электронной почты (рис. 22.2).
385
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
ЖУРНАЛ ЗАМЕТОК
заметка
Компания Nokia выпустит Nokia
Lumia 900 8 России
Рис. 22.2. Окно приложения для отправки электронной почты
При нажатии на кнопку отправить пользователь может отправить
введённый текст в качестве сообщения электронной почты:
private void mai]Button_Click(object sender, RoutedEventArgs e)
3 86
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
{
sendMail("Сообщение из программы", mailTextBox.Text);
}
При нажатии на кнопку отправить обработчик события передаёт текст
из текстового поля в метод sendMail метод для его отправки по
электронной почте. Код метода sendMail может быть таким:
private void sendMai](string subject, string body)
{
EmailComposeTask email = new EmailComposeTask();
emaiLBody = body;
emaiLSubject = subject;
emaiLShowO;
}
Это метод создаёт экземпляр класса EmailComposeTask,
присваивает свойствам Body и Subject заданные значения
параметров. Если в телефоне настроен клиент электронной почты, то
при вызове метода Show открывается окно, в котором отображается
новое сообщение электронной почты, и пользователь может его
отправить.
Использование задач выбора
Приложениям телефона доступны следующие задачи выбора:
• CameraCaptureTask — запускает приложение Камера и
позволяет пользователю создавать фотографии в приложении;
• EmailAddressChooserTask — запускает приложение
Контакты и позволяет пользователю выбирать адрес электронной
почты контакта;
• PhoneNumberChooserTask — запускает приложение
Контакты и позволяет пользователю выбирать номер телефона
контакта;
• PhotoChooserTask — запускает приложение Выбор
387
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
фотографий и позволяет пользователю выбирать фотографии;
• SaveEmailAddressTask — запускает приложение Контакты
и позволяет пользователю сохранять указанный адрес
электронной почты в новый или существующий контакт;
• SavePhoneNumberTask — запускает приложение Контакты и
позволяет пользователю сохранять указанный номер телефона в
новый или существующий контакт;
• AddressChooserTask — запускает приложение Контакты и
позволяет пользователю выбирать адрес контакта;
• GameInviteTask — позволяет пользователю приглашать
игроков для совместной игры;
• SaveContactTask — предоставляет методы и события для
запуска приложения Контакты и позволяет пользователю
сохранять контакты;
• SaveRingtoneTask — запускает приложение мелодий
звонков и позволяет пользователю сохранять аудиофайл в список
системных мелодий телефона.
Задачи выбора выполняются так же, как и задачи запуска, но есть одно
отличие: задача выбора возвращает в вызвавшее её приложение
результат. Обработка результата в приложении осуществляется в методе-
обработчике события окончания выполнения задачи.
Рассмотрим пример использования задачи выбора для выбора
пользователем изображения из библиотеки телефона и его вывода на
экран. Связанный с задачей объект создаётся в конструкторе
приложения:
PhotoChooserTask photoChooser;
// конструктор
public MainPageO
{
InitializeComponent();
photoChooser = new PhotoChooserTask();
photoChooser.Completed += new EventHandler<PhotoResult>(photoChoose
}
388
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
В этом коде создаётся новый экземпляр класса PhotoChooserTask и
обработчик события, которое происходит при завершении выполнения
задачи. Код обработчика выводит полученное изображение на экран.
void photoChooser_Completed(object sender, PhotoResult e)
{
if (e.TaskResult == TaskResult.OK)
{
selectedImage.Source = new BitmapImage(new Uri(e.OriginalFileName));
}
}
Этот метод создаёт новый экземпляр класса BitmapImage, используя
адрес файла с выбранным пользователем изображением, и указывает
его в качестве источника для визуального элемента selectedImage.
Обратите внимание, что свойство TaskResult позволяет программе
определить, выбрал ли пользователь какое-то изображение.
Вызвать задачу выбора изображения можно в обработчике нажатия на
кнопку загрузить:
private void loadButton_Click(object sender, RoutedEventArgs e)
{
photoChooser.Show();
}
Эта задача выбора не будет выполняться в эмуляторе Windows Phone,
поскольку он не содержит библиотеку изображений. Для правильной
работы созданного приложения необходимо запустить его в физическом
устройстве.
22.4. Фоновые задачи
Обычно в Windows Phone одновременно может быть активным только
одно приложение. Однако, в некоторых случаях необходимо, чтобы
неактивное приложение выполняло какие-то действия. Операционная
система Windows Phone поддерживает возможность фоновой обработки,
что позволяет разработчику создать код, который будет выполняться,
когда приложение будет неактивным.
3839
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Однако, это не означает, что вся программа будет выполняться в
фоновом режиме. Фоновые компоненты отделены от приложения, не
имеют пользовательского интерфейса, строго ограничены в
возможностях. Операционная система телефона закрывает фоновые
задачи, если память, батарея или сетевое подключение исчерпывает
свои возможности. Пользователь также может отключать фоновые
задачи для выбранного приложения.
Фоновые задачи не являются фундаментальной частью работы
приложения, поскольку они могут не выполняться, и пользователь
может их отключить. Примером такой задачи может быть приложение
для Интернет-магазина, которое выводит на экран сообщение, когда
запрошенный товар появляется на складе, или приложение новостей,
которое выводит заголовки последних новостей на плитке экрана Пуск
Фоновые и запланированные задачи
Существует множество различных типов фоновых процессов, среди
которых часто используются два типа фоновых задач общего
назначения: периодические и ресурсоёмкие задачи. Эти задачи
создаются одинаково, однако они используются в различных ситуациях:
• периодические задачи выполняются в течение небольшого
промежутка времени (до 15 секунд) и запускаются с одинаковыми
временными интервалами — обычно каждые полчаса;
• ресурсоёмкие задачи выполняются в течение более длительного
времени (до 10 минут), когда телефон заблокирован (то есть
пользователь не выполняет никаких действий), подключён к
источнику энергии и высокоскоростному подключению к сети.
Периодические задачи удобно использовать, например, для обновления
прогноза погоды, информации о состоянии или отслеживания
местоположения. Ресурсоёмкие задачи можно использовать для
загрузки обновлений в базах данных, выполнения обработку или
сжатия данных.
При обсуждении фоновой обработки задач необходимо разобраться в
значениях некоторых терминов. Задача — это контейнер, которым
390
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
управляет операционная система, и который запускается при
выполнении определённых условий. Агент — это программный код,
который выполняет работу задачи. При создании агента создаётся
элемент, который будет работать либо в периодическом, либо в
ресурсоёмком режиме. Когда агент получает управление, он может
определить, в каком режиме он работает.
В качестве примера добавим в программу Журнал заметок возможность
отслеживания местоположения. Отслеживание местоположения будет
выполнять задача, которая периодически получает информацию о
местоположении с устройства GPS в телефоне и сохраняет её со
штампом времени в журнале заметок. Фоновая задача будет сохранять
информацию о местоположении, когда программа будет неактивна.
Добавление фоновой задачи
Для фоновой задачи в решении Windows Phone создаётся
дополнительный проект на основе шаблона Агент запланированных
заданий Windows Phone. Этот шаблон позволяет создавать
периодические и ресурсоёмкие задачи. При построении решения проект,
содержащий код для запланированной задачи, добавляется к другим
частям приложения.
Запланированная задача программы использует код в проекте агента.
Необходимо, чтобы код агента мог использоваться в главном проекте.
Для этого в Visual Studio необходимо добавить в главный проект ссылку
на проект агента. Это делается так же, как и добавление ссылки на
любую библиотеку.
При создании фоновой задачи Visual Studio создаёт пустой шаблон, в
который можно добавить код агента.
namespace LocationTaskAgent
{
public class ScheduledAgent : ScheduledTaskAgent
{
protected override void OnInvoke(ScheduledTask task)
{
391
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
// здесь должен быть код для выполнения задачи
NotifyCompleteQ;
}
}
}
Код задачи должен находиться в методе OnInvoke. При завершении
метода он должен вызвать метод NotifyComplete, чтобы
остановить выполнение задачи. При этом, нет возможности узнать,
когда будет выполняться задача, и будет ли она вообще выполняться —
это зависит от того, разрешил ли пользователь выполнение фоновых
задач для приложения, и когда наступит время выполнения задачи.
Агент может определить тип выполняемой задачи, определяя тип
параметра task, переданного в метод OnInvoke:
if (task is PeriodicTask)
{
// выполняется периодическая задача
}
В нашем приложении задача должна загрузить строку журнала из
изолированного хранилища, добавить в неё информацию о
местоположении и сохранить строку журнала. Приложение и его
фоновая задача совместно используют одну и ту же область
изолированного хранилища. При этом, приложение и агент не
используют этот ресурс одновременно, поскольку фоновая задача
никогда не будет выполняться, если приложение будет активно.
protected override void OnInvoke(ScheduledTask task)
{
string message = "";
string logString = "";
if (loadTextFromIsolatedStorage("Log", out logString))
{
message = "Загружено";
392
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
}
else
{
message = "Инициализировано";
}
// если строка загружена, к ней добавляется информация о местополо
N otifyComplete();
}
Эта часть агента фоновой задачи вызывает метод для загрузки журнала
из изолированного хранилища. Этот код аналогичен коду, который
используется для сохранения и загрузки данных в основной программе.
Если журнал первоначально пуст (то есть агент начал работу до того,
как приложение сохранило что-нибудь в изолированном хранилище), то
переменной для хранения сообщения присваивается соответствующее
значение.
Далее необходимо определить местоположение телефона и добавить эту
информацию в журнал.
protected override void OnInvoke(ScheduledTask task)
{
GeoCoordinateWatcher watcher = new GeoCoordinateWatcherQ;
GeoPosition<GeoCoordinate> position = null;
watcher.StatusChanged += new EventHandler<GeoPositionStatusChangedEv
(delegate(object sender, GeoPositionStatusChangedEventArgs e)
{
if (e.Status == GeoPositionStatus.Ready)
{
position = watcher.Position;
GPSDoneFlag.Set();
}
});
393
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
GPSDoneFlag.Reset();
watcher.StartQ;
// ожидание получения координат, но не дольше 10 секунд
GPSDoneFlag.WaitOne(10000);
// через 10 секунд будет получена строка или произойдёт тайм-аут
}
Эта часть фонового агента создаёт новый экземпляр класса
GeoCoordinateWatcher и запускает его.
GeoCoordinateWatcher генерирует событие StatusChanged,
когда изменяется состояние GPS. Код обработчика события считывает
местоположение и устанавливает флаг для синхронизации потоков,
если информация с устройства GPS доступна.
Считанную с GPS информацию приложение должно сохранить в
качестве заметки в журнале.
protected override void OnInvoke(ScheduledTask task)
{
string positionString;
if (position != null)
positionString = position.Location.ToStringO;
else
positionString = "не известно";
DateTime timeStamp = DateTime.Now;
string timeStampString = timeStamp.ToShortDateStringQ + " " +
timeStamp.ToShortTimeStringQ + System.Environment.NewLine;
logString = logString + timeStampString + positionString;
3*9-4
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
saveTextToIsolatedStorage("Log", logString);
}
Этот код создаёт текстовое сообщение, которое содержит значение
местоположения или строку "не известно", если значение недоступно,
добавляет его к строке журнала и сохраняет журнал в изолированном
хранилище.
После сохранения сообщения программа может сообщить пользователю
о том, что задача выполнена. Фоновая задача не имеет
пользовательского интерфейса, но она может выводить на экран
всплывающие сообщения или изменять плитки на экране Пуск.
Для вывода на экран всплывающего сообщения используется класс
ShellToast. Необходимо создать его экземпляр, указать заголовок и
текст, который должен отображаться в окне сообщения, и вызвать метод
Show.
protected override void OnInvoke(ScheduledTask task)
{
ShellToast toast = new SheHToastQ;
toast.Title = "Журнал заметок";
toast.Content = message + positionString;
toast.Show();
}
Для отладки фонового агента в Visual Studio можно использовать
контрольные точки и пошаговое выполнение кода, как и в любой другой
программе.
Во время отладки неудобно ждать по 30 минут, пока фоновая задача
запустится. При отладке приложения в Visual Studio доступен метод, при
вызове которого фоновая задача запускается для тестирования. Можно
использовать условную компиляцию, чтобы метод для запуска фонового
395
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
агента вызывался только при отладке программы. Для этого в начало
файла нужно добавить следующую строку:
#define DEBUG_AGENT
Определив этот символ, можно указать компилятору обрабатывать код
для запуска агента.
protected override void OnInvoke(ScheduledTask task)
{
#if DEBUG_AGENT
ScheddedActionService.LaunchForTest(l:ask.Name, TimeSpan.FromSeconds
#endif
N otifyCompleteQ;
}
Этот код запускает код фонового агента запускается в фоновом режиме с
задержкой 60 секунд.
При вызове метода NotifyComplete агент фоновой задачи сообщает
система Windows Phone о завершении работы.
Операционная система Windows Phone содержит класс
ScheduledActionService, который управляет всеми
запланированными задачами. Можно вызывать методы этого класса для
поиска активных задач, их запуска и останова. У активной задачи есть
имя, по которому можно найти задачу. При этом, можно управлять
только теми задачами, которые приложение запустило, и нельзя увидеть
задачи, запущенные другими приложениями.
PeriodicTask periodicTask = null;
string periodicTaskName = "CaptainTracker";
private void StartTracking()
{
periodicTask = ScheduledActionService.Find(periodicTaskName) as Periodic
3*9(5
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
// если задача существует и IsEnabled = false,
// фоновый агент отключён пользователем
if (periodicTask != null && !periodicTask.IsEnabled)
{
MessageBox.Show("Пользователь отключил фоновые агенты');
return;
}
// если задача существует, и приложению разрешено запускать фонов1
// необходимо удалить задачу и создать её заново
if (periodicTask != null && periodicTask.IsEnabled)
{
RemoveAgent(periodicTaskName);
}
periodicTask = new PeriodicTask(periodicTaskName);
// описание необходимо указать для периодических агентов,
// чтобы пользователь мог идентифицировать агента на странице "На
periodicTask.Description = "Отслеживание журнала";
ScheduledActionService.Add(periodicTask);
// если включена отладка, использовать метод LaunchForTest
// для запуска агента через 60 секунд
#if(DEBUG_AGENT)
ScheduledActionService.LaunchForTest(periodicTaskName, TimeSpan.From
#endif
}
Этот код запустит агента как периодическую задачу, и если выполняется
отладка, запустит его через 60 секунд. Обратите внимание, что у задачи
должно быть определённое имя, и что пользователь может отключить
фоновые агенты для определённых приложений. Можно запустить
ресурсоёмкую задачу, создав экземпляр класса
ResourceIntensiveTask вместо PeriodicTask. Если нужно
создать задачу, которая работает в обеих ситуациях, можно использовать
класс ScheduledTask.
397
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Задачи передачи файлов
Можно создать фоновую задачу передачи файлов из области или в
область изолированного хранилища приложения. Передача файлов
будет выполняться, если приложение не запущено, и когда приложение
запускается, оно может контролировать состояние любых активных
загрузок и выводить на экран их состояние. Файлы могут загружаться с
узлов HTTP и HTTPs, но на текущий момент протокол FTP не
поддерживается системой.
Существует набор политик, которые управляют объёмом данных,
которые могут передавать приложения с помощью фоновых агентов
передачи файлов:
• максимальный размер исходящего файла: 5 Мб;
• максимальный размер файла, загружаемого через подключение
сотовой связи: 20 Мб;
• максимальный размер файла, загружаемого по Wi-Fi: 100 Мб.
При необходимости можно изменять эти значения для текущей передачи
с помощью перечисления TransferPreferences.
Службы фоновой передачи описаны в пространстве имён
Microsoft. Phone . BackgroundTransfer. Для запуска передачи
нужно создать объект BackgroundTransferRequest и добавить
это к тем объектам, которыми управляет класс
BackgroundTransferService. Передаче присваивается имя,
чтобы при следующем запуске приложения она могла определить, где
сохраняется передача и какой объём файла уже передан. Также можно
обрабатывать события, которые генерируются при передаче, чтобы
приложение могло выводить на экран информацию о переданной
информации.
Запланированные уведомления
Приложения могут создавать запланированные уведомления, которые
отображаются, если приложение запущено или не запущено.
398
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Уведомления могут вызывать всплывающие сообщения и изменение
живых плиток. Обратите внимание, что само запланированное
уведомление не может запустить приложение, но если пользователь
нажмёт на уведомление, приложение запустится и откроется связанная
с уведомлением страница. Уведомления могут быть одноразовыми или
повторяться в заданном интервале.
Напоминания создаются так же, как и передачи файлов. Каждое
уведомление имеет имя, по которому приложение может управлять
уведомлением.
Агенты воспроизведения звука
В приложении также можно использовать агент воспроизведения звука,
который содержит функции для управления воспроизведением и может
воспроизводить музыку, если приложение не запущено. Для создания
агента воспроизведения звука используется шаблон проекта Агент
воспроизведения звука Windows Phone.
Агент воспроизведения может воспроизводить музыку из
изолированного хранилища приложения, но у него нет доступа к
библиотеке мультимедиа в телефоне. Однако, его можно использовать
для воспроизведения из сетевого мультимедийного ресурса.
Краткие итоги
1. Приложение Windows Phone представляется в устройстве двумя
файлами значков. Один значок используется для представления
приложения в списке приложений телефона, а другой — больший
значок — используется, если приложение прикреплено к меню
Пуск телефона.
2. Приложения Siiverlight также используют изображение "экрана-
заставки", которое выводится на экран при запуске приложения.
Экран-заставка по умолчанию создаётся при создании нового
проекта приложения Silverlight, и этот файл можно редактировать.
В проектах XNA не реализован механизм экрана-заставки, но
разработчики игр могут создать заставку, если для загрузки игры
399
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
требуется, как минимум, несколько секунд.
3. Операционная система Windows Phone предоставляет единую
модель управления выполнением приложений. Приложение
может быть в любое время деактивировано. Пользователь может
деактивировать запущенное приложение и запустить другое,
нажав на кнопку Пуск, и позже вернуться к деактивированному
приложению, нажав кнопку Назад. Пользователь также может
удерживать кнопку Назад, чтобы вывести на экран список
деактивированных приложений и вернуться к одному из них.
4. Деактивированное приложение может находиться в памяти
(бездействовать) или может быть выгружено из памяти. При
возобновлении бездействующего приложения все его объекты в
памяти сохраняются. При возобновлении выгруженного
приложения оно должно заново создать все объекты.
5. Во время работы приложения в телефоне оно может находиться в
одном из четырёх состояний: "запущено", "закрыто",
"деактивировано" и "активировано".
6. Windows Phone предоставляет механизм хранения данных в
памяти, который может использоваться для сохранения
временных данных при деактивации приложения. Эти данные
могут быть считаны при возобновлении работы приложения.
7. Программы могут использовать задачи запуска и задачи выбора
для взаимодействия с подсистемами телефона. Задача запуска
запускает внешнее приложение (например, приложение для
отправки электронной почты), а задача выбора запускает внешнее
приложение, которое возвращает результат (например, выбор
изображения из библиотеки изображений). Во время работы
внешнего приложения программа деактивируется.
8. Приложение может создавать фоновые агенты, которые могут
работать, если приложение неактивно. Они могут быть
периодическими (выполняются в течение короткого промежутка
времени каждые 30 минут) или ресурсоёмкими (выполняются,
когда телефон не используется, подключён к внешнему источнику
питания и использует подключение к сети). Агент — это
отдельный проект, который добавляется к решению приложения.
9. Приложение может использовать фоновую передачу файлов,
которая будет выполняться, когда приложение будет неактивно.
10. Приложение может создать запланированные уведомления,
которые будут запускаться в определённом временном интервале.
400
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Они будут появляться, даже если приложение не запущено.
Вопросы
1. Какие изображения должно содержать приложение для Windows
Phone, и как эти изображения используются?
2. Как можно создать и использовать в приложении экран-заставку?
3. Что означает "быстрое переключение приложений"?
4. Как происходит переключение приложений?
5. Как можно сохранить состояние приложения при его
деактивации и загрузить при возобновлении работы?
6. Как в приложении вызвать системные функции телефона?
7. Чем отличаются задачи запуска и задачи выбора?
8. Как приложение может использовать фоновые задачи?
9. В чём разница между периодическими и ресурсоёмкими
задачами?
10. Как создать и использовать в приложении агента фоновой задачи?
Упражнения
Упражнение 1. Редактирование значков приложения
В этом упражнении вы создадите и отредактируете значки и экраны-
заставки для приложения Silverlight для Windows Phone.
Создание приложения
1. Откройте Visual Studio, создайте новое приложение Silverlight и
назовите его Icons.
2. Выберите в качестве целевого устройства эмулятор Windows Phone
и запустите программу, нажав клавишу F5. Visual Studio развернёт
программу в эмуляторе и запустит её.
3. Нажмите в эмуляторе кнопку Назад, чтобы остановить программу.
В эмуляторе откроется меню Пуск, содержащее единственную
плитку, связанную с программой Internet Explorer.
4. Щёлкните по стрелке вправо в верхнем правом углу экрана
эмулятора. Откроется список приложений эмулятора. Список
содержит приложение Icons, которое мы только что создали,
401
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Internet Explorer и приложение Настройки эмулятора.
5. Щёлкните по значку приложения Icons, чтобы запустить это.
Приложение запустится в эмуляторе.
6. Нажмите кнопку Назад, чтобы остановить приложение.
Эмулятор Windows Phone сохраняет все запускаемые в нём программы в
списке приложений, пока его работа не будет остановлена. Можно
открыть в Visual Studio другой проект и запустить его в эмуляторе —
приложение добавится в список приложений эмулятора.
Прикрепление приложения к меню Пуск
1. Откройте в эмуляторе список приложений.
2. Нажмите и не отпускайте левую кнопку мыши на приложении
Icons. Появится меню, которое позволяет удалить приложение из
эмулятора или прикрепить приложение к меню Пуск.
3. В открывшемся меню выберите пункт на рабочий стол.
Приложение Icons будет прикреплено к меню Пуск рядом с
плиткой приложения Internet Explorer.
Приложение также можно переместить в другое место меню Пуск или
удалить из меню Пуск.
Редактирование значка приложения
1. В обозревателе решений щёлкните правой кнопкой мыши по
файлу ApplicationIcon.png.
2. В открывшемся контекстном меню выберите пункт Открыть с
помощью..., чтобы вывести на экран список программ, которые
могут использоваться для работы с выбранным файлом.
3. Выберите в списке программу Paint и нажмите OK. Откроется
окно программы Paint, в котором будет открыто изображение из
файла.
4. Измените изображение и закройте программу Paint, сохранив
сделанные изменения.
5. В главном меню Visual Studio выберите пункт Построение ->
Перестроить. Visual Studio заново создаст файлы программы и
будет использовать изменённую версию значка.
6. Запустите программу. Visual Studio удалит старую версию
402
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
программы с эмулятора и развернёт новую версию с изменённым
значком.
7. Аналогичным образом измените изображения в файлах
Backgrounding и SplashScreenImage.jpg. После повторного
построения приложения будут изменены значок в меню Пуск и
экран-заставка программы.
Упражнение 2. Исследование выгрузки приложения
В этом упражнении вы рассмотрите, как приложения выгружаются из
памяти.
Создание приложения
1. Откройте Visual Studio, создайте новый проект приложения
Silverlight и назовите его Tombstone.
2. Откройте файл App.xaml.cs и найдите методы, которые
запускаются, когда происходят события запуска, закрытия,
выгрузки и возобновления работы приложения. Добавьте в
методы код для выдачи диагностических сообщений:
// Код для выполнения при активации приложения (переводится
// Этот код не будет выполняться при первом запуске приложения
private void Application_Activated(object sender, ActivatedEventArgs e)
{
System.Diagnostics.Debug.WriteLine("Активировано");
}
// Код для выполнения при деактивации приложения (отправляет
// Этот код не будет выполняться при закрытии приложения
private void Application_Deactivated(object sender, DeactivatedEventArg
{
System.Diagnos1ics.Debug.WriteLine("Деакгивировано");
}
// Код для выполнения при закрытии приложения (например, при
// кнопки "Назад")
// Этот код не будет выполняться при деактивации приложения
private void Application_Closing(object sender, ClosingEventArgs e)
4025
А.И. Гарибов
{
Основы разработки приложений для мобильных устройств на платформе Windows Phone
System.Diagnos1ics.Debug.WriteLine("Закрывается");
}
3. Выберите в качестве целевого устройства эмулятор Windows Phone
и запустите приложение.
4. Выберите в главном меню Visual Studio пункт Вид -> Вывод.
Откроется окно вывода диагностических сообщений. Последним
сообщением будет Запущено.
5. В эмуляторе щёлкните кнопку Назад, чтобы остановить программу.
В окне вывода диагностических сообщений появится сообщение
Закрывается.
Деактивация приложения
1. Запустите программу в эмуляторе.
2. Нажмите в эмуляторе кнопку Пуск для перехода к экрану меню
Пуск. В окне вывода появится сообщение Деактивировано.
3. Запустите в эмуляторе программу Internet Explorer.
4. Нажмите в эмуляторе кнопку Назад, чтобы вернуться на экран
меню Пуск.
5. Нажмите в эмуляторе кнопку Назад ещё раз, чтобы вернуться на
страницу приложения. В окне вывода появится сообщение
Активировано.
6. Закройте приложение.
Возобновление работы приложения
1. Откройте файл App.xaml.cs.
2. Найдите метод Application_Activated и измените его
следующим образом, чтобы по выводимому сообщению можно
было определить, из какого состояния приложение возобновляет
свою работу:
private void App]ication_Activated(object sender, ActivatedEventArgs e)
{
if (e.IsApplicationlnstancePreserved)
{
System.Diagnos1ics.Debug.WriteLine("Акгивировано из состоят
404
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
}
else
{
System.Diagnostics.Debug.WгiteLine("Акгивировано из состоят
}
}
3. Выполните все действия предыдущей части упражнения.
Обратите внимание, что приложение было активировано из
состояния "бездействует" не выгружалось из памяти.
Выгрузка приложения из памяти
В Visual Studio можно настроить, чтобы приложение при деактивации
автоматически выгружалось из памяти.
1. Убедитесь в том, что приложение не запущено.
2. В обозревателе решений щёлкните правой кнопкой мыши по
файлу проекта и в открывшемся меню выберите пункт Свойства.
Откроется окно свойств проекта.
3. Выберите в окне свойств вкладку Отладка и установите галочку
Отметить как удаленный в результате деактивации во время.
4. Выполните пункт 3 предыдущей части упражнения. Обратите
внимание, что приложение было активировано из состояния
"выгружено".
Наиболее вероятно, что работа приложения будет возобновлена из
состояния покоя. Однако, необходимо проверять поведение программы,
если она всё же будет выгружена из памяти.
405
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Реализация быстрого переключения приложений
Цель работы: изучение возможностей быстрого переключения
приложений и принципов использования в приложениях для Windows
Phone.
Основные теоретические сведения
В Windows Phone одновременно может быть активным только одно
приложение. Когда приложение перестаёт быть активным,
операционная система переводит его в состояние "бездействует". Если
памяти устройства недостаточно для работы активного приложения,
операционная система начинает завершать бездействующие
приложения. При этом, последними будет завершены приложения,
которые запускались недавно.
Платформа Windows Phone предоставляет разработчику события, методы
и объекты, которые он может использовать для необходимых действий
на каждом жизненном цикле приложения.
Приложение позволяет разработчику обработать события Launching,
Closing, Activated и Deactivated. Поскольку пользователь
покидает какую-то страницу или переходит на какую-то страницу
приложения, с этими событиями связаны два доступных для
переопределения метода страниц приложения: OnNavigatedTo и
OnNavogatedFrom.
Для того, чтобы понять, как приложение и система взаимодействуют и
какие возможности есть у разработчика, рассмотрим несколько
сценариев жизненных циклов приложения.
Пользователь запускает приложение со стартовой страницы телефона
или списка приложений, работает с приложением, затем нажимает
кнопку Назад телефона, находясь на стартовой странице приложения:
1. Приложение запускается, вызывается событие Launching.
2. Загружается стартовая страница приложения, вызывается её
метод OnNavigatedTo.
40(5
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
3. Приложение работает.
4. Пользователь выходит из приложения, нажимая кнопку Назад,
находясь на стартовой странице приложения.
5. Вызывается метод OnNavogatedFrom стартовой страницы
приложения.
6. Вызывается событие Closing приложения.
Пользователь запускает приложение со стартовой страницы телефона
или списка приложений, работает с приложением, затем нажимает
кнопку перехода к стартовой странице телефона, находясь на любой
странице приложения, а потом быстро возвращается обратно
(операционная система не завершает приложение), используя длинное
нажатие кнопки Назад и выбирая страницу приложения, с которой он
ушёл.
1. Приложение запускается, вызывается событие Launching.
2. Загружается стартовая страница приложения, вызывается её
метод OnNavigatedTo.
3. Приложение работает.
4. Пользователь выходит из приложения, нажимая кнопку Назад,
находясь на стартовой странице приложения.
5. Вызывается метод OnNavogatedFrom стартовой страницы
приложения.
6. Вызывается событие Deactivated приложения.
7. Приложение переходит в состояние "бездействует".
8. Пользователь не интенсивно пользуется телефоном, поэтому
выгрузки приложения из спящего состояния не происходит.
9. Пользователь возвращается в приложение, используя "длинное
нажатие" кнопки Назад и выбирая страницу приложения, с
которой он ушёл.
10. Вызывается событие Activated приложения.
11. Загружается страница приложения, с которой ушёл пользователь,
и вызывается её метод OnNavigatedTo.
12. Приложение работает.
Если операционной системе потребуется больше памяти, когда
приложение находится в памяти в состоянии "бездействует", то
приложение завершит свою работу, но сохранит состояние стека
407
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
навигации, а также состояние словарей состояния на уровне
приложения и на уровне страницы, и перейдёт в состояние
"выгружено". Обратите внимание, что выход из состояния "выгружено"
не отличается от выхода из состояния "бездействует", но при этом,
поскольку приложение будет выгружено из памяти, необходимо
позаботиться о сохранении данных для восстановления состояния
приложения. Узнать об этом разработчик может, проверив свойство
IsApplicationInstancePreserved у ActivatedEventArgs: если значение
свойства равно true, приложение восстанавливается из состояния
"бездействует", если false — то из состояния выгружено.
Одновременно система сохраняет состояние "выгружено" только для
пяти приложений. Если пользователь не возвращается к приложению,
данные удаляются, и приложение будет запускаться с событием
Launching.
Давайте теперь на практике попробуем разобраться с сохранением
состояния приложения.
Создадим новое приложение на базе стандартного шаблона
Приложение Windows Phone и назовём приложение
ApplicationStateExample.
Исправьте код XAML страницы приложения на следующий:
<StackPanel xName-'TitlePanel" Grid.Row="0" Margin="12,17,0,28">
<TextBlock x:Name="ApplicationTitle" Text="STATE SAVER"
Style="{StaticResource PhoneTextNormalStyle}"/>
<TextBlock x:Name="PageTitle" Text="message log" Margin="9,-7,0,0"
Style="{StaticResource PhoneTextTitle1Style}"/>
</StackPanel>
<Grid xN ame="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<StackPanel>
<TextBox Name="Message" Height="200" TextWrapping="Wrap" / >
<Button Name="Log" Height="80" Content-Log" / >
</StackPanel>
</Grid>
Запустите приложение. Наберите что-нибудь в поле ввода, а затем
408
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
перейдите на стартовую страницу, нажав среднюю кнопку на эмуляторе.
Потом нажмите и удерживайте кнопку Назад — отобразится список
доступных приложений. Выберите наше приложение. Обратите
внимание, что состояние страницы сохранилось, так как приложение
было в состоянии "бездействует".
Завершите работу приложения, перейдите в свойства проекта и
установите флажок Отметить как удаленный в результате деактивации
во время:
Рис. 23.1. Свойства отладки приложения
Запустите приложение. Наберите что-нибудь в поле ввода, а затем
перейдите на стартовую страницу, нажав среднюю кнопку на эмуляторе.
Потом нажмите и удерживайте кнопку Назад — отобразится список
доступных приложений. Выберите наше приложение. Обратите
внимание, что состояние страницы не сохранилось, так как приложение
было выгружено из памяти, и состояние страницы и приложения было
утеряно.
Добавим в код страницы MainPage.xaml.cs функции
OnNavigatedFrom и OnNavigatedTo, сохранив текст из поля
ввода в словарь состояний:
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
this.State.Add("text", Message.Text);
409
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
}
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
if (this.State.ContainsKey('text"))
{
Message.Text = (string)this.State["text"];
}
}
Запустите приложение. Наберите что-нибудь в поле ввода, а затем
перейдите на стартовую страницу, нажав среднюю кнопку на эмуляторе.
Потом нажмите и удерживайте кнопку Назад — отобразится список
доступных приложений. Выберите наше приложение. Обратите
внимание, что состояние страницы сохранилось, несмотря на то, что
приложение было выгружено из памяти, так как мы сохранили
состояние страницы в специальном словаре для сохранения состояния
страницы.
Это не совсем правильное поведение кода, поскольку в случае, если
приложение восстанавливается из состояния "бездействует", не нужно
изменять состояние страниц.
Добавим логическую переменную, чтобы определить, вызвался ли
конструктор, и модифицируем код соответствующим образом:
bool isNewlyCreatedPage = false;
// Конструктор
public MainPage()
{
InitializeComponentO;
isNewlyCreatedPage = true;
}
protected override void OnNavigatedTo(NavigationEventArgs e)
410
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
{
base.OnNavigatedTo(e);
if (this.State.ContainsKey('t:ext") && isNewlyCreatedPage)
{
Message.Text = (string)this.State["text"];
}
isNewlyCreatedPage = false;
}
Запустите приложение и проверьте, как оно работает.
Снимите флажок настройки отладки Отметить как удаленный в
результате деактивации во время и проверьте, что приложение не
восстанавливает состояние в случае выхода из состояния "бездействует".
Добавим в приложение код, чтобы попробовать сохранить состояние
приложения.
Добавим элемент TextBlock и обработчик Click в XAML код
страницы:
<StackPanel>
<TextBox Name="Message" Height="200" TextWrapping="Wrap" />
<Button Name="Log" Height="80" Content="Log" C]ick="Log_Click" />
<TextBlock Name="AppState" Height="80" />
</StackPanel>
В файл App.xaml.cs добавим публичное поле AppS tate:
public string AppState = "";
Модифицируем код файла MainPage.xaml.es, чтобы при нажатии на
кнопку сообщение из TextBox записывалось в AppState и
отображалось в TextBlock, а при восстановлении приложения
AppState отображалось в TextBlock:
protected override void OnNavigatedTo(System.Windows.Navigation.Navigatio:
{
411
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
base.OnNavigatedTo(e);
if (this.State.ContainsKeyfAext") && isNewlyCreatedPage)
{
Message.Text = (string)this.State["text"];
App myApp = App.Current as App;
AppState.Text = myApp. AppState;
}
isNewlyCreatedPage = false;
}
private void Log_Click(object sender, RoutedEventArgs e)
{
AppState.Text = Message.Text;
App myApp = App.Current as App;
myApp.AppState = AppState.Text;
}
Теперь необходимо добавить код сохранения/восстановления в
App.xaml.cs:
// Код для выполнения при активации приложения (переводится в осно
// Этот код не будет выполняться при первом запуске приложения
private void Application_Activated(object sender, ActivatedEventArgs e)
{
if (!e.IsApplicationInstancePreserved)
{
AppState = (string)PhoneApplicationService.Current.Sl:ate["appSl:ate"];
}
}
// Код для выполнения при деактивации приложения (переводится в фо
// Этот код не будет выполняться при закрытии приложения
private void Application_Deactivated(object sender, DeactivatedEventArgs e)
{
412
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
PhoneApplicationService.Current.State.Add("appState", AppState);
}
Перейдите в настройки отладки и установите флажок Отметить как
удаленный в результате деактивации во время, а затем запустите
приложение и проверьте, что состояние приложения сохраняется.
Обратите внимание, что когда приложение вызывает задачи выбора и
запуска, также возникает события Deactivated.
Дополнительные материалы
Windows Phone 7.5 Training Kit - https://
rusdpe.blob.core.windows.net/downloads/RusWP7TrainingKit.zip: Labs
\ApplicationLifecyde\ApplicationLifecyde.html\htmlv DocSet_default.html.
Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/ff769557.
Задание к работе
1. Откройте в Visual Studio созданный в одной из предыдущих работ
проект программы для Windows Phone.
2. Добавьте необходимый код для сохранения состояния программы
при её деактивации и восстановления состояния программы при
возобновлении её работы.
3. Запустите программу и проверьте правильность её работы при
возобновлении работы из состояний "бездействует" и
"выгружено".
4. Составьте отчёт о проделанной работе. Включите в отчёт
необходимые листинги программы.
413
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Задачи запуска и задачи выбора
Цель работы: изучение возможностей использования системных
функций телефона в приложениях для Windows Phone.
Основные теоретические сведения
Задачи запуска
Для того, чтобы использовать любую из задач запуска разработчику
необходимо выполнить следующие шаги:
1. Создать экземпляр класса задачи запуска.
2. Установить свойства полученного объекта.
3. Вызвать метод Show объекта.
Разработчику доступны следующие задачи запуска:
• PhoneCallTask — запускает приложение Телефон и задаёт
номер телефона и отображаемое имя. При этом, программа не
может инициировать звонок — это должен сделать пользователь;
• EmailComposeTask — запускает приложение электронной
почты и создаёт новое письмо, которое пользователь может
отправить;
• SmsComposeTask — запускает приложение Сообщения и
выводит на экран новое SMS-сообщение, которое пользователь
может отправить;
• SearchTask — запускает приложение Поиск в Интернете и
задаёт поисковый запрос;
• WebBrowserTask — запускает веб-браузер и выводит на экран
заданный URL;
• MediaPlayerLauncher — запускает медиапроигрыватель и
воспроизводит заданный файл мультимедиа;
• MarketplaceReviewTask — запускает клиентское
приложение Windows Phone Marketplace и отображает страницу
обзора для указанного программного продукта;
414
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
• MarketplaceDetailTask — запускает клиентское
приложение Windows Phone Marketplace и отображает страницу
подробной информации для указанного программного продукта;
• MarketplaceHubTask — запускает клиентское приложение
Windows Phone Marketplace;
• MarketplaceSearchTask — запускает клиентское
приложение Windows Phone Marketplace и отображает результаты
поиска по указанному запросу;
• BingMapsDirectionsTask — запускает приложение Bing
Maps и задаёт начальный и конечный пункты маршрута;
• BingMapsTask — запускает приложение Bing Maps и выводит
на экран карту по текущему или заданному расположению;
• ConnectionSettingsTask — позволяет пользователям
изменять настройки подключения телефона;
• ShareStatusTask — позволяет отображать сообщение о
состоянии, которое пользователь может отправить в выбранные
социальные сети;
• ShareLinkTask — позволяет пользователю опубликовать URL
в выбранных социальных сетях.
Создайте новый проект из шаблона Windows Phone Application, как мы
это уже делали в первой части и назовите его ExploreLaunchers.
Обратите внимание, что весь код, для простоты, будем вставлять в
страницу MainPage.xaml внутрь элемента Grid:
<Grid xName="ContentPanel" Grid.Row="1" Margin="12,0,12,0"></Grid>
Добавьте код в XAML файл, чтобы он выглядел следующим образом:
<Grid xN ame="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
< StackPanel O rientation=' Horizontal' >
<StackPanel Width="240">
<Button Name="EMailMe" Width="190" Height="75" Content="E-mail"
Click="EMailMe_Click"/>
<Button Name="AppDetails" Width="190" Height="75" Content="Програм
Click=' 'AppDetails_Click' '/>
<Button Name="MarketHub" Width="190" Height="75" Content="Рынок"
Click="MarketHub_Click" />
<Button Name="MarketSearch" Width="190" Height="75" Content="ПоисI
415
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Click=' MarketS e arch_C lick' '/>
<Button Name='MediaPlayer" Width="190" Height="75" Content="Плеер"
Click=' MediaPlayer_C lick' '/>
</StackPanel>
<StackPanel Width="240">
<Button Name="PhoneCall" Width="190" Height="75" Content="Звонок"
Click=' PhoneC all_C lick' '/>
<Button Name="Search" Width="190" Height="75" Content="Искать"
Click="Search_Click"/>
<Button Name="SendSms" Width="190" Height="75" Content="SMS"
Click="SendSms_Click"/>
<Button N ame=' WebBrowse'' Width="190" Height="75" Content="Be6"
Click="WebBrowse_Click"/>
</StackPanel>
</StackPanel>
</Grid>
Добавьте в блок using следующий модуль:
using Microsoft.Phone.Tasks;
Сразу после конструктора MainPage добавьте следующий код:
private void EMailMe_Click(object sender, RoutedEventArgs e)
{
EmailComposeTask compose = new EmailComposeTask();
compose.To = "rush4apps@microsoft.com";
compose.Body = " Я хочу участвовать в акции";
compose.Show();
}
private void AppDetails_Click(object sender, RoutedEventArgs e)
{
MarketplaceDetailTask marketDetails = new MarketplaceDetailTaskQ;
marketDetails.ContentType = MarketplaceContentType.Applications;
marketDetails.Contentldentifier = "введите идентификатор приложения";
marketDetails. Show();
}
416
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
private void MarketHub_Click(object sender, RoutedEventArgs e)
{
MarketplaceHubTask marketHub = new MarketplaceHubTaskQ;
marketHub.ContentType = MarketplaceContentType.Applications;
marketHub. Show();
}
private void MarketSearch_Click(object sender, RoutedEventArgs e)
{
MarketplaceSearchTask marketSearch = new MarketplaceSearchTask();
marketSearch.ContentType = MarketplaceContentType.Applications;
marketSearch.SearchTerms = "GPSInfo";
marketSearch. Show();
}
private void MediaPlayer_Click(object sender, RoutedEventArgs e)
{
MediaPlayerLauncher player = new MediaPlayerLauncherQ;
player.Controls = MediaPlaybackControls.Stop;
player.Media = "укажите URI, с которого будет воспроизводиться конте
player.Show();
}
private void PhoneCall_Click(object sender, RoutedEventArgs e)
{
PhoneCallTask call = new PhoneCallTaskQ;
calLDisplayName = "Главному разработчику";
calLPhoneNumber = "+7 555 555 5555";
calLShow();
}
private void Search_Click(object sender, RoutedEventArgs e)
{
SearchTask search = new SearchTask();
search.SearchQuery = "rush4apps";
search.Show();
}
private void SendSms_Click(object sender, RoutedEventArgs e)
417
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
{
SmsComposeTask sms = new SmsComposeTask();
sms.Body = 'Windows Phone 7 - отличная платформа!";
sms.Show();
}
private void WebBrowse_Click(object sender, RoutedEventArgs e)
{
WebBrowserTask web = new WebBrowserTask();
web.Uri = new Uri("http://msdn.com/ru-ra/");
web.Show();
}
Мы добавили кнопок по количеству демонстрируемых задач загрузки и
в обработчике соответствующей кнопки вызываем интерфейс задачи
загрузки. Некоторые из задач загрузки будут работать только на реальном
устройстве.
Запустите приложение и посмотрите, как работают задачи запуска.
Задачи выбора
Для того, чтобы использовать любую из задач выбора разработчику
необходимо выполнить следующие шаги:
1. Создать экземпляр класса задачи запуска.
2. Добавить обработчик события Completed.
3. Установить свойства полученного объекта.
4. Вызвать метод Show объекта.
5. Получить данные от задачи выбора в обработчике события
Completed.
Разработчику доступны следующие задачи выбора:
• CameraCaptureTask — запускает приложение Камера и
позволяет пользователю создавать фотографии в приложении;
• EmailAddressChooserTask — запускает приложение
418
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Контакты и позволяет пользователю выбирать адрес электронной
почты контакта;
• PhoneNumberChooserTask — запускает приложение
Контакты и позволяет пользователю выбирать номер телефона
контакта;
• PhotoChooserTask — запускает приложение Выбор
фотографий и позволяет пользователю выбирать фотографии;
• SaveEmailAddressTask — запускает приложение Контакты
и позволяет пользователю сохранять указанный адрес
электронной почты в новый или существующий контакт;
• SavePhoneNumberTask — запускает приложение Контакты и
позволяет пользователю сохранять указанный номер телефона в
новый или существующий контакт;
• AddressChooserTask — запускает приложение Контакты и
позволяет пользователю выбирать адрес контакта;
• GameInviteTask — позволяет пользователю приглашать
игроков для совместной игры;
• SaveContactTask — предоставляет методы и события для
запуска приложения Контакты и позволяет пользователю
сохранять контакты;
• SaveRingtoneTask — запускает приложение мелодий
звонков и позволяет пользователю сохранять аудиофайл в список
системных мелодий телефона.
Создайте новый проект из шаблона Windows Phone Application, как мы
это уже делали в первой части и назовите его ExploreChoosers. Обратите
внимание, что весь код, для простоты, будем вставлять в страницу
MainPage.xaml внутрь элемента Grid:
<Grid xName="ContentPanel" Grid.Row="1" Margin="12,0,12,0"></Grid>
Добавьте код в XAML файл, чтобы он выглядел следующим образом:
<Grid xN ame="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<StackPanel>
<Button Width="190" Height="75" Name="Camera" Content="Камера"
Click="Camera_Click"/>
<Button Width="190" Height="75" Name="Email" Content="EMail" Click="E
<Button Width="190" Height="75" Name="Phone" Content='Телефон"
419
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Click=' Phone_C lick' '/>
<Button Width="190" Height="75" Name="ChoosePhoto" Соп1еп1="Фото"
Click="ChoosePhoto_Click"/>
<Button Width="190" Height="75" Name="SaveEMail" Content="Сохр. EMi
Click="SaveEMail_Click"/>
<Button Width="190" Height="75" Name="SavePhone" Content="Сохр. тел.
Click=' S avePhone_Click' '/>
</StackPanel>
</Grid>
Добавьте в блок using следующий модуль.
using Microsoft.Phone.Tasks;
Сразу после конструктора MainPage добавьте следующий код:
private void Camera_Click(object sender, RoutedEventArgs e)
{
CameraCaptureTask camera = new CameraCaptureTask();
camera.Completed += new EventHandler<PhotoResult>(camera_Completed)
camera.Show();
}
void camera_Completed(object sender, PhotoResult e)
{
if (e.TaskResult == TaskResult.OK)
MessageBox.Show("idMu файла:" + e.OriginalFileName);
}
private void Email_Click(object sender, RoutedEventArgs e)
{
EmailAddressChooserTask email = new Emai]AddressChooserTask();
emaiLCompleted += new EventHandler<EmailResu]t>(emai]_Completed);
email.Show();
}
void email_Completed(object sender, EmailResult e)
{
if (e.TaskResult == TaskResult.OK)
420
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
MessageBox.Show(e.Email);
}
private void Phone_Click(object sender, RoutedEventArgs e)
{
PhoneNumberChooserTask phone = new PhoneNumberChooserTask();
phone.Completed += new EventHandler<PhoneNumberResult>(phone_Com
phone.Show();
}
void phone_Completed(object sender, PhoneNumberResult e)
{
if (e.TaskResult == TaskResult.OK)
MessageBox. Show(e. PhoneNumber);
}
private void ChoosePhoto_Click(object sender, RoutedEventArgs e)
{
PhotoChooserTask photo = new PhotoChooserTask();
photo.Completed += new EventHandler<PhotoResult>(photo_Completed);
photo.Show();
}
void photo_Completed(object sender, PhotoResult e)
{
if (e.TaskResult == TaskResult.OK)
MessageBox. Show(e.OriginaIFileN ame);
}
private void SaveEMail_Click(object sender, RoutedEventArgs e)
{
SaveEmailAddressTask saveEmail = new SaveEmailAddressTaskO;
saveEmaiLCompleted += new EventHandler<TaskEventArgs>(saveEmail_Co
saveEmaiLEmail = "rush4apps@microsoft.com";
saveEmail. Show();
}
void saveEmail_Completed(object sender, TaskEventArgs e)
{
421
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
if (e.TaskResult == TaskResult.OK)
MessageBox.Show('EMail сохранен!");
}
private void SavePhone_Click(object sender, RoutedEventArgs e)
{
SavePhoneNumberTask savePhone = new SavePhoneNumberTask();
savePhone.Completed += new EventHandler<TaskEventArgs>(savePhone_C
savePhone.PhoneNumber = "+7 495 555 5555";
savePhone.Show();
}
void savePhone_Completed(object sender, TaskEventArgs e)
{
if (e.TaskResult == TaskResult.OK)
MessageBox.Show("Номер сохранен!");
}
Мы добавили кнопок по количеству демонстрируемых задач выбора и в
обработчике соответствующей кнопки регистрируем обработчик
события Completed и вызываем интерфейс задачи выбора.
Запустите приложение и посмотрите, как работают задачи выбора.
Дополнительные материалы
Windows Phone 7.5 Training Kit -
https://rusdpe.blob.core.windows.net/downloads/RusWP7TrainingKit.zip:
Labs\LaunchersAndChoosers\LaunchersAndChoosers.html\html\
DocSet_default.htmL
Задание к работе
1. Откройте в Visual Studio созданный в одной из предыдущих работ
проект программы для Windows Phone или создайте новый проект.
2. Добавьте необходимый код для вызова одной из задач запуска с
передачей параметров, введённых пользователем (например,
создание нового сообщения).
422
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
3. Добавьте необходимый код для вызова одной из задач выбора
(например, выбор записи из приложения Контакты) и
использования информации о выбранном объекте в программе
(например, вывода информации на экран или использование при
создании задачи запуска).
4. Запустите программу и проверьте правильность её работы.
5. Составьте отчёт о проделанной работе. Включите в отчёт
необходимые листинги программы.
423
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Фоновая обработка
Цель работы: изучение возможностей задач фоновой обработки в
приложениях для Windows Phone.
Основные теоретические сведения
Многозадачность и фоновые сервисы
Несмотря на то, что в Windows Phone только одно приложение может
быть активным, оно может воспользоваться специальными
возможностями платформы, чтобы выполнять определенные задачи,
даже не являясь активным.
Специальные возможности платформы включают в себя возможность
создания фоновых задач, запускаемые по расписанию, возможность
проигрывания музыки и загрузки/выгрузки файлов в фоновом режиме, а
также регистрацию оповещения и напоминания.
Фоновые задачи, запускаемые по расписанию
Можно создавать два типа задач: периодические (PeriodicTask) и
ресурсоёмкие (ResourceIntensiveTask). Периодические задачи
запускаются регулярно на небольшое время, ресурсоёмкие —
запускаются на относительно длительное время, но только если
выполнятся определённые условия, относящиеся к состоянию телефона.
Классы для создания фоновых задач доступны в пространстве имён
Microsoft.Phone.Scheduler.
Есть определенные ограничения, связанные в целом с задачами,
запускаемыми по расписанию, и с каждым типом задач в отдельности:
• приложение может иметь только одну фоновую задачу,
запускающуюся по расписанию, но она может быть
зарегистрирована и как периодическая, и как ресурсоёмкая;
• не все функции устройства доступны в фоновых задачах;
424
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
• фоновую задачу необходимо инициализировать в активном
приложении, и она будет сохраняться между перезагрузками
телефона;
• у пользователя есть возможность управлять работой фоновых
задач в настройках телефона;
• максимальное время работы фоновой задачи — 14 дней (после
этого можно инициализировать заново);
• если агент завершит свою работу два раза подряд из-за
превышения ограничений на память или из-за необработанного
исключения, он будет удалён из расписания запуска;
• количество фоновых задач на устройстве ограничено и зависит от
конфигурации устройства.
Ниже приведена сравнительная таблица ограничений на
периодические и ресурсоёмкие задачи.
Периодические задачи
Ресурсоёмкие
задачи
Обычно, 30 минут, но в зависимости от
Телефон
подключён к
внешнему
источнику
питания
Доступ в сеть не
через сотовую
Интервал
состояния телефона (батарейка,
связь
запуска
запущенные процессы) может сдвигаться
+/- 10 минут
Заряд батареи не
менее 90%
Нет активного
звонка
Телефон
заблокирован
425
А.И. Гарибов
Основы разработки приложений для мобильных устройств
на платформе Windows Phone
Время
Порядка 55 секунд
Порядка 10
работы
минут
Ресурсы
Меньше 6 Мб памяти, меньше 10%
Меньше 6 Мб
ресурсов процессора
памяти
Создайте новое приложение из шаблона Приложение Windows Phone,
назовём его BackgroundAgentExample. Добавьте к решению новый проект
Агент запланированных заданий Windows Phone и назовите его
ToastAgent.
Перейдите к проекту ToastAgent, двойным щелчком перейдите к
редактированию файла ScheduledAgent.cs и добавьте следующий код в
метод OnInvoke, который вызывается при запуске сервиса:
using Microsoft.Phone.SheH;
protected override void OnInvoke(ScheduledTask task)
{
ShellToast toast = new SheUToastQ;
toast.Title = 'Toast Agent";
toast.Content = "Сообщение от фонового сервиса";
toast.Show();
#if DEBUG
ScheduledActionService.LaunchForTest(task.Name, System.TimeSpan.From
#endif
N otifyComplete();
}
Обратите внимание на код внутри директив условной компиляции. Он
позволяет не ждать 30 минут запуска сервиса, а запустить его через 10
секунд после его последнего запуска.
В основном проекте добавьте ссылку на проект ToastAgent.
Перейдём к редактированию кода MainPage.xaml. Добавим кнопку, чтобы
424(5
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
запустить наш периодический сервис и добавим обработчик события
Click:
<Grid xN ame="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Button Content="Запустить сервис" Height="150" Name="StartAgent" Clic
</Grid>
Добавим в блок using директиву:
using Microsoft.Phone.Scheduler;
и определим константу с именем сервиса в классе MainPage:
const string ToastAgentName = "Agent-Toast";
Отредактируем обработчик события нажатия кнопки так, чтобы
запускался сервис ToastAgent.
private void StartAgent_C]ick(object sender, RoutedEventArgs e)
{
PeriodicTask myPeriodicTask = ScheduledActionService.Find(ToastAgentName
if (myPeriodicTask != null)
{
try
{
S cheduledActionS ervice. Remove(ToastAgentN ame);
}
catch (Exception ex)
{
MessageBox.Show("Невозможно удалить ранее созданный сервис:"
}
}
myPeriodicTask = new PeriodicTask(ToastAgentName);
myPeriodicTask.Description = "Agent-Toast";
try
{
ScheduledActionService.Add(myPeriodicTask);
427
А.И. Гарибов
Основы разработки приложений для мобильных устройств на платформе Windows Phone
#if DEBUG
ScheduledActionService.LaunchForTest(ToastAgentName, TimeSpan.FromSi
#endif
}
catch (Exception ex)
{
MessageBox.Show("Невозможно создать сервис:" + ex.Message);
}
Поле описание сервиса является обязательным, без него не удастся
добавить сервис.
Обратите внимание, что и здесь присутствует код, который в случае
отладки вызывает сервис через 10 секунд.
Запустите приложение и протестируйте его работу: запустите
приложение, нажмите кнопку Запустить сервис, выйдите из
приложения, дождитесь появления сообщения от сервиса.
Перейдите в настройки приложений, в панель фоновые задачи и
проверьте, что наш сервис там действительно зарегистрирован.
Фоновая загрузка/выгрузка файлов
Для фоновой загрузки/выгрузки файлов предназначены классы в
пространстве имён Microsoft.Phone.BackgroundTransfer.
Файлы можно загружать/выгружать из/в изолированное хранилище
приложения, при этом процесс будет продолжаться, даже если
приложение не запущено. Если приложение запущено, но оно может
отлеживать состояние и отображать его статус фоновой загрузки
файлов. Пока поддерживаются GET/POST HTTP/HTTPS запросы для
скачивания файлов и POST HTTP/HTTPS запросы для загрузки файла на
сервер.
Также существуют ограничения на размеры файлов, которые можно
скачать/загрузить на сервер. На сервер можно загрузить файл не больше
5 Мб, скачать файл размером до 20 Мб можно по сотовой связи, файлы
428
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
размером до 100 Мб - по беспроводной (Wi-Fi) (если нет подключения к
источнику питания).
Каждое приложение может иметь до 5 одновременных запросов на
фоновую загрузку/выгрузку файлов. Обратите внимание, что при
завершении загрузки/выгрузки запросы не удаляются - это необходимо
сделать вручную. При этом, всего на устройстве может быть до 500
запросов на фоновую загрузку/выгрузку файлов.
Пример программного кода для фоновой загрузки и сохранения в
изолированном хранилище файла RSS:
string fileName = "..."; // имя скачиваемого файла
string filePath = "..."; // адрес файла в Интернете
Uri transferUri = new Uri(filePath);
BackgroundTransferRequest transferRequest = new
BackgroundTransferRequest(transferUri);
transferRequest.Method = "GET";
Uri downloadUri = new Uri("shared/transfers/" + fileName,
UriKind.RelativeOrAbsolute);
transferRequest.DownloadLocation = downloadUri;
transferRequestTransferStatusChanged += new
EventHandler<BackgroundTransferEventArgs>(transferRequest_TransferStati
try
{
BackgroundTransferService.Add(transferRequest);
}
catch (Exception ex)
{
MessageBox.Show("Невозможно запустить фоновую загрузку:" + ex.Me
}
429
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Теперь добавим в обработчик изменения статуса код, чтобы удалить
запрос на загрузку, скопировать файл в корневую директорию:
void transferRequest_TransferStatusChanged(object sender,
BackgroundTransferEventArgs e)
{
//если скачивание прошло успешно, удаляем запрос на загрузку
if (e.Request.TransferStatus == TransferStatus.Completed)
{
try
{
BackgroundTransferService.Remove(e.Request);
}
catch (Exception ex)
{
MessageBox.Show("Невозможно удалить завершённую фоновую з
ex.Message);
}
}
}
Фоновое проигрывание музыки
Также существуют классы для проигрывания локальной и потоковой
музыки. Они находятся в пространстве имён
MicrosoftPhone.BackgroundAudio. Создание приложений, которые
используют эту возможность аналогично созданию приложений для
фоновых сервисов, запускаемых по расписанию, с поправкой на
специфику проигрывания аудио.
В поставке средств разработки находятся два шаблона проектов Агент
воспроизведения звука Windows Phone и Агент потоковой передачи звука
Windows Phone для создания сервисов фонового проигрывания
локальной и потоковой музыки соответственно. Особенностью данных
сервисов является их тесная интеграция с платформой Windows Phone.
430
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Дополнительные материалы
Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/hh202961.
Сайт MSDN: http://msdn.microsoft.com/ru-ru/library/hh394039.
Задание к работе
1. Откройте в Visual Studio созданный в одной из предыдущих работ
проект программы для Windows Phone или создайте новый проект.
2. Добавьте необходимый код для создания какой-либо
периодической или ресурсоёмкой задачи (например,
периодического добавления в файл информации о доступности
подключения к Интернету).
3. Запустите программу и проверьте правильность её работы.
4. Составьте отчёт о проделанной работе. Включите в отчёт
необходимые листинги программы.
431
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Публикация приложений в Windows Phone Marketplace
Чтобы сделать доступным созданное вами приложение другим
пользователям телефонов Windows Phone, его необходимо
опубликовать на портале Microsoft Windows Phone Marketplace. В этой
главе вы узнаете, какие действия необходимо выполнить, чтобы
подготовить программу для размещения на Marketplace, а также как
сделать программу отличающейся от других.
Презентацию к данной главе Вы можете скачать здесь - h ttp://
old.intuit.ru/department/se/devmobwphn/26/09.pptx.
26.1. Подготовка приложения для продажи
Для того чтобы приложение было принято для распространения через
Marketplace, оно должно отвечать определённым требованиям. Кроме
этого, приложение будет всесторонне тестироваться, и эти тесты
доступны вместе с пакетом Windows Phone SDK, чтобы можно было
осуществить предварительное тестирование приложения.
Анализ производительности
Поскольку аппаратные средства Windows Phone довольно ограничены
по сравнению с компьютерами, приложение для Windows Phone,
которое неэффективно использует аппаратные ресурсы, будет работать
очень медленнно. При этом нет возможности заменить отдельные
аппаратные составляющие телефона, как это можно сделать в
компьютере, для повышения быстродействия приложения.
Windows Phone SDK предоставляет набор инструментов анализа
производительности, которые можно использовать для оценки
эффективности работы программы. Эти инструменты могут дать общее
представление о загрузке программой процессора, частоты обновления
экрана и использовании памяти, а также о том, как выполняются
отдельные методы программы. Это очень полезно, поскольку позволяет
определить, какие части программы необходимо оптимизировать.
432
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Инструменты для анализа можно запустить в Visual Studio, выбрав пункт
меню Отладка -> Начать анализ производительности Windows Phone.
Для анализа приложения можно указать необходимые настройки, в
пределах которых приложение будет выполнять анализ. Программа
может работать в эмуляторе или в физическом устройстве. В любом
случае система создаёт файл журнала с расширением .sap, который
сохраняется как часть проекта Visual Studio, что позволяет сравнивать
результаты теста с результатами предыдущего теста производительности
и определять эффект сделанных изменений. Visual Studio открывает файл
.sap в виде диаграммы, исследуя которую, можно определить
эффективность работы приложения.
Создание файла XAP для распространения приложения
Как было рассмотрено в главе 3, при построении приложения создаётся
один файл с расширением .xap, который передаётся в устройство Windows
Phone. Этот файл также передаётся в Windows Phone Marketplace, чтобы
приложение можно было продать.
Этот файл содержит все сборки и ресурсы программы, а также файла
манифеста, которые описывают приложение. В файле
WMAppManiiestxml файл перечислены используемые приложением
функции телефона, а также задаётся жанр приложения, который
определяет, в каком месте телефона сохраняется программа. Например,
программы с жанром Игры сохраняются в списке игр, а другие
приложения сохраняются в списке приложений.
<?xml version="1.0" encoding="utf-8'?>
<Deployment xmlns=http://schemas.microsoft.com/windowsphone/2009/deployr
AppPlatformVersion= "7.0">
<App xmlns="" ProductID="{b92ce770-1b22-4d52-998e-113c2784067a}"
Title="PictureDisplay" RuntimeType="Silverlight" Version="1.0.0.0"
Genre="apps.normal" Author="PictureDisplay author"
Description="Sample description" Publisher="PictureDisplay">
<IconPath IsRelative="true" IsResource="false">ApplicationIcon.png</IconPa
<Capabilities>
<Capability Name="ID_CAP_GAMERSERVICES"/>
<Capability Name="ID_CAP_IDENTITY_DEVICE"/>
433
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
<Capability Name='ID_CAP_roENTTTY_USER7>
Capability Name='ID_CAP_LOCATION"/>
Capability Name="ID_CAP_MEDIALIB"/>
Capability Name="ID_CAP_MICROPHONE"/>
Capability Name="ID_CAP_NETWORKING"/>
Capability Name='ID_C AP_PHONEDI AT ER"/>
Capability Name="ID_CAP_PUSH_NOTIFICATION"/>
Capability Name="ID_CAP_SENSORS"/>
Capability Name="ID_CAP_WEBBROWSERCOMPONENT"/>
</Capabilities>
<Tasks>
<DefaultTask Name ="_default" NavigationPage='MainPage.xaml"/>
</Tasks>
<Tokens>
<PrimaryToken TokenID="PictureDisplayToken" TaskName="_default">
<TemplateType5>
<BackgroundImageURI IsRelative="true"
IsResource="false">Background.png</BackgroundImageURI>
<Count>0</Count>
<Title >PictureDisplay</Title >
</TemplateType5>
</PrimaryToken>
</Tokens>
</App>
</Deployment>
Это пример файла манифеста WMAppManifestxml, созданного для
приложения PictureDisplay. В этом файле указано, что приложение будет
использовать все возможности телефона. Когда приложение
предоставляется в Marketplace, содержимое этого файла проверяется в
соответствии с вызовами функций устройства, которые выполняет
приложение. Если приложение будет использовать ресурсы, которые не
определены в этом файле, то проверка допустимости завершится
неудачей.
Когда клиент устанавливает программу, программа сообщает ему, какие
функции телефона она будет использовать, и просит дать ей
разрешение. Идея состоит в том, чтобы предотвратить выполнение
программ с неожидаемым поведением, что повышает безопасность
434
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
используемых программ.
Перед тем как предоставить программу в Marketplace, необходимо
указать имя автора, описание программы и имя издателя. Файл
манифеста можно отредактировать в Visual Studio. При построении
приложения этот файл включается в файл XAP. Обратите внимание, что
для загрузки в Marketplace приложение должно быть построено в
режиме Release, а не Debug.
Значки и изображения приложения
Перед тем как предоставить программу в Marketplace, необходимо также
подготовить значки, которые будут представлять приложение в
устройстве, а также некоторые изображения, которые будут
отображаться в Windows Phone Marketplace. Значки должны иметь
определённые размеры и сохраняться в файлы PNG:
• значок маленькой плитки приложения в списке приложений
телефона (обязательно) размером 99*99 пикселей;
• значок большой плитки приложения на рабочем столе телефона
(необязательно) размером 173*173 пикселей;
• значок плитки приложения для Windows Phone Marketplace
(обязательно) размером 200*200 пикселей;
• фоновое изображение, которое используется в фоновой панораме
страницы Marketplace для приложения (необязательно), размером
1000*800 пикселей.
Также необходимо создать, по крайней мере, один снимок экрана
приложения размером 800*480 пикселей. Предпочтительнее загрузить
несколько снимков экрана, чтобы потенциальные покупатели имели
представление о том, как программа выглядит во время работы.
Распространение XAP-файлов
Обычно на устройстве Windows Phone можно запускать только те
программы, которые были получены через Marketplace. Однако,
435
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
разработчик приложений может разблокировать телефон, чтобы он мог
запускать программы, которые загружены в него из Visual Studio.
Разблокировка устройства осуществляется за дополнительную плату.
Разработчики могут разблокировать максимум три устройства, а
студенты, участвующие в программе DreamSpark, могут бесплатно
разблокировать только одно устройство. Разблокировка выполняется с
помощью приложения Windows Phone Registration, которое входит в
состав Windows Phone SDK. Это приложение выполняет регистрацию
подключённого к компьютеру с помощью программы Zune телефона на
узле для разработчиков приложений для Windows Phone. Для
регистрации требуется учётная запись Windows Live.
Приложения, которые разворачиваются в телефоне, остаются в памяти
телефона, и их можно запускать точно так же, как и любые приложения
из Marketplace. Однако, в устройстве может быть одновременно
загружено только 10 собственных приложений.
Если нужно отправить программу другим разработчикам, можно
отправить им файл XAP, и разработчики смогут использовать
программу Application Deployment для развёртывания приложения из
файла XAP в разблокированном устройстве или эмуляторе Windows
Phone. Эта возможность позволяет распространять приложения для
тестирования перед их публикацией в Marketplace.
26.2. Распространение приложений и игр для Windows
Phone
Пользователь телефона на платформе Windows Phone может получить
программу только с Windows Phone Marketplace. Все загруженные на
портал программы проходят проверку на допустимость.
Получение приложений для Windows Phone
Владелец устройства Windows Phone может использовать свою учётную
запись Windows Live для получения доступа к услугам, предоставляемым
сервисами Windows Live, Zune и Xbox Live, а также Windows Phone
Marketplace.
43(5
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Владелец телефона может загружать приложения через приложение
Marketplace в устройстве (через Wi-Fi или сеть оператора сотовой
связи), программное обеспечение Zune на компьютере под управлением
Windows или с сайта http://www.windowsphone.com/marketplace.
Учётную запись Windows Live можно использовать на пяти устройствах.
После удаления приложения с устройства его можно загрузить повторно, не
покупая его ещё раз, поскольку в Marketplace сохраняется список всех
купленных приложений. Также в Marketplace реализована система
оценок, которая позволяет давать оценки и отзывы на приложения.
Создание приложений и игр для Windows Phone
Зарегистрированный разработчик приложений для Windows Phone может
загружать свои приложения и игры в Marketplace через сайт http://
create.msdn.com. На этом сайте размещаются и обновляются средства
разработкииразличная документация.
Одобрение приложения. Перед распространением приложения через
Marketplace должно пройти процесс одобрения, где проверяется
корректность работы приложения, правильность использования
аппаратных кнопок телефона, а также безопасно ли приложение для
использования.
Тестирование приложения проводится полуавтоматически. Инженер
запускает программу и проверяет правильность её работы. Проверяется
работа приложения при использовании различных цветовых схем
телефона, чтобы все меню были видны.
Если приложение не будет одобрено, будет выдан письменный отчёт, в
котором указываются те части программы, которым необходимо уделить
внимание. Иногда программа бывает одобрена с некоторыми
предупреждениями. Это означает, что обнаружены проблемы, на которые
нужно обратить внимание, но эти проблемы не столь серьезны, чтобы
отказать в одобрении приложения. В этом случае
437
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
ожидается, что разработчик выпустит обновлённую версию программы.
После одобрения приложения оно добавляется в одну из категорий
приложений и становится доступным для скачивания. Разработчик
может создать обновлённую версию приложения, которое после его
одобрения будет доступно для всех пользователей, которые используют
это приложение.
Некоторые приложения являются бесплатными, а другим — платными.
Оплата купленных приложений обычно осуществляется с помощью
банковской карты. Для многих приложений доступен тестовый режим,
который является бесплатным. Такое приложение можно обновить до
полнофункциональной версии. Во время работы программы она может
определить, в каком режиме она работает: в тестовом или полном.
Зарегистрированные разработчики могут разместить неограниченное
количество платных приложений и до 100 бесплатных приложений в
год. Размещение каждого следующего бесплатного приложения будет
стоить $20.
Перед тем как размещать приложение, разработчик должен сначала
получить членство в Marketplace. Это стоит $99 в год и требует наличия
учётной записи Windows Live. Если членство прекращается, все
приложения разработчика удаляются с Marketplace. Студенты,
зарегистрированные в программе DreamSpark, могут получить
свободное членство в Windows Phone Marketplace.
Зарегистрированным разработчикам Marketplace выдаётся уникальный
ключ, который используется для подписи приложений. Разработчики
могут установить цену своих приложений и получить 70 % от
стоимости проданных приложений. Эта сумма перечисляется на
указанный банковский счет, как только они достигли порога в $200.
Тестовый режим. Приложение или игра могут быть загружены в
качестве бесплатной демо-версии. Программа может определить,
работает ли она в демонстрационном режиме:
LicenseInformation info = new LicenseInformationQ;
if (info.IsTrialO)
438
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
{
// приложение работает в тестовом режиме
}
Класс LicenseInformation описан в пространстве имён
Windows.Phone.Marketplace. Если программа работает в
тестовом режиме, может ограничить его возможности или время
использования. Если пользователь захочет обновить приложение до
полной версии, оно может использовать задачу запуска для перехода к
странице приложения в Marketplace.
Добавление рекламы. Если вы не хотите продавать своё приложение,
но всё равно хотите зарабатывать деньги, вы можете добавить в
приложение рекламные объявления. Их можно добавить в программы
XNA или Silverlight и показывать пользователям в качестве рекламы.
Пользователь может ответить на рекламу, подключившись к веб-сайту
рекламодателей или позвонив им. В любом случае, разработчик
получает 70% дохода от рекламы. Рекламные объявления можно
выводить в любую область экрана телефона. Также можно
зарегистрироваться на портале Microsoft PubCenter и добавлять рекламу
в приложения в большом количестве регионов всего мира. Advertising
SDK является дополнением к Windows Phone SDK и предоставляет
набор рекламных серверов, которые можно использовать в играх XNA и
приложениях Silverlight.
Marketplace Test Kit. Чтобы повысить вероятность одобрения
приложения с первого раза, можно использовать набор инструментов
Marketplace Test Kit, который поставляется вместе с Windows Phone SDK.
В его состав входит набор инструментов и процедур, которые
используются тестерами. Visual Studio проверяет наличие обновлений
инструментов и автоматически их обновляет. Эти инструменты можно
запустить, выбрав в главном меню Visual Studio пункт Проект ->
Marketplace Test Kit.
Закрытое бета-тестирование. Если вы хотите получить отзывы
пользователей до размещения приложения в Marketplace, можно создать
"закрытую" бета-версию приложения. Такая форма выпуска приложения
позволяет отправить ссылку на приложение до 100 тестерам, которые
могут загрузить и использовать программу в течение 90 дней, и после
439
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
этого приложение удаляется из их телефона. Эта опция указывается в
начале процесса предоставления приложения.
Краткие итоги
1. Владельцы устройств Windows Phone могут загружать приложения
с портала Windows Phone Marketplace.
2. Зарегистрированные разработчики могут предоставлять свои
приложения для одобрения и размещения на Marketplace.
3. Разработчики регистрируют и отслеживают продвижение своих
приложений через веб-сайт для разработчиков приложений для
Windows Phone.
4. Регистрация в качестве разработчика стоит $99 в год, студенты
могут зарегистрироваться бесплатно по программе Dreamspark.
5. Разработчики могут создавать бесплатные или платные
приложения, но могут бесплатно размещать не более 100
бесплатных приложений в год. Размещение каждого следующего
бесплатного приложения стоит $20.
6. Зарегистрированный разработчик может разблокировать свой
телефон для запуска программ из Visual Studio.
7. Приложения распространяются в виде XAP-файлов, которые
содержат все ресурсы и содержимое приложения, а также файл
манифеста, который описывает содержимое и предоставляет
информацию об используемых приложением функциях телефона.
8. Разработчики могут сами загружать файлы XAP на
разблокированные телефоны.
Вопросы
1. Какие возможности есть у инструмента для анализа
производительности приложений для Windows Phone?
2. Для чего нужны файлы манифеста?
3. Какие значки и изображения необходимо подготовить перед
распространением приложения через Windows Phone Marketplace?
4. Для чего нужна разблокировка телефона?
5. Как проходит процесс одобрения приложения?
6. Для чего предназначен тестовый режим приложения?
7. Как организовать закрытое бета-тестирование приложения?
440
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Упражнения
Упражнение 1. Использование инструмента для анализа
производительности
В этом упражнении вы выполните анализ производительности
приложения с помощью инструментов, которые входят в состав
Windows Phone SDK.
1. Откройте в Visual Studio один из созданных ранее проектов
приложения Silverlight или XNA.
2. В главном меню Visual Studio выберите пункт Отладка -> Начать
анализ производительности Windows Phone. Откроется окно
параметров.
3. Выберите необходимые параметры или оставьте значения по
умолчанию.
4. Выберите в качестве целевого устройства эмулятор Windows Phone
и нажмите ссылку Запустить приложение. Приложение
запустится в эмуляторе, и Visual Studio начнёт собирать сведения о
работе приложения.
5. Выполните в приложении какие-нибудь операции и закройте его,
нажав в эмуляторе кнопку Назад, находясь в главном окне
приложения. Visual Studio закончит сбор данных и откроет
созданный файл с расширением .sap в виде диаграммы.
6. Проанализируйте диаграмму. Обратите внимание, в какие
моменты были зафиксированы всплески активности приложения,
и вспомните, какие действия вы выполняли в это время.
Упражнение 2. Использование инструмента Marketplace Test Kit
В этом упражнении вы выполните тестирование приложения с
помощью инструмента Marketplace Test Kit.
1. Откройте в Visual Studio один из созданных ранее проектов
приложения Silverlight или XNA.
2. Выберите в раскрывающемся списке правее от выбора целевой
платформы пункт Release.
3. Выполните построение проекта, нажав кливиши Ctrl + Shift + B.
441
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
4. В главном меню Visual Studio выберите пункт Проект -> Открыть в
Marketplace Test Kit. Откроется окно инструмента Marketplace Test
Kit.
5. На вкладке Автоматизированные тесты нажмите на кнопку Запуск
тестов.
6. Просмотрите результаты теста. Попробуйте определить, почему
приложение не прошло некоторые тесты, и попытайтесь
устранить недостатки.
442
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Подготовка приложения для размещения на портале
Windows Phone Marketplace
Цель работы: изучение инструмента Marketplace Test Kit для
тестирования программы для Windows Phone перед её размещением в
Windows Phone Marketplace.
Основные теоретические сведения
Программы для Windows Phone можно продавать и устанавливать через
портал партнёрских решений для Windows Phone — Windows Phone
Marketplace. Все программы, размещённые в Marketplace, отвечают
минимальному набору требований надёжности, эффективности и
нормам этики.
Если вы хотите продать созданное вами приложение, вы должны быть
зарегистрированным разработчиком и предоставить свою программу
для одобрения. Регистрация разработчика стоит $99, но студенты могут
зарегистрироваться бесплатно по программе Dreamspark. Разработчики
могут зарегистрировать свои устройства Windows Phone как устройство
разработчика. Visual Studio может загружать приложения в устройство
разработчика и позволяет отлаживать программы, работающие на
физическом устройстве.
Вы можете распространять бесплатные приложения так же, как и
платные. Зарегистрированный разработчик может бесплатно
разместить в Marketplace до 100 бесплатных приложений. Если вы
хотите распространить более 100 бесплатных приложений, вы должны
заплатить по $20 за каждое дополнительное бесплатное приложение.
Вы можете также создать приложения, у которых есть
"демонстрационный" режим, которые могут быть преобразованы в
"полную" версию после их покупки. Программа может определить,
работает она в полном или демонстрационном режиме.
Когда вы предоставите приложение для продажи в Marketplace, оно
пройдет процесс одобрения, чтобы удостовериться, что оно безопасно
для использования и работает так, как ожидается. Если процесс
одобрений завершится неудачей, то вам выдадут диагностический отчёт.
443
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Перед тем как загрузить своё приложение, вы должны прочесть
требования для сертификации.
Перед тем как предоставить программу в Marketplace, необходимо также
подготовить значки, которые будут представлять приложение в
устройстве, а также некоторые изображения, которые будут
отображаться в Windows Phone Marketplace. Значки должны иметь
определённые размеры и сохраняться в файлы PNG:
• значок маленькой плитки приложения в списке приложений
телефона (обязательно) размером 99*99 пикселей;
• значок большой плитки приложения на рабочем столе телефона
(необязательно) размером 173*173 пикселей;
• значок плитки приложения для Windows Phone Marketplace
(обязательно) размером 200*200 пикселей;
• фоновое изображение, которое используется в фоновой панораме
страницы Marketplace для приложения (необязательно), размером
1000*800 пикселей.
Также необходимо создать, по крайней мере, один снимок экрана
приложения размером 800*480 пикселей. Предпочтительнее загрузить
несколько снимков экрана, чтобы потенциальные покупатели имели
представление о том, как программа выглядит во время работы.
Одобрение приложения
Перед распространением приложения через Marketplace должно пройти
процесс одобрения, где проверяется корректность работы приложения,
правильность использования аппаратных кнопок телефона, а также
безопасно ли приложение для использования.
Тестирование приложения проводится полуавтоматически. Инженер
запускает программу и проверяет правильность её работы. Проверяется
работа приложения при использовании различных цветовых схем
телефона, чтобы все меню были видны.
Если приложение не будет одобрено, будет выдан письменный отчёт, в
котором указываются те части программы, которым необходимо уделить
444
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
внимание. Иногда программа бывает одобрена с некоторыми
предупреждениями. Это означает, что обнаружены проблемы, на
которые нужно обратить внимание, но эти проблемы не столь
серьезны, чтобы отказать в одобрении приложения. В этом случае
ожидается, что разработчик выпустит обновлённую версию программы.
После одобрения приложения оно добавляется в одну из категорий
приложений и становится доступным для скачивания. Разработчик
может создать обновлённую версию приложения, которое после его
одобрения будет доступно для всех пользователей, которые используют
это приложение.
Некоторые приложения являются бесплатными, а другим — платными.
Оплата купленных приложений обычно осуществляется с помощью
банковской карты. Для многих приложений доступен тестовый режим,
который является бесплатным. Такое приложение можно обновить до
полнофункциональной версии. Во время работы программы она может
определить, в каком режиме она работает: в тестовом или полном.
Зарегистрированным разработчикам Marketplace выдаётся уникальный
ключ, который используется для подписи приложений. Разработчики
могут установить цену своих приложений и получить 70% от
стоимости проданных приложений. Эта сумма перечисляется на
указанный банковский счет, как только они достигли порога в $200.
Средство тестирования
Windows Phone SDK содержит средство для тестирования, которое
может использоваться для предварительного тестирования приложения
перед тем, как оно будет загружено в Marketplace. Это средство
автоматически синхронизируется с процессом одобрения Marketplace, и
если процесс изменится, то инструмент будет обновлён в соответствии
с этими изменениями. Средство тестирования работает автоматически
и выполняет такие же тесты, что и команда тестирования. Это
увеличивает шансы на то, что поданное приложение будет одобрено с
первого раза. Эти инструменты можно запустить, выбрав в главном
меню Visual Studio пункт Проект -> Marketplace Test Kit.
445
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Дополнительные материалы
Сайт MSDN: http://msdn.microsoft.com/m-
ru/windowsphone/hh976907.
Задание к работе
1. Откройте в Visual Studio созданный в одной из предыдущих работ
проект программы для Windows Phone.
2. Создайте значки программы, необходимые для размещения
программы в Windows Phone Marketplace.
3. Отредактируйте файлы манифеста, добавив информацию о
программе и её авторе.
4. Выполните построение приложения в режиме Release.
5. Запустите инструмент Marketplace Test Kit, добавьте
созданные значки и выполните все необходимые тесты.
6. Если тесты завершатся неудачно, исправьте проект и запустите
тест повторно.
7. Составьте отчёт о проделанной работе.
Заключение
После успешного усвоения рассмотренного в курсе материала вы
обладаете достаточными знаниями и навыками, необходимыми для
создания приложений для мобильных устройств, работающих на
платформе Windows Phone. Вы можете создавать приложения Silverlight
для выполнения различных задач, а также игры на основе технологии
XNA, которые при желании можно легко портировать на другие
платформы, использующие .NET Framework.
Однако, возможности разработки приложений для мобильных
устройств Windows Phone довольно обширны, и чтобы изложить их во
всех подробностях понадобится не одна книга. Поэтому, в данном курсе
были рассмотрены только основные вопросы, которые касаются
разработки мобильных приложений — но их вполне достаточно для
того чтобы быстро научиться программировать приложения для
446
А.И. Гарибов
Windows Phone.
Основы разработки приложений для мобильных устройств на платформе Windows Phone
Поэтому, после того как вы освоитесь с базовыми возможностями,
рекомендуется продолжить изучение самостоятельно. В этом вам
помогут материалы, которые доступны и периодически обновляются на
портале для разработчиков приложений http://create.msdn.com. Здесь
представлены как теоретические материалы по различным вопросам
разработки приложений, так и практические примеры, которые можно
использовать и при создании собственных приложений.
Материалы на русском языке можно найти на сайте MSDN: http://
msdn.microsoft.com/ru-ru/windowsphone. Здесь можно найти ответы на
многие вопросы, с которыми сталкиваются разработчики приложений
для Windows Phone; также доступны ссылки на различные материалы,
размещённые на других ресурсах.
Большой популярностью пользуется видео портал по технологиям и
разработке http://www.techdays.ru. Здесь размещаются видеодоклады по
различным темам, а также выступления докладчиков на различных
конференциях.
Также периодически создаются новые электронные учебные курсы,
которые доступны бесплатно на сайте http://ms-library.ru. Здесь собраны
русскоязычные учебные курсы и методическиематериалыпопреподаванию
информационных технологий, разработанные в университетах и учебных
центрах, а также обучающие материалы и книги для широкого круга
разработчиков и ИТ-специалистов.
Уверен, что представленные материалы окажутся полезными при
разработке мобильных приложений и помогут достичь успехов в этом
полезном деле.
447
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Общий глоссарий
A-GPS — технология, которая использует устройство GPS и
информацию с альтернативных каналов связи для определения
местоположения.
BLOB — значение произвольного объекта, выраженное в виде массива
двоичных данных.
GPS — спутниковая система навигации, обеспечивающая измерение
расстояния и определяющая местоположен^.
Intellisense — технология автодополнения Microsoft, которая используется
в Visual Studio, при вводе начальных букв выводит список допустимых в
конкретном месте программных лексем, которые можно использовать
для быстрого ввода текста программы.
IP-адрес — уникальный сетевой адрес узла в компьютерной сети,
построенной по протоколу IP.
LINQ — интегрированный язык запросов, который можно
использовать в приложении для работы с источниками данных.
Metro-стиль — концепция интерфейса приложений для Windows Phone,
которой должны соответствовать приложения для Windows Phone.
SQL — язык структурированных запросов, предназначенный для
работы с базами данных.
Windows Communication Foundation — технология компании Microsoft,
основанная на .NET Framework, которая используется для обмена
данными между приложениями, находящихся обычно на разных
устройствах.
XAML — расширяемый язык разметки приложений, основанный на
XML и разработанный компанией Microsoft, используется для
декларативного программирования внешнего вида приложений.
Агент — программный код, который выполняется в фоновом режиме,
когда связанное с ним приложение неактивно.
448
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Асинхронное подключение — тип подключения, которое работает
паралллельно с основной программой и обычно обрабатывается в
отдельном потоке.
Ассоциация — механизм LINQ для задания связи классов, связанных с
таблицами базы данных.
Атрибут — характеристика элемента в языке XML, представляется в
виде пары "имя—значение".
Атрибут класса — дополнительное описание класса, которое не влияет
на его работу, но может использоваться внешними средствами для
обеспечения дополнительной функциональности.
Бездействующее приложение — неактивное приложение, состояние
которого сохраняется в оперативной памяти.
Брандмауэр — комплекс аппаратных или программных средств,
осуществляющий контроль и фильтрацию проходящих через него
сетевых пакетов в соответствии с заданными правилами.
Быстрое переключение приложений — концепция, основная идея
которой в том, что пользователь может быстро переходить к любому
запущенному ранее приложению, и это приложение загружает
состояние и объекты из памяти телефона.
Внедрённый ресурс — ресурс, который хранится в файле сборки.
Внешний ключ — одно или несколько полей таблицы базы данных,
значения которых соответствуют значениям полей первичного ключа
связанной записи другой таблицы базы данных.
Выгруженное приложение — неактивное приложение, которое при
возобновлении работы заново загружает в память все объекты.
Графический процессор — компонент компьютера, игровой приставки
или мобильного телефона, выполняющий все операции, связанные с
выводом изображения на экран.
Двунаправленная привязка — тип привязки данных, при котором
данные могут передаваться в визуальный объект, и сделанные
449
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
пользователем изменения передаются в связанный объект данных.
Деактивация приложения — процесс перевода приложения в
неактивное состояние, происходит в случае, когда пользователь
переходит к другому приложению.
Дейтаграмма — блок информации, посланный как пакет сетевого
уровня через передающую среду без предварительного установления
соединения и создания виртуального канала.
Делегаты — специальные типы данных, которые представляют собой
ссылки на методы с заданными набором параметров и типом
возвращаемого значения. Делегаты могут использоваться для указания
методов-обработчиков события.
Динамически подключаемая библиотека — сборка, содержащая
программный код, который может использоваться в программе.
Емкостной сенсорный экран — сенсорный экран, работа которого
основана на изменении ёмкости в точке касания.
Живая плитка — элемент пользовательского интерфейса Windows Phone,
который размещается на экране меню Пуск, и при нажатии на него
запускается связанное приложение. Предствляется в виде
прямоугольника, внутри которого можно разместить текст и
изображение, и это содержимое может изменяться в процессе работы.
Задача — программный контейнер, связанный с приложением и
содержащий фоновые агенты.
Задачи выбора — тип задач Windows Phone, которые позволяют
использовать в приложении объекты телефона.
Задачи запуска — тип задач Windows Phone, которые вызывают
различные функции телефона из приложения.
Запись — строка таблицы базы данных.
Запросы LINQ — программный код LINQ для выборки необходимых
данных из источника данных.
450
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Изолированное хранилище — область памяти устройства Windows
Phone, в которой приложение может сохранять данные. Данные одного
приложения недоступны другим приложениям.
Интегрированная среда разработки — система программных средств,
используемая программистами для разработки программного
обеспечения.
Интерфейс — внешний вид приложения, включает элементы, их
расположение на страницах приложения, цвета, рисунки и др.
Исполняемый файл — сборка, представляющая собой файл с
расширением .exe, которая запускает программу.
Кисть — программный объект, который используется для заливки
изображений или текста. Основными свойствами кисти являются тип
заливки, цвет, рисунок или текстура.
Класс ViewModel — класс, предназначенный для представления данных
и связывания с визуальными элементами страницы.
Компилятор — это программа, которая преобразует высокоуровневые
инструкции, создаваемые программистом, в инструкции более низкого
уровня для выполнения на компьютере.
Компиляция "на лету" — процесс создания исполняемого двоичного
кода из управляемого кода сборки .NET, который выполняется
непосредственно при запуске сборки.
Конечная точка подключения — удалённый узел, к которому
подключается программа на текущем узле.
Контент-менеджер — объект XNA, предназначенный для управления
игровым содержимым.
Маршрутизация — процесс определения маршрута следования
информации в сетях связи.
Метаданные — описания программных объектов, которые могут
использоваться внешними средствами.
451
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Метод-обработчик события — метод, который автоматически
вызывается, когда происходит связанное с ним событие.
Мультисенсорные жесты — особые движения руки пользователя,
которые распознаются системой и вызывают выполнение особых
действий.
Наблюдаемая коллекция — объект, который отслеживает изменения
связанного списка элементов и при их возникновении генерирует
событие.
Однонаправленная привязка — тип привязки данных, при котором
данные могут только передаваться в визуальный объект, но сделанные
пользователем изменения не сохраняются.
Октетами — наименьшая единица информации, которая может быть
передана по сети, равняется 8 битам.
Отладка — процесс выполнения программы, которым можно
управлять. К средствам отладки относятся пошаговое выполнение
программы, использование точек останова, изменение значений
переменных во время выполнения программы и др.
Отношение "один ко многим" — вид связи двух таблиц в базе данных,
при котором записям из одной таблицы могут соответствовать
несколько записей из другой таблицы.
Отражение — технология .NET Framework, которая позволяет в
программе использовать публичные свойства и методы любого объекта,
даже если его тип не указан явно.
Первичный ключ — одно или несколько полей таблицы базы данных,
которые однозначно идентифицируют каждую запись этой таблицы.
Порт — условный номер, который соответствует программе или
службе, которая может принимать входящие сообщения из
компьютерной сети. В рамках одного устройства каждая подключенная к
сети программа или служба должна иметь уникальный номер порта.
Привязка данных — механизм связи свойств визуальных элементов со
452
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
свойствами объектов, которые используются для хранения и обработки
данных.
Проект — набор файлов, на основе которых компилятор создаёт сборку.
Промежуточный язык — машиннонезависимый язык, который
содержит команды для исполняемой среды .NET Framework и
используется для описания кода сборок.
Пространство имён — логическая группа, в которую могут входить
классы, а также другие пространства имён.
Разблокировка телефона — процесс регистрации телефона в качестве
устройства разработчика, в резульатате которого в телефоне можно
запускать и тестировать приложения с помощью Visual Studio.
Разрешение экрана — величина, определяющая количество точек
изображения или экрана устройства.
Резистивный сенсорный экран — сенсорный экран, работа которого
основана на изменении сопротивления в точке касания.
Ресурсы — используемые в проекте файлы, отличные от файлов
исходного кода (изображения, звуки, шрифты и др.).
Решение — совокупность проектов, которые используются при
создании приложения.
Сборка — двоичный файл, содержащий управляемый код .NET. Может
быть исполняемым файлом или библиотекой.
Сетевой маршрутизатор — сетевое устройство, пересылающее пакеты
данных между различными сегментами сети.
Сетевой протокол — набор соглашений, которые определяют, как
происходит обмен данными между устройствами в сети.
Сетевые сигналы — носитель информации, которая передаётся через
компьютеную сеть.
Система доменных имён — компьютерная распределённая система для
453
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
получения информации о доменах, позволяет связать имя узла с его IP-
адресом.
Система управления базами данных — совокупность программных
средств, обеспечивающих создание и управление базами данных.
Словарь — класс .NET Framework, который предназначен для хранения
данных в виде пар "имя-значение".
События — программные оповещения, которые могут происходить при
наступлении определённых условий, обычно связанных с выполнением
пользователем каких-то действий.
Соединение таблиц — создание одной таблицы из двух таблиц,
которые содержат записи обоих таблиц, связанные через внешние
ключи.
Сокет — программный интерфейс для обеспечения обмена данными
между процессами, которые могут выполняться на одном или разных
устройствах.
Сохранение состояния — процесс сохранения в памяти программных
объектов, которые используются в программе. При восстановлении
состояния приложение продолжает работу с того состояния, из которого
работа была приостановлена.
Спрайт — графический объект, представляющий собой растровое
изображение, которое выводится на экран.
Тактовая частота — характеристика процессора, обозначающая
максимальное количество тактов за одну секунду.
Тег — дополнительное описание программного объекта, которое может
использоваться для различных целей.
Текстура — растровое изображение, которое накладывается на
графический объект.
Точка останова — указание отладчику, что в указанном месте
необходимо приостановить выполнение программы и ожидать команды
пользователя.
454
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
Универсальный идентификатор ресурса — строка, которая содержит
полный путь к ресурсу.
Управляемый код — программный код, который выполняется в среде
.NET Framework.
Файл манифеста — файл, который создаётся при построении
приложения и содержит информацию о приложении, которую
использует среда .NET Framework, а также Windows Phone Marketplace.
Фоновая обработка — выполнение действий, когда приложение
неактивно.
Центральный процессор — компонент вычислительного устройства,
который выполняет машинные команды.
Шаблон данных — описание внешнего вида элемента списка.
Широковещательный адрес — условный адрес, который используется
для передачи широковещательных пакетов в компьютерных сетях.
Широковещательный адрес не может быть присвоен какому-либо узлу
сети.
Экран-заставка — изображение, которое выводится на экран при
запуске приложения во время загрузки ресурсов до тех пор, пока на
экран не будет выведена страница приложения.
Элемент контента — ресурс, который хранится в отдельном файле.
Элементы пользовательского интерфейса — программные объекты
приложения, в которых выводится информация для пользователя
(включая внешний вид приложения) или с которыми пользователь
может взаимодействовать (например, вводить данные).
Элементы-контейнеры — элементы пользовательского интерфейса, в
которых могут размещаться другие элементы.
Список сокращений
BLOB - Binary Large OBject - Большой двоичный объект
455
А.И. Гарибов Основы разработки приложений для мобильных устройств на платформе Windows Phone
CPU - Central Processing Unit - Центральный процессор
DNS - Domain Name System - Система доменных имён
GPS - Global Positioning System - Глобальная система позиционирования
GPU - Graphics Processing Unit - Графический процессор
HTTP - HyperText Transfer Pratoml - Протокол передачи гипертекста
IDE - Integrated Development Environment - Интегрированная среда
разработки
LINQ - Language INtegrated Query - Интегрированный язык запросов
RAM - Random Access Memory - Запоминающее устройство с
произвольным доступом
TCP - Transmission Control Protocol - Протокол управления передачей
UDP - User Datagram Protocol - Протокол пользовательских дейтаграмм
XAML - eXtensible Application Markup Language - Расширяемый язык
разметки приложений
XML - eXtensible Markup Language - Расширяемый язык разметки
456