Объявления в манифесте
Контакты
Последний контракт, который мы рассмотрим в этой лекции (ух ты!), это средство выбора контактов. Мы еще не видели этого средства в действии в Windows 8. Поэтому посмотрим на него для начала, а потом разберемся, как это средство используется с одной стороны контракта, и как приложение-поставщик удовлетворяет нужды другой стороны.
Контакт, или контактные сведения, как вы, вероятно, ожидаете, это информация о человеке, которая включает в себя подробности наподобие имени, номера телефона, адреса электронной почты и так далее. Очевидное место, где вам понадобится контакт – это составление электронного письма, как показано на рис. 3.8. Здесь, при прикосновении к элементу управления "+" в правой части полей To (Кому) и Cc (Копия), будет открыто средство выбора контактов, которое по умолчанию относится к приложению Peoples (Люди) Windows 8, как показано на рис. 3.9. (экран-заставка), и на рис. 3.10 (вид в режиме множественного выбора, где я размыл сведения о моих друзьях, и они не станут обвинять меня за привлечение к ним нежелательного внимания!). Как мы видели с интерфейсом средства выбора файлов, приложение-поставщик поддерживает пользовательский интерфейс для центральной части экрана, в то время как Windows поддерживает верхнюю и нижнюю части, заголовок и элемент меню в виде стрелки, направленной вниз, используя информацию из манифеста приложения-поставщика (обратиесь к рис. 3.3). На рис. 3.11. вы можете видеть внешний вид приложения из примера "Приложение для выбора контактов" (http://code.msdn.microsoft.com/windowsapps/Contact-Picker-App-sample-fc6677a1 ) в режиме поставщика, так же как и меню, которое позволяет вам выбирать разных поставщиков (те приложения, которые объявили себя в качестве поставщиков контактов)
Когда я выбираю один или большее количество контактов в любом приложении-поставщике и нажимаю на кнопку Select (Выбрать) в нижней части экрана, эти контакты поступают в первое приложение, в данном случае это Mail (Почта).
Так же, как контракт средства выбора файлов позволяет перемещаться по данным, представленным в виде файлов другим приложением, контракт контактов (скажите это быстро раз десять!) позволяет пользователю просто перемещаться по сведениям о людях, которые вы можете выбирать из любого другого источника.

Рис. 3.10. Пользовательский интерфейс выбора внутри приложения Peoples (Люди), показанный при множественном выделении (сведения о моих друзьях здесь размыты, так как они обычно не ищут славы среди разработчиков). Выделенные объекты собраны в нижней части, в корзине элементов

Рис. 3.11. Пользовательский интерфейс примера выбора контактов, когда приложение используется в качестве поставщика, вместе со всплывающим меню в заголовке, которое позволяет выбирать поставщика
Использование средства выбора контактов
Контакты, в целом, используют API в пространстве имен Windows.ApplicationModel.Contacts. Приложение, принимающее контакты, воспринимает каждый из них представленным в виде экземпляра класса ContactInformation (http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.contacts.contactinformation.aspx ), свойства которого, такие как name, phoneNumbers, locations, emails, instantMessages, и customFields, вместе с методами getThumbnailAsync и queryCustomFields, предоставляют вам контактную информацию. Выбор контакта осуществляется через интерфейс средства выбора контактов, который очень похож на интерфейс средства выбора файла. Интерфейс запускается с помощью Windows.ApplicationModel.Contacts.ContactPicker (http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.contacts.contactpicker.aspx ). После создания экземпляра данного объекта, вы можете установить подпись commitButtonText для первой (левой) кнопки в интерфейсе (как "Select" (Выбор) на предыдущих рисунках). Так же вы можете установить свойство selectionMode в одно из значений перечисления ContactSelectionMode: либо в contact (по умолчанию) либо в fields. В первом случае, возвращается полная контактная информация, в последнем, средство выбора работает с содежимым свойства desiredFields ( http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.contacts.contactpicker.desiredfields.aspx). Обратитесь к документации по данному свойству для того, чтобы узнать подробности.
Когда вы готовы к показу интерфейса, вызовите метод средства выбора контактов pickSingleContactAsync или pickMultipleContactsAsync. Они предоставляют вам обработчик завершения для одного объекта ContactInformation или для вектора из них, соответственно. Как и в случае со средством выбора файлов, обратите внимание на то, что эти API выдают исключения, если вызываются, когда приложение находится в прикрепленном режиме просмотра, очевидно, вы постараетесь избежать подобной ситуации.
Выбор и отображение отдельного контакта показан в Сценарии 1 примера "Приложение для выбора контактов" ( http://code.msdn.microsoft.com/windowsapps/Contact-Picker-App-sample-fc6677a1):
var picker = new Windows.ApplicationModel.Contacts.ContactPicker();
picker.commitButtonText = "Select";
// Открывает для пользователя средство выбор контакта
picker.pickSingleContactAsync().done(function (contact) {
if (contact !== null) {
// Получает информацию о контакте...
}
});
Выбор нескольких контактов (Сценарий 2, js/scenarioMultiple.js) работает похожим образом, лишь использует pickMultipleContactsAsync. В любом случае, вызывающее приложение затем применяет данные ContactInformation так, как ему нужно, например, заполняет поля To (Кому) и Cc (Копия) в приложении Mail (Почта). Однако, свойства этого объекта, помимо name, которое является обычной строкой, обладают некоторой структурой, как показано в следующей таблице.
| Свойство | Тип | Свойства и типы полей |
|---|---|---|
| emails phoneNumbers | Вектор ContactField | category (ContactFieldCategory), name (строка), type (типа ContactFieldType), value (строка) |
| instantMessages | Вектор ContactInstantMessageField | То же самое, что и ContactField выше, плюс - displayText, launchUri,service, и userName (все имеют строковой тип) |
| locations | Вектор ContactLocationField | То же, что и ContactField выше, плюс city, country, postalCode, region, street, и unstructuredAddress (все имеют строковой тип) |
Таким образом, пример принимает объект ContactInformation следующим образом, сначала извлекая индивидуальные свойства вектора:
appendFields("Emails:", contact.emails, contactElement);
appendFields("Phone Numbers:", contact.phoneNumbers, contactElement);
appendFields("Addresses:", contact.locations, contactElement);
И затем перечисляя содержимое этих векторов и в этом случае создавая элементы с их содержимым. Другие приложения, конечно, будут перемещать значения в подходящие поля или в другие части интерфейса приложения, то, что показано здесь, демонстрирует обработку различных категорий:
function appendFields(title, fields, container) {
// Создаёт интерфейс для списка полей контактатого же типа, например, для
// адресов электронной почты или телефонов
fields.forEach(function (field) {
if (field.value) {
// Присоединяет title только если имеется не пустое поле контакта
if (title) {
container.appendChild(createTextElement("h4", title));
title = "";
}
// Отображает категорию около значения поля
switch (field.category) {
case Windows.ApplicationModel.Contacts.ContactFieldCategory.home:
container.appendChild(createTextElement("div", field.value + " (home)"));
break;
case Windows.ApplicationModel.Contacts.ContactFieldCategory.work:
container.appendChild(createTextElement("div", field.value + " (work)"));
break;
case Windows.ApplicationModel.Contacts.ContactFieldCategory.mobile:
container.appendChild(createTextElement("div", field.value + " (mobile)"));
break;
case Windows.ApplicationModel.Contacts.ContactFieldCategory.other:
container.appendChild(createTextElement("div", field.value + " (other)"));
break;
case Windows.ApplicationModel.Contacts.ContactFieldCategory.none:
default:
container.appendChild(createTextElement("div", field.value));
break;
}
}
});
}

