Функция поиска так распространена среди приложений, что разработчики Windows 8 решили предоставить системный интерфейс для поиска по ключевым словам (с встроенной поддержкой редактора методов ввода (Input Method Editor) среди чудо-кнопок Общий доступ, Устройства и Параметры на панели чудо-кнопок, как можно видеть на рис. 2.1. Это означает, что приложениям не нужно (и обычно не следует) предоставлять собственный интерфейс для поиска. И, пользуясь средствами этого контракта, пользователь не только может осуществлять поиск по приложению переднего плана, но и очень просто и быстро осуществлять поиск по другим приложениям без необходимости выходить из текущего режима работы и запускать эти приложения. И, потому что другие приложения могут выполнять поиск по содержимому, которое необязательно содержится на вашем компьютере, чудо-кнопка Поиск является связующим звеном между данными в вашей файловой системе и остальным миром. Весьма мощная возможность!
Наличие чудо-кнопки Поиск так же подразумевает то, что пользователю никогда не придется явным образом запускать ваше приложение для того, чтобы выполнять поиск по нему. Простое изменение целевых объекты поиска в панели поиска приводит к тому, что целевые приложения запускаются и у них запрашивается поиск по введенным ключевым словам. Это же позволяет контракту Поиск работать даже в том случае, если текущее приложение переднего плана не поддерживает его – целевым объектом поиска становится первое приложение в списке.
Совет. Если вам нужно знать, на какой стороне экрана появляется панель чудо-кнопки Поиск, чтобы вы могли разместить элементы управления на странице результатов без перекрытия, проверьте свойство ).
Контракт Поиск, который все это делает, составлен из набора взаимодействий между пользовательским интерфейсом, предоставленным Windows и целевым приложением поиска. (В данном разделе, когда я упоминаю целевое приложение, я имею в виду приложение, по которому осуществляется поиск, а не то, которое участвует в операции общего доступа к данным). При этом взаимодействии ключевые слова (даже если они не заданы) передаются приложению, когда пользователь нажимает клавишу Enter, щелкает по значку в правой части поля ввода или меняет приложение. Взаимодействие так же позволяет целевому приложению предоставить предполагаемые варианты запросов, и варианты результаты поиска (с изображениями), которые появляются непосредственно в панели поиска, как показано на рис. 2.2.
(рис 2.1) Панель поиска, активированная посредством чудо-кнопки Поиск, с результатами, показанными для приложений Games (Игры) и Music (Музыка). Как и в случае с Общим доступом, пользователь может управлять тем, какие приложения здесь будут отображаться с помощью настроек, расположенных по адресу Изменение параметров компьютера > Поиск (Change PC Settings > Search). Там же пользователь может очистить историю поиска и настроить некоторые другие параметры пользовательского интерфейса
Поиск должен быть спроектирован так, чтобы он работал с любыми данными, с которыми может работать приложение, являются ли они локальными или онлайновыми (или и теми и другими(. Это, на самом деле, основная задача – осуществлять поиск по всем местам, куда есть доступ у приложения. По этой причине Microsoft настоятельно рекомендует, чтобы приложения не предоставляли своего собственного пользовательского интерфейса для поиска (который отвлекает пользователя от содержимого приложения), если только это не является основной функцией приложения, и если только не требуются дополнительные критерии поиска. В противном случае, лучше всего позволить пользователю начать поиск с чудо-кнопки, а затем фильтровать, сортировать и организовывать результаты поиска в приложении, посредством команд на полотне приложения или в панели приложений. С другой стороны, чудо-кнопка Поиск не предназначена для организации поиска по странице. Таким образом, ожидается, что приложение предоставит свои собственные элементы управления для выполнения поиска по странице и выделения уже отображаемых результатов (так работает функция поиска по странице в браузере). Подробности об этих вопросах дизайна можно найти в материале "Руководство и контрольный список для поиска" ( http://msdn.microsoft.com/library/windows/apps/hh465233.aspx).
(рис 2.2) Предложеные целевым приложением варианты запросов (слева) и предложенные варианты результатов поиска (справа) отображаются непосредственно в панели поиска
При поиске по приложению происходит перенаправление на страницу результатов поиска, как показано на рис. 2.1., что активирует приложение в том же скриптовом контексте, в котором оно находится при нормальном запуске. Опять же, если приложение нужно запустить для обслуживания поискового контракта, оно будет запущено со страницей поиска (мы скоро рассмотрим этот механизм). Прикосновение к результату при навигации по результатам приведет к переходу к странице с подробными сведениями о результате. Конечно, если приложение уже выполняется, когда происходит обращение к нему из интерфейса чудо-кнопки Поиск, кнопка Назад страницы результатов должна осуществлять переход к той странице, на которой до этого находился пользователь. Даже если приложение запущено специально для обслуживания нужд чудо-кнопки Поиск, полезно предоставить пользователю средства навигации на домашнюю страницу, особенно если на странице поиска нет результатов, посредством которых пользователь может перемещаться по приложению.
Посмотрим на основные взаимодействия с контрактом Поиск, после чего рассмотрим расширенные возможности поиска: варианты запросов, варианты результатов, и функция ввода для поиска (type to search).
Существование приложения в роли целевого приложения поиска, начинается, как и в случае с другими контрактами, в манифесте приложения, на закладке Объявления (Declarations), как показано на рис. 2.3.
(рис 2.3) Страница объявления параметров поиска в Visual Studio. Параметры в разделе App Settings для приложений на HTML/JavaScript не заполняются
Так как поиск не привязан к какому-то определенному формату данных (как привязан общий доступ), все, что вам нужно – это задать начальную страницу поиска, которая отделена от остального приложения. В отличие от контракта общего доступа, поисковый контракт гораздо сильнее интегрирован с навигацией по приложению: когда пользователь касается одного из результатов на странице результатов поиска, осуществляется переход на соответствующую страницу приложения, как если бы пользователь прикоснулся к тому же элементу в каком-нибудь другом списке. Похожим образом, если пользователь нажимает на кнопку Назад на странице результатов, его следует перенаправить на страницу, на которой он был до того, как воспользовался чудо-кнопкой Поиск. По этой причине активация приложения посредством поискового контракта обычно обрабатывается с помощью события activated основного приложения. Мы увидим это в следующем разделе.
Простой способ добавить поддержку контракта Поиск заключается в использовании Шаблона элемента контракта "Поиск" в Visual Studio и Blend. (Его можно увидеть чуть выше шаблона элемента для контракта общего доступа на рис. 2.4). Если вы щелкните правой кнопкой по проекту и выберете команду Добавить > Создать элемент (Add > New Item), или воспользуетесь командой меню Проект > Создать новый элемент (Project > Add New Item), вы сможете выбрать Шаблон элемента контракта "Поиск" из списка шаблонов. Эта команда добавит объявление о поддержке поискового контракта в манифест, добавит три файла элемента управления страницы (.html, .js и .css) для страницы результатов поиска. Внешний вид страницы не особенно интересен, чтобы его показывать, так как код шаблона очень сильно полагается на работу с полученными реальными данными. Несмотря на это, шаблона дает вам отличную структуру, с которой можно работать, включая рекомендованный пользовательский интерфейс для обеспечения фильтрации и так далее. Некоторые дополнительные подробности можно найти в материале "Добавление шаблона элемента контракта "Поиск" (http://msdn.microsoft.com/library/windows/apps/hh923025.aspx ).
Базовое взаимодействие с контрактом Поиск заключается в получении запроса на поиск при исполняющемся приложении. Вот хороший пример того, как поиск вызывает перемещения по приложению. Для получения подобного запроса вам лишь нужно прослушивать событие ) объекта ). Код для этого выглядит так, здесь searchPageURI задает страницу результатов поиска:
var searchPane = Windows.ApplicationModel.Search.SearchPane.getForCurrentView();
searchPane.onquerysubmitted = function (eventArgs) {
WinJS.Navigation.navigate(searchPageURI, eventArgs);
};
Здесь объект ) и содержит лишь два свойства: queryText (содержимое текстового поля на панели поиска) и language (тег текущего используемого языка в формате BCP 47). В вышеприведенном коде они просто передаются методу WinJS.Navigation.navigate, который передает их на страницу результатов поиска (на ту, куда ведет searchPageURI). Теперь эта страница обрабатывает queryText в соответствии с параметром language и заполняет содержимое страницы соответствующими элементами. Обычно для этой цели приложение использует элемент управления ListView, как вы можете ожидать, для коллекции результатов переменной длины.
Посредством того же самого объекта SearchPane вы так же можете задать свойство placeholderText, которое может содержать текст, который должен появиться в исходном поле ввода поисковой строки. Его метод show позволяет вам программно показывать панель поиска, свойство visible и событие visibilitychanged сообщают вам о ее состоянии, и свойство queryText предоставляет текущее содержимое элемента управления для ввода текста..
Кроме того, вы можете прослушивать ее событие ) будет содержать свойства ) , которое предоставляет сведения о тексте, введенном с помощью редактора метода ввода (IME), в особенности – языковые альтернативы. Если вы ожидаете, что у вас будут пользователи из Японии или Китая, настоятельно рекомендуется выполнять поиск и по альтернативным словам в ответ на querychanged и suggestionsrequested (смотрите следующий раздел).
Посмотрим, как вызов для поиска воздействует на активацию приложения, которая, опять же, обычно происходит с помощью обработчика activated по умолчанию, в том же скриптовом контексте, как и при обычном запуске приложения.
В данном случае значение вида активации будет search, его нужно обрабатывать отдельно от варианта ). Его код активации можно найти в js/default.js – это код, который применим ко всему приложению.
function activated(eventObject) {
if (eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch)
{ eventObject.setPromise(WinJS.UI.processAll().then(function () {
var url = WinJS.Application.sessionState.lastUrl || scenarios[0].url;
return WinJS.Navigation.navigate(url);
}));
} else if (eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.search)
{ eventObject.setPromise(WinJS.UI.processAll().then(function () {
if (eventObject.detail.queryText === "") {
// Навигация на исходную страницу так как пользователь выбрал приложение.
} else {
// Отображение результатов в пользовательском интерфейсе для eventObject.detail.queryText и
// eventObject.detail.language (который представляет региональные установки пользователя).
}
// Перемещение к первому сценарию, который обрабатывает активацию для целей поиска
var url = scenarios[0].url;
return WinJS.Navigation.navigate(url, { searchDetails: eventObject.detail });
}));
}
}
В части кода, ответственной за активацию при поиске, правильно будет избегать любой обработки данных, которая не нужна для страницы поиска, но вам нужно быть готовым к перемещению к другим частям приложения при выборе результата. Кроме того, если приложение запущено для обслуживания поискового контракта, убедитесь в том, что перезагрузили основные настройки, которые вы загружаете при нормальном запуске, и так же состояние сеанса работы, если previousExecutionState находится в состоянии terminated. На самом деле, это означает, что состояние страницы результатов – это часть состояния сеанса работы приложения. Обычно последние результаты поиска сохраняют как часть сеанса, поэтому вы можете восстановить состояние страницы поиска когда это нужно.
В примере не осуществляется поиск по реальным данным – он лишь выводит сообщение, когда происходят определеные события. Но вы можете протестировать пути кода активации двумя способами. Первый, если приложение не исполняется, откройте интерфейс чудо-кнопки Поиск, введите какой-нибудь текст запроса и затем выберите приложение-пример. Вы обнаружите, что отобразится страница для Сценария 1, на которой отобразятся условия поиска. Это говорит вам о том, что активация обработана, и поисковый запрос взят из eventObject.detail.queryText, как вы можете видеть в вышеприведенном коде. (Кроме того, посмотрите на js/scenario1.js, где производится вывод данных на страницу с использованием ее метода processed).
Для того, чтобы пошагово исполнить код, установите точку останова в варианте searchTarget обработчика activated и запустите приложение в отладчике Visual Studio. Запустите чудо-кнопку Поиск, введите запрос, выберите какое-нибудь другое приложение (которое и выполнит поиск) и потом вернитесь обратно к приложению из примера. Точка останова должна сработать, так как обработчик активации был вызван с видом активации search.
При активации для обслуживания поискового контракта, убедитесь, что страница полностью обработана с помощью вызова наподобие WinJS.UI.processAll (Вам не нужно об этом беспокоиться, если приложение уже исполняется; processAll не будет выполнять избыточную работу)
Важно отметить, что при активации вашего приложения, и при обработке события querysubmitted, и/или querychanged, queryText может быть пустым. В подобном случае вы можете показать результаты по умолчанию, или переместиться на домашнюю страницу, если такой вариант лучше подходит. Смотрите врезку "Тестирование поиска".
Некоторые варианты в интерфейсе чудо-кнопки Поиск могут влиять на то, как и с какими параметрами запускается целевое приложение поиска. Для того, чтобы убедиться, что вы испытали все применимые ветви кода, убедитесь в том, что протестировали приложение со следующими условиями:
Так же вам следует помнить о том, как вы представляете результат, заботиться о том, чтобы основные результаты не были перекрыты панелью поиска, которая будет оставаться видимой, пока пользователь не закроет ее.
Некоторые виды приложений все еще поддерживают собственный интерфейс поиска по приложению в дополнение к использованию панели поиска, или, другими словами, у них могут быть некоторые параметры поиска, которые хорошо было бы синхронизировать с теми же данными, отображаемыми в панели поиска. Для того, чтобы сделать это, приложение может запросить у панели поиска ее значение ). Знайте, что подобный вызов может не получиться, если приложение не видимо, или если панель поиска уже видима или становится видимой.
Использование querysubmitted и последовательности активации в предыдущем разделе дает вам базовый уровень поискового взаимодействия, и Windows автоматически предоставляет истоию поиска пользователя. Однако, выполнив некоторые дополнительные действия, вы можете сделать поисковый опыт взаимодействия пользователя и системы богаче. Так как написание кода, который выполняет поиск, обработка результатов и их представление – это, в любом случае, основная работа с контрактом Поиск, добавление поддержки предложения вариантов запроса (в этом разделе) и вариантов результатов (в следующем), это сравнительно маленькое вложение в серьезное увеличение качества опыта взаимодействия пользователя и системы.
Для того, чтобы выйти за пределы поисковой истории и предлагать пользователю варианты запросов когда он вводит запрос, что выглядит для пользователя как то, что показано в левой части рис. 2.2, вы можете использовать два параметра. Какой из них использовать, зависит от того, что вы хотите предложить, и от данных, по которым осуществляется поиск.
Во-первых, для предоставления предложений вариантов из папок файловой системы, по которым осуществляется поиск, таким, как библиотеки музыки, изображений и видео, панель поиска предоставляет встроенную реализацию посредством ее метода ), что приводит к результатам, похожим на показанные на рис. 2.2. Как показано в Сценарии 4 примера, сначала создают объект Windows.ApplicationModel.Search.LocalContentSuggestionSettings (http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.search.localcontentsuggestionsettings.aspx ), заполняют его свойства и передают его setLocalContentSuggestionsSettings (js/scenario4.js):
var page = WinJS.UI.Pages.define("/html/scenario4.html", {
ready: function (element, options) {
var localSuggestionSettings = new
Windows.ApplicationModel.Search.LocalContentSuggestionSettings();
localSuggestionSettings.enabled = true;
localSuggestionSettings.locations.append(Windows.Storage.KnownFolders.musicLibrary);
localSuggestionSettings.aqsFilter = "kind:=music";
Windows.ApplicationModel.Search.SearchPane.getForCurrentView()
.setLocalContentSuggestionSettings(localSuggestionSettings);
}
});
(рис 2.4) Предложения вариантов из локальных папок, автоматически предоставляемое панелью поиска
При заполнении свойств LocalContentSuggestionSettings , убедитесь, для начала, в том, что установили enabled в true. Коллекция locations (вектор) содержит один или большее количество объектов StorageFolder, которые показывают, где должен осуществляться поиск. Так как перечисление файлов для предоставления предложений требует программного доступа к этим папкам, вы должны убедиться в том, что в манифесте приложения сделаны соответствующие объявления, получить эти папки из AccessCache, или получить программный доступ к ним с помощью средства выбора файлов. В последнем случае приложение может предоставить пользовательский интерфейс для настройки мест поиска (возможно, например, в панели параметров).
Вы так же можете задать строку Advanced Query Syntax (AQS) (http://msdn.microsoft.com/library/windows/apps/aa965711.aspx ) в свойстве ) (наподобие System.Title) в propertiesToMatch (строковый вектор). Это обычно используется для фильтрации по типам файлов, как при поиске в папке, но здесь вы можете задать все, что нужно. Для того, чтобы узнать больше об AQS, обратитесь к Главе 2 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript", больше о свойствах Windows вы можете узнать в Главе 4 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript".
Что касается второй возможности, ) будет содержать, как обычно, свойства queryText, language, и linquisticDetails, и в ответе на событие вы заполняете коллекцию, содержащую до пяти придложений в eventArgs.request.searchSuggestionCollection (опять же, при необходимости включая альтернативы в объекте linguisticDetails). В идеале все это занимает полсекунды или меньше, и важно знать, что все необходимые результаты должны присутствовать в коллекции как только вы вернетесь из обработчика события.
Вот, как это реализованов Сценарии 2 примера реализации поискового контракта (здесь suggestionList – это заданный в коде список названий городов):
Windows.ApplicationModel.Search.SearchPane.getForCurrentView().onsuggestionsrequested =
function (eventObject) {
var queryText = eventObject.queryText;
var suggestionRequest = eventObject.request;
var query = queryText.toLowerCase();
var maxNumberOfSuggestions = 5;
for (var i = 0, len = suggestionList.length; i < len; i++) {
if (suggestionList[i].substr(0, query.length).toLowerCase() === query) {
suggestionRequest.searchSuggestionCollection.appendQuerySuggestion(
suggestionList[i]);
if (suggestionRequest.searchSuggestionCollection.size ===
maxNumberOfSuggestions) {
break;
}
}
}
};
Таким образом, если в query содержится "ba", как на рис. 2.2., первые пять названий в suggestionList будут Bangkok, Bangalore, Baghdad, Baltimore, и Bakersfield. Конечно, реальное приложение будет брать предложения из собственной базы данных или с какого-либо сервиса (это сымитировано в Сценариях 5 и 6, кстати), но идея у вас есть. Хотя, в случае с сервисом, вам следует так же проверить свойство suggestionResult.isCanceled прежде чем начинать новый запрос: этот флаг показывает, что поисковый запрос не изменился по сравнению с предыдущим запросом, и, значит, нет необходимости заполнять список предложений.
Примечание. Когда свойство SearchPane.searchHistoryEnabled установлено в true (по умолчанию), автоматически отслеживается история поиска пользователя и основные поисковые запросы отображаются при запуске интерфейса чудо-кнопки Поиск (прежде чем пользователь начнет вводить поисковый запрос). Установка этого свойства в false открючит такое поведение и в таком случае приложение сможет поддерживать собственную историю предыдущих значений queryText. Если приложение это делает, мы рекомендуем предоставлять в панели настроек приложения средства для очистки истории.
Так же приложения могут использовать свойство SearchPane.searchHistoryContext для создания различных наборов исторических данных поиска, зависящих от контекста. Когда это значение установлено до запуска интерфейса поиска, автоматически управляемые поисковые запросы (searchHistoryEnabled установлено в true) будут сохранены для этого контекста. Это не оказывает влияния, если приложение само поддерживает историю, в таком случае оно может самостоятельно поддерживать различные списки исторических данных по запросам.
Свойство ), имеет несколько возможностей, о которых полезно знать. Его свойство ) со свойством size и четырьмя методами: appendQuerySuggestion (для добавления в список отдельного элемента, как показано выше), appendQuerySuggestions (для добавления массива элементов, который вы можете получить из запроса к сервису), appendResultSuggestion (смотрите следующий раздел) и appendSearchSeparator (который используется для группировки предложений). В последнем случае, разделителю задается подпись, как показано ниже:
У объекта запроса так же есть метод getDeferral, который используется, если для получения предложений выполнить асинхронную операцию. Это работает как и прочие отложенные механизмы, которые мы уже видели: перед запуском асинхронной операции (наподобие WinJS.xhr), вызывается getDeferral для получения отложенного объекта, начинается операция, осуществляется возврат из метода suggestionsrequested, и вызывается метод отложенного объекта complete внутри асинхронного обработчика завершения. Это показано в Сценариях 5 и 6 примера, так как это, очевидно, необходимо при запрашивании данных с сервиса для этой цели (код взят из sj/scenario5.js):
Windows.ApplicationModel.Search.SearchPane.getForCurrentView().onsuggestionsrequested =
function (eventObject) {
var queryText = eventObject.queryText;
var suggestionRequest = eventObject.request;
var deferral = suggestionRequest.getDeferral();
// Создает запрос для получения предложений из сервиса и предоставляет их панели поиска.
// В зависимости от устройства сервиса, вы можете использовать различные URL, основанные на eventObject.language.
// Так же вы можете составить queryText в URL для того, чтобы позволить сервису выполнить фильтрацию.
xhrRequest = WinJS.xhr({ url: /* URL к сервису с предложениями вариантов */ });
xhrRequest.done(
function (request) {
if (request.responseText /* или responseXML */) {
// Заполняет suggestionRequest.searchSuggestionCollection на основе ответа
}
deferral.complete(); // Показывае, что мы успешно получили предложения.
},
function (error) {
// Вызывает complete отложенного объекта при возникновении ошибки.
deferral.complete();
});
};
Вы можете использовать любые необходимые форматы ответов JSON или XML, но так как ваше приложение выполняет их разбор, существуют стандарты на возвращаемые поисковые предложения. Для JSON, обратитесь к "OpenSearch Suggestions specification" (http://www.opensearch.org/Specifications/OpenSearch/Extensions/Suggestions/1.1 ) и к Сценарию 5, где JSON-ответ может быть напрямую преобразован в массив и передан в одном вызове appendQuerySuggestions. В случае с XML обратитесь "XML Search suggestions Format Specification" (http://msdn.microsoft.com/library/cc891508.aspx ) и к Сценарию 6. В последнем случае, функция generateSuggestions представляет стандартное средство для разбора подобного ответа, и, хотя в примере не показано использование разделителей, URI и изображений в подобных ответах, функция generateSuggestions показывает, как обрабатывать их и отправлять в appendQuerySuggestion[s] , как и в appendResultSuggestion, которую мы сейчас рассмотрим.
Другими словами, обработка события querysubmitted подразумевает, что вы возьмете текст запроса и заполните список результатов на вашей собственной странице. Поэтому вы нарямую обрабатываете события щелчка или прикосновения к этим элементам, перемещаясь к соответствующей странице с подробной информацией. Событие resultSuggestionChosen сообщает вам о том, что то же самое произошло на системной панели приложения, на которой отображены предложенные вами данные. Таким образом, вы обрабатываете событие resultSuggestionChosen так же, как вы обрабатывали бы активацию элемента на вашей собственной странице. Свойство eventArgs.tag в данном случае будет содержать тег, который вы предоставили для предложенного результата в вызове appendResultSuggestion.
Этот метод принимает пять аргументов в следующем порядке, здесь нужно позаботиться о локализации:
text – первая строка текста для показа в панели поиска (как на рис. 2.2).detailText – вторая строка текста для результата поиска (как на рис. 2.2), которая так же используется как текст всплывающей подсказки.tag – строка, которые вы хотите получить в событии resultSuggestionChosen.imageAlternateText – атрибут alt для изображения.
Как отмечено в предыдущем разделе, функция generateSuggestions из Сценария 6 примера предоставляет стандартный обработчик, который переводит предложения результатов поиска из формата XML в вызов appendResultSuggestion, включая использование Windows.Storage.Streams.RandomAccessStreamReference.createFromUri для преобразования URI изображения в соответствующее описание потока. Обычно подобные URI указывают на удаленный ресурс, который, в идеале, должен позволить вам запрашивать изображения различных размеров на основании масштабирования разрешения.
Локальные URI ms-appx:// и ms-appdata:// так же можно использовать с использованием соответствующего соглашения о формате имен .scale-1x0. Вам, фактически, всегда следует иметь в пакете изображения по умолчанию для предлагаемых результатов поиска (используя URI ms-appx:// для обращения к ним при необходимости). Система не будет предоставлять их вам автоматически.
Последняя особенность поиска заключается в возможности имитировать поведение "ввод для поиска" Начального экрана Windows, когда пользователь не выполняет явную активацию чудо-кнопки Поиск. Если вы не делали этого раньше и у вас есть компьютер, оснащенный физической клавиатурой, нажмите на клавишу Windows для того, чтобы попасть на Начальный экран и начните вводить название какого-нибудь приложения не открывая интерфейс чудо-кнопки Поиск. Вуаля! Панель поиска появилась автоматически, с уже отфильтрованными и отображенными результатами. Это такое же поведение, которым отличалась кнопка Пуск в предыдущих версиях Windows, но сейчас все это выглядит гораздо привлекательнее!
Для того, чтобы включить подобную возможность для своего приложения, просто установите свойство SearchPane.showOnKeyboardInput (http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.search.searchpane.showonkeyboardinput.aspx ) в значение ).
Разработчики приложений для Windows 8 часто спрашивают, может ли одно приложение запускать другое. Ответ на этот вопрос положителен, с некоторыми ограничениями (не удивлены ли вы!). Во-первых, приложения можно запускать только посредством сопоставления типа файла или схемы URI, а не напрямую по названию или через исполняемый файл. Говоря точнее, единственный способ, которым может воспользоваться Windows 8 для того, чтобы запустить другое приложение – это касается и классических приложений – это воспользоваться API Windows.System.Launcher (http://msdn.microsoft.com/library/windows/apps/windows.system.launcher.aspx ), которое представляет две возможности:
launchFileAsync – запускает другое приложение, связанное с заданным объектом StorageFile. Необязательный объект LauncherOptions позволяет задавать некоторые подробности (смотрите ниже)launchUriAsync – запускает другое приложение, связанное с заданной схемой URI, снова, с объектом LauncherOptions или без него.
Примечание.
И для " ) и "Обработка активации протокола" (http://msdn.microsoft.com/library/windows/apps/hh452686.aspx ) содержат список специальных типов файлов и схем URI, о которых идет речь. Схема URI file:// допустима в launchUriAsync, но только для URI, которые принадлежат локальной сети, и тогда, когда в манифесте приложения объявлена возможность Частные сети (клиент и сервер) (Private Networks (Client Server)).
Результат этих асинхронных методов, который передается в обработчик завершения, имеет логический тип: они возвращают true, если запуск произошел успешно, и false – если нет. Таким образом, если не произойдет катастрофический сбой, такой, как нехватка памяти, при котором асинхронная операция не будет выполнена, эти операции обычно сообщают об успешном результате в обработчик завершения, в логическом значении, указывающем на результат. Вы получите результат false, если попытаетесь запустить файл, который содержит исполняемый код, или другие файлы, заблокированные по соображениям безопасности.
Однако, невозможно знать заранее, каким будет результат. По этой причине используется параметр LauncherOptions (http://msdn.microsoft.com/library/windows/apps/windows.system.launcheroptions.aspx), посредством которого вы можете обеспечить механизмы обратной связи:
treatAsUntrusted (логического типа, значение по умолчанию – false) отобразит предупреждение пользователю о том, что будет произведено переключение на другое приложение, если выполнение операции продолжится (сморите изображение ниже). Этот подход полезно использовать, когда вы не уверены в источнике сопоставления, как, например, при открытии URI, найденного внутри PDF-файла или другого документа, и хотите предупредить столкновение пользователя с классическим проявлением недобросовестной рекламы!
displayApplicationPicker (логического типа, значение по умолчанию – false) позволяет пользователю выбирать, какое приложение запускать для обработки (смотрите изображение ниже). Отметим, что этот пользовательский интерфейс позволяет пользователю изменять приложение по умолчанию для последующих вызовов. Кроме того, свойство LauncherOptions.ui можно использовать для управления размещением средства выбора приложения.
preferredApplicationDisplayName и preferredApplicationPackageFamilyName предоставляют пользователю предложения по загрузке из Магазина Windows конкретных приложений, если ни одно другое приложение не способно обслужить запрос. Это очень полезно с особыми схемами URI или типами файлов, для работы с которыми вы предоставляете приложение.fallbackUri задает URI, по которому будет перенаправлен пользователь, если не будет найдено приложения для обработки запроса, и у вас нет конкретных предложений приложений из Магазина Windows.launchUriAsync, опция contentType идентифицирует тип содержимого, ассоциированного с URI, который управляет тем, какое приложение будет запущено. Это особенно полезно, когда URI не содержит конкретной схемы, а просто ссылается на файл в сети, используя схему наподобие http или file, которая обычно обрабатывается браузером для загрузки файлов. С использованием contentType, будет запущено приложение, которое зарегистрировано для данного типа содержимого, а не для схемы. Это приложение, конечно, должно иметь возможность использовать URI для доступа к файлу. Другими словами, эта опция является способом передать URI, а не передать весь файл, в обработчик приложения, о котором известно, что оно может работать с данным URI.Сценарии 1 и 2 примера "Запуск приложения для сопоставленных типов файлов и протоколов" ( http://code.msdn.microsoft.com/windowsapps/Association-Launching-535d2cec), предоставляют демонстрацию ипользования этих методов с некоторыми из опций, таким образом, вы сможете увидеть их действие. С другой стороны, как показано в Сценариях 2 и 3 того же примера, это вопрос о том, как приложение связывает себя с типом файла или схемой URI для того, чтобы оно могло быть запущено подобным образом. Эти сопоставления составляют контракт Активация файла (File Activation) и контракт Активация протокола (Protocol activation). В обоих случаях целевое приложение должно объявить о типе файла и/или схеме URI, которые оно намеревается обслуживать, в манифесте, и затем должно предоставить способы активации для этих целей, как мы увидим в следующем разделе.
Опять же, сопоставление файла или схемы URI – это единственное средство, с помощью которого приложение Windows 8 может запустить другое приложение, таким образом, нет гарантии, что вы действительно запустите конкретное приложение. Конечно, чем уникальнее и специфичнее тип файла или схема URI, тем менее вероятно, что у пользователя будет несколько приложений для обработки подобного сопоставления, или даже то, что несколько подобных приложений будут присутствовать в Магазине Windows. На самом деле, разработка уникального интерфейса схемы URI, где схема вполне очевидно специфична для приложения, действительно лучший способ для того, чтобы запущенное Windows 8-приложение могло передавать другому выполнение задачи, так как посредством строки URI можно передать любые данные. Приложение Maps (Карты) в Windows 8, например, поддерживает схему bingmaps для выполнения задач, связанных с картами, поступающих от других приложений. Вы можете представить то же самое для биржевого приложения, для календаря, почтового клиента (помимо mailto) и так далее. Если вы создаете подобную схему и хотите, чтобы другие приложения могли ей пользоваться, вам, конечно, нужно представить документацию с подробностями ее использования, что подразумевает, что другие приложения могут реализовать ту же самую схему, и, таким образом, представлять собой альтернативу в Магазине Windows. Таким образом, нет гарантии, даже с весьма специфической схемой, что вы можете быть уверены в том, что запустите другое известное приложение, но это все, что можно получить от данной возможности .
Для того, чтобы добавить в приложение возможность обрабатывать файлы, для начала пройдите в раздел Объявления (Declaration) редактора манифеста и добавьте Сопоставление типов файлов (File Type Associations), интерфейс Visual Studio для выполнения данной задачи показан на рис. 2.5. У каждого типа файла может быть множество конкретных обозначений (обратите внимание на кнопку Добавить (Add new) ниже раздела Поддерживаемый типы файлов (Supported File Types), например, у файлов формата JPEG могут быть расширения .jpg и .jpeg. Обратите внимание на то, что обработка файлов некоторых типов запрещена для приложений, смотрите их полный список в материале "Обработка активации файла" (http://msdn.microsoft.com/library/windows/apps/hh452684.aspx ).
В группе Свойства (Properties), Отображаемое имя (Display name) – это общее имя для группы типов файлов (это не обязательный параметр; он не нужен, если речь идет лишь об одном типе файла). Параметр Имя (Name), с другой стороны, необходим – это внутренний идентификатор для группы файла, и то, что должно оставаться неизменным в течение всего времени существования приложения, не меняться при обновлениях. В некотором смысле, свойства Имя/Отображаемое имя для группы файлов напоминают настоящее имя, а отдельные типы файлов напоминают псевдонимы – любой из них, в конечном счете, относится к сущности типа файла и к вашему приложению.
Подсказка (Info Tip) – это текст всплывающей подсказки, которая появляется, когда пользователь наводит указатель на файл данного типа и приложение является основным приложением для обработки этого типа файлов. Параметр Значок (Logo) имеет некоторые особенности. Здесь, в Visual Studio, вы просто ссылаетесь на базовое имя для файла изображение, как обычно делается с другими изображениями в манифесте. В проекте же вам следует иметь несколько файлов для одного и того же изображения с различными целевыми размерами (не имеющими отношения к масштабированию разрешения): 16x16, 32x32, 48x48, и 256x256. Пример "Запуск приложения для сопоставленных типов файлов и протоколов" (http://code.msdn.microsoft.com/windowsapps/Association-Launching-535d2cec ) использует подобные изображения с суффиксами targetsize-* в имени файла . Использование изображений различных размеров помогает Windows предоставлять наилучший опыт взаимодействия на устройствах различных типов.
(рис 2.5) Интерфейс Объявления (Declaration) > Сопоставление типов файлов (File Type Associations) в редакторе манифеста Visual Studio
В группе параметров Флаги изменения (Edit Flags) можно управлять тем, будет ли доступно действие Открыть (Open) для загруженных файлов данного типа: установка параметра Безопасное открытие (Open Is Safe) активирует эту команду в различных частях пользовательского интерфейса Windows; установка параметра Всегда небезопасно (Always Unsafe) отключает эту команду. Если оставить оба этих флага неустановленными, доступность команды будет зависеть от того, откуда поступил файл, а так же от других установок системы.
В самой нижней части этого окна вы так же можете установить отдельную начальную страницу (Start page) для обработки активации, однако, обычно используют основной обработчик активации, как показано в js/default.js примера обработки сопоставлений (посмотрите в js/scenario3.js).
Там вы примете вид активации file, в подобном случае eventArgs.detail будет объектом типа WebUIFileActivatedEventArgs (http://msdn.microsoft.com/library/windows/apps/windows.ui.webui.webuifileactivatedeventargs.aspx ), его свойство files содержит массив объектов StorageFile из Windows.System.Launcher.launchFileAsync, и его свойство verb будет иметь значение "open". В ответ, конечно, приложение открывает файл и представляет его содержимое соответствующим образом.
Конечно, так как файл может поступить откуда угодно, воспринимайте его как содержимое, которому нельзя доверять, как мы уже упоминали в разговоре о целевых объектах общего доступа. Избегайте выполнения на основе содержимых таких файлов действий, последствия которых нельзя отменить.
Как и в случае с контрактом Поиск, протестируйте обработку активации файла, когда приложение уже исполняется, и когда оно должно быть запущено. Во всех случаях убедитесь в том, что загружаете параметры приложения и восстанавливаете состояние сеанса, если
eventArgs.detail.previousExecutionState содержит значение terminated.
Создание сопоставления со схемой URI очень похоже на сопоставление с типом файла. В разделе редактора манифеста Объявления (Declarations), добавьте объявление Протокол (Protocol), как показано на рис. 2.6.
(рис 2.6) Интерфейс Объявления (Declaration) > Протокол (Protocol) в редакторе манифеста Visual Studio
В разделе Свойства (Properties) свойства Значок (Logo), Отображаемое имя (Display Name) и Имя (Name) имеют то же значение, что и для настройки сопоставления типа файла (смотрите предыдущий раздел). Похожим образом, хотя вы можете задать отдельную начальную страницу, обычно активацию протокола обрабатывают в основном обработчике активации, как показано в js/default.js примера об обработке активации файлов и протоколов (пройдите в js/scenario4.js).
Здесь вы принимаете вид активации protocol, в подобном случае ), его свойство uri содержит URI из Windows.System.Launcher.launchUriAsync.
Снова хочу предупредить, что URI с уникальными схемами могут поступать отовсюду, в том числе – из потенциально вредоносных источников. Опасайтесь любых данных или запросов в URI и старайтесь не выполнять, основываясь на них, необратимых изменений. Например, вы, возможно, можете перейти на новую страницу, но не меняйте записи базы данных, пытаясь выполнить команду eval для чего-либо, переданного в URI.
Тем не менее, сопоставление протокола является основным способом, с помощью которого приожение может, когда это необходимо, предоставить ценные услуги другим приложениям. Встроенное приложение Maps (Карты), например, поддерживает схему URI bingmaps:// и сопоставление с ней, что позволяет вам просто открыть URI соответствующего формата для того, чтобы показать пользователю интерактивную карту вместо того, чтобы пытаться реализовать подобную функциональность самостоятельно. Это похоже на то, как при использовании почтовго клиента применяют схему mailto:; другие приложения могут просто создать интерфейс для схемы URI для работы с другими сервисами и рабочими процессами.
Совет. Для отладки активации для обработки протокола вам нужно иметь возможность запускать приложение в отладчике при активации. Для того, чтобы это сделать, откройте свойства проекта (команда меню Проект > Свойства (Project > Properties) в Visual Studio) и затем в разделе Свойства конфигурации > Отладка (Configuration Properties > Debugging) установить параметр Запустить приложение (Launch Application) в значение Нет (No).
Возвращаясь к Главе 2 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript", где мы рассматривали использование средств выбора файлов и папок для получения доступа не только к файловой системе, но и к содержимому, которым управляют другие приложения, или даже к такому, которой создается по запросу другими приложениями. Внесем ясность в этот вопрос: приложения, которые используют средство выбора файлов, делают это для получения объектов StorageFile или StorageFolder для каких-либо целей. Но это не означает, что приложения-поставщики, которые могут быть активированы с помощью средства выбора файлов, обязательно управляют своими данными как файлами или папками. Их задача заключается в том, чтобы упаковать любые данные, которыми они управляют так, чтобы они выглядели, для средства выбора файлов, как файлы или папки.
В Главе 2 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript", например, мы видели, как приложение Windows 8 для работы с камерой может быть использовано для получения фотографий и передачи их с помощью средства выбора файлов. Подобные фотографии не существуют, когда активируется целевое приложение. Вместо этого, оно отображает интерфейс, посредством которого пользователь может создать файл своими силами, который потом будет передан с помощью средства выбора файла. Таким образом, приложение для работы с камерой ускоряет весь процесс по созданию нового изображения, предоставляя эту функцию в точности тогда, когда пользователь пытается выбрать файл изображения. В противном случае пользователь запустил бы приложение Camera (Камера) отдельно, сделал бы фотографию, сохранил бы ее в локальной файловой системе, переключился бы к исходному приложению для того, чтобы запустить средство выбора файлов и найти эту новую фотографию.
Конечно, средство выбора файлов не ограничено фотографиями: оно работает с файлами любых типов, в зависимости от того, что запрашивает вызывающее его приложение. Одно приложение может позволить пользователю просматривать библиотеку музыки, покупать и загружать записи, и передавать полученный файл средству выбора файлов. Другое может выполнять какие-то запросы к базе данных и возвращать результат в виде файла, еще какое-нибудь приложение может позволить пользователю просматривать онлайновую базу данных с сущностями, представляемыми в виде файлов, скрывая детали загрузки и упаковки этих данных в файлы, как и ожидает пользователь от средства выбора файлов. Причем, такое поведение не зависит от того, осуществляется ли работа с локальной файловой системой, с онлайновыми ресурсами или с приложениями, которые создают данные динамически. Возможно создать приложение, которое генерирует или получает данные, похожие на файлы, как приложение Camera (Камера), которое позволяет делать фотографии, или приложение для работы со звуком, которое может записывать новые звуки. В подобном случае, однако, помните что контракт Средство выбора файлов создан для выполнения сравнительно быстрых операций по работе с файлами. По этой причине приложению следует предоставлять лишь базовые средства редактирования данных (наподобие кадрирования фотографии или обрезки звука) в данном контексте.
Как в случае с целевыми объектами контрактов Поиск и Общий доступ, Visual Studio и Blend предоставляют шаблон элемента для поставщиков средства выбора файлов, в частности, это Контракт средства выбора файлов для открытия (File Open Picker contract item), в окне, которое появляется по команде Добавить > Создать элемент (Add > New Item), которое мы видели ранее (этот пункт скрыт выше списка, показанного на рис. 22.4). Этот элемент предоставляет вам базовую структуру для выбора файлов, построенную на основе элемента управления ListView, но не более того. Здесь мы не будем использовать этот шаблон, вместо этого возьмем соответствующие элементы из примеров. Говоря в общем, при обслуживании контракта Средство выбора файлов, приложению следует использовать тот же самый режим просмотра и интерфейс, который оно имеет при обычном запуске, таким образом, сохраняя единообразие опыта работы с ним при обоих сценариях.
Функция поиска так распространена среди приложений, что разработчики Windows 8 решили предоставить системный интерфейс для поиска по ключевым словам (с встроенной поддержкой редактора методов ввода (Input Method Editor) среди чудо-кнопок Общий доступ, Устройства и Параметры на панели чудо-кнопок, как можно видеть на рис. 2.1. Это означает, что приложениям не нужно (и обычно не следует) предоставлять собственный интерфейс для поиска. И, пользуясь средствами этого контракта, пользователь не только может осуществлять поиск по приложению переднего плана, но и очень просто и быстро осуществлять поиск по другим приложениям без необходимости выходить из текущего режима работы и запускать эти приложения. И, потому что другие приложения могут выполнять поиск по содержимому, которое необязательно содержится на вашем компьютере, чудо-кнопка Поиск является связующим звеном между данными в вашей файловой системе и остальным миром. Весьма мощная возможность!
Наличие чудо-кнопки Поиск так же подразумевает то, что пользователю никогда не придется явным образом запускать ваше приложение для того, чтобы выполнять поиск по нему. Простое изменение целевых объекты поиска в панели поиска приводит к тому, что целевые приложения запускаются и у них запрашивается поиск по введенным ключевым словам. Это же позволяет контракту Поиск работать даже в том случае, если текущее приложение переднего плана не поддерживает его – целевым объектом поиска становится первое приложение в списке.
Совет. Если вам нужно знать, на какой стороне экрана появляется панель чудо-кнопки Поиск, чтобы вы могли разместить элементы управления на странице результатов без перекрытия, проверьте свойство ).
Контракт Поиск, который все это делает, составлен из набора взаимодействий между пользовательским интерфейсом, предоставленным Windows и целевым приложением поиска. (В данном разделе, когда я упоминаю целевое приложение, я имею в виду приложение, по которому осуществляется поиск, а не то, которое участвует в операции общего доступа к данным). При этом взаимодействии ключевые слова (даже если они не заданы) передаются приложению, когда пользователь нажимает клавишу Enter, щелкает по значку в правой части поля ввода или меняет приложение. Взаимодействие так же позволяет целевому приложению предоставить предполагаемые варианты запросов, и варианты результаты поиска (с изображениями), которые появляются непосредственно в панели поиска, как показано на рис. 2.2.
(рис 2.1) Панель поиска, активированная посредством чудо-кнопки Поиск, с результатами, показанными для приложений Games (Игры) и Music (Музыка). Как и в случае с Общим доступом, пользователь может управлять тем, какие приложения здесь будут отображаться с помощью настроек, расположенных по адресу Изменение параметров компьютера > Поиск (Change PC Settings > Search). Там же пользователь может очистить историю поиска и настроить некоторые другие параметры пользовательского интерфейса
Поиск должен быть спроектирован так, чтобы он работал с любыми данными, с которыми может работать приложение, являются ли они локальными или онлайновыми (или и теми и другими(. Это, на самом деле, основная задача – осуществлять поиск по всем местам, куда есть доступ у приложения. По этой причине Microsoft настоятельно рекомендует, чтобы приложения не предоставляли своего собственного пользовательского интерфейса для поиска (который отвлекает пользователя от содержимого приложения), если только это не является основной функцией приложения, и если только не требуются дополнительные критерии поиска. В противном случае, лучше всего позволить пользователю начать поиск с чудо-кнопки, а затем фильтровать, сортировать и организовывать результаты поиска в приложении, посредством команд на полотне приложения или в панели приложений. С другой стороны, чудо-кнопка Поиск не предназначена для организации поиска по странице. Таким образом, ожидается, что приложение предоставит свои собственные элементы управления для выполнения поиска по странице и выделения уже отображаемых результатов (так работает функция поиска по странице в браузере). Подробности об этих вопросах дизайна можно найти в материале "Руководство и контрольный список для поиска" ( http://msdn.microsoft.com/library/windows/apps/hh465233.aspx).
(рис 2.2) Предложеные целевым приложением варианты запросов (слева) и предложенные варианты результатов поиска (справа) отображаются непосредственно в панели поиска
При поиске по приложению происходит перенаправление на страницу результатов поиска, как показано на рис. 2.1., что активирует приложение в том же скриптовом контексте, в котором оно находится при нормальном запуске. Опять же, если приложение нужно запустить для обслуживания поискового контракта, оно будет запущено со страницей поиска (мы скоро рассмотрим этот механизм). Прикосновение к результату при навигации по результатам приведет к переходу к странице с подробными сведениями о результате. Конечно, если приложение уже выполняется, когда происходит обращение к нему из интерфейса чудо-кнопки Поиск, кнопка Назад страницы результатов должна осуществлять переход к той странице, на которой до этого находился пользователь. Даже если приложение запущено специально для обслуживания нужд чудо-кнопки Поиск, полезно предоставить пользователю средства навигации на домашнюю страницу, особенно если на странице поиска нет результатов, посредством которых пользователь может перемещаться по приложению.
Посмотрим на основные взаимодействия с контрактом Поиск, после чего рассмотрим расширенные возможности поиска: варианты запросов, варианты результатов, и функция ввода для поиска (type to search).
Существование приложения в роли целевого приложения поиска, начинается, как и в случае с другими контрактами, в манифесте приложения, на закладке Объявления (Declarations), как показано на рис. 2.3.
(рис 2.3) Страница объявления параметров поиска в Visual Studio. Параметры в разделе App Settings для приложений на HTML/JavaScript не заполняются
Так как поиск не привязан к какому-то определенному формату данных (как привязан общий доступ), все, что вам нужно – это задать начальную страницу поиска, которая отделена от остального приложения. В отличие от контракта общего доступа, поисковый контракт гораздо сильнее интегрирован с навигацией по приложению: когда пользователь касается одного из результатов на странице результатов поиска, осуществляется переход на соответствующую страницу приложения, как если бы пользователь прикоснулся к тому же элементу в каком-нибудь другом списке. Похожим образом, если пользователь нажимает на кнопку Назад на странице результатов, его следует перенаправить на страницу, на которой он был до того, как воспользовался чудо-кнопкой Поиск. По этой причине активация приложения посредством поискового контракта обычно обрабатывается с помощью события activated основного приложения. Мы увидим это в следующем разделе.
Простой способ добавить поддержку контракта Поиск заключается в использовании Шаблона элемента контракта "Поиск" в Visual Studio и Blend. (Его можно увидеть чуть выше шаблона элемента для контракта общего доступа на рис. 2.4). Если вы щелкните правой кнопкой по проекту и выберете команду Добавить > Создать элемент (Add > New Item), или воспользуетесь командой меню Проект > Создать новый элемент (Project > Add New Item), вы сможете выбрать Шаблон элемента контракта "Поиск" из списка шаблонов. Эта команда добавит объявление о поддержке поискового контракта в манифест, добавит три файла элемента управления страницы (.html, .js и .css) для страницы результатов поиска. Внешний вид страницы не особенно интересен, чтобы его показывать, так как код шаблона очень сильно полагается на работу с полученными реальными данными. Несмотря на это, шаблона дает вам отличную структуру, с которой можно работать, включая рекомендованный пользовательский интерфейс для обеспечения фильтрации и так далее. Некоторые дополнительные подробности можно найти в материале "Добавление шаблона элемента контракта "Поиск" (http://msdn.microsoft.com/library/windows/apps/hh923025.aspx ).
Базовое взаимодействие с контрактом Поиск заключается в получении запроса на поиск при исполняющемся приложении. Вот хороший пример того, как поиск вызывает перемещения по приложению. Для получения подобного запроса вам лишь нужно прослушивать событие ) объекта ). Код для этого выглядит так, здесь searchPageURI задает страницу результатов поиска:
var searchPane = Windows.ApplicationModel.Search.SearchPane.getForCurrentView();
searchPane.onquerysubmitted = function (eventArgs) {
WinJS.Navigation.navigate(searchPageURI, eventArgs);
};
Здесь объект ) и содержит лишь два свойства: queryText (содержимое текстового поля на панели поиска) и language (тег текущего используемого языка в формате BCP 47). В вышеприведенном коде они просто передаются методу WinJS.Navigation.navigate, который передает их на страницу результатов поиска (на ту, куда ведет searchPageURI). Теперь эта страница обрабатывает queryText в соответствии с параметром language и заполняет содержимое страницы соответствующими элементами. Обычно для этой цели приложение использует элемент управления ListView, как вы можете ожидать, для коллекции результатов переменной длины.
Посредством того же самого объекта SearchPane вы так же можете задать свойство placeholderText, которое может содержать текст, который должен появиться в исходном поле ввода поисковой строки. Его метод show позволяет вам программно показывать панель поиска, свойство visible и событие visibilitychanged сообщают вам о ее состоянии, и свойство queryText предоставляет текущее содержимое элемента управления для ввода текста..
Кроме того, вы можете прослушивать ее событие ) будет содержать свойства ) , которое предоставляет сведения о тексте, введенном с помощью редактора метода ввода (IME), в особенности – языковые альтернативы. Если вы ожидаете, что у вас будут пользователи из Японии или Китая, настоятельно рекомендуется выполнять поиск и по альтернативным словам в ответ на querychanged и suggestionsrequested (смотрите следующий раздел).
Посмотрим, как вызов для поиска воздействует на активацию приложения, которая, опять же, обычно происходит с помощью обработчика activated по умолчанию, в том же скриптовом контексте, как и при обычном запуске приложения.
В данном случае значение вида активации будет search, его нужно обрабатывать отдельно от варианта ). Его код активации можно найти в js/default.js – это код, который применим ко всему приложению.
function activated(eventObject) {
if (eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.launch)
{ eventObject.setPromise(WinJS.UI.processAll().then(function () {
var url = WinJS.Application.sessionState.lastUrl || scenarios[0].url;
return WinJS.Navigation.navigate(url);
}));
} else if (eventObject.detail.kind === Windows.ApplicationModel.Activation.ActivationKind.search)
{ eventObject.setPromise(WinJS.UI.processAll().then(function () {
if (eventObject.detail.queryText === "") {
// Навигация на исходную страницу так как пользователь выбрал приложение.
} else {
// Отображение результатов в пользовательском интерфейсе для eventObject.detail.queryText и
// eventObject.detail.language (который представляет региональные установки пользователя).
}
// Перемещение к первому сценарию, который обрабатывает активацию для целей поиска
var url = scenarios[0].url;
return WinJS.Navigation.navigate(url, { searchDetails: eventObject.detail });
}));
}
}
В части кода, ответственной за активацию при поиске, правильно будет избегать любой обработки данных, которая не нужна для страницы поиска, но вам нужно быть готовым к перемещению к другим частям приложения при выборе результата. Кроме того, если приложение запущено для обслуживания поискового контракта, убедитесь в том, что перезагрузили основные настройки, которые вы загружаете при нормальном запуске, и так же состояние сеанса работы, если previousExecutionState находится в состоянии terminated. На самом деле, это означает, что состояние страницы результатов – это часть состояния сеанса работы приложения. Обычно последние результаты поиска сохраняют как часть сеанса, поэтому вы можете восстановить состояние страницы поиска когда это нужно.
В примере не осуществляется поиск по реальным данным – он лишь выводит сообщение, когда происходят определеные события. Но вы можете протестировать пути кода активации двумя способами. Первый, если приложение не исполняется, откройте интерфейс чудо-кнопки Поиск, введите какой-нибудь текст запроса и затем выберите приложение-пример. Вы обнаружите, что отобразится страница для Сценария 1, на которой отобразятся условия поиска. Это говорит вам о том, что активация обработана, и поисковый запрос взят из eventObject.detail.queryText, как вы можете видеть в вышеприведенном коде. (Кроме того, посмотрите на js/scenario1.js, где производится вывод данных на страницу с использованием ее метода processed).
Для того, чтобы пошагово исполнить код, установите точку останова в варианте searchTarget обработчика activated и запустите приложение в отладчике Visual Studio. Запустите чудо-кнопку Поиск, введите запрос, выберите какое-нибудь другое приложение (которое и выполнит поиск) и потом вернитесь обратно к приложению из примера. Точка останова должна сработать, так как обработчик активации был вызван с видом активации search.
При активации для обслуживания поискового контракта, убедитесь, что страница полностью обработана с помощью вызова наподобие WinJS.UI.processAll (Вам не нужно об этом беспокоиться, если приложение уже исполняется; processAll не будет выполнять избыточную работу)
Важно отметить, что при активации вашего приложения, и при обработке события querysubmitted, и/или querychanged, queryText может быть пустым. В подобном случае вы можете показать результаты по умолчанию, или переместиться на домашнюю страницу, если такой вариант лучше подходит. Смотрите врезку "Тестирование поиска".
Некоторые варианты в интерфейсе чудо-кнопки Поиск могут влиять на то, как и с какими параметрами запускается целевое приложение поиска. Для того, чтобы убедиться, что вы испытали все применимые ветви кода, убедитесь в том, что протестировали приложение со следующими условиями:
Так же вам следует помнить о том, как вы представляете результат, заботиться о том, чтобы основные результаты не были перекрыты панелью поиска, которая будет оставаться видимой, пока пользователь не закроет ее.
Некоторые виды приложений все еще поддерживают собственный интерфейс поиска по приложению в дополнение к использованию панели поиска, или, другими словами, у них могут быть некоторые параметры поиска, которые хорошо было бы синхронизировать с теми же данными, отображаемыми в панели поиска. Для того, чтобы сделать это, приложение может запросить у панели поиска ее значение ). Знайте, что подобный вызов может не получиться, если приложение не видимо, или если панель поиска уже видима или становится видимой.
Использование querysubmitted и последовательности активации в предыдущем разделе дает вам базовый уровень поискового взаимодействия, и Windows автоматически предоставляет истоию поиска пользователя. Однако, выполнив некоторые дополнительные действия, вы можете сделать поисковый опыт взаимодействия пользователя и системы богаче. Так как написание кода, который выполняет поиск, обработка результатов и их представление – это, в любом случае, основная работа с контрактом Поиск, добавление поддержки предложения вариантов запроса (в этом разделе) и вариантов результатов (в следующем), это сравнительно маленькое вложение в серьезное увеличение качества опыта взаимодействия пользователя и системы.
Для того, чтобы выйти за пределы поисковой истории и предлагать пользователю варианты запросов когда он вводит запрос, что выглядит для пользователя как то, что показано в левой части рис. 2.2, вы можете использовать два параметра. Какой из них использовать, зависит от того, что вы хотите предложить, и от данных, по которым осуществляется поиск.
Во-первых, для предоставления предложений вариантов из папок файловой системы, по которым осуществляется поиск, таким, как библиотеки музыки, изображений и видео, панель поиска предоставляет встроенную реализацию посредством ее метода ), что приводит к результатам, похожим на показанные на рис. 2.2. Как показано в Сценарии 4 примера, сначала создают объект Windows.ApplicationModel.Search.LocalContentSuggestionSettings (http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.search.localcontentsuggestionsettings.aspx ), заполняют его свойства и передают его setLocalContentSuggestionsSettings (js/scenario4.js):
var page = WinJS.UI.Pages.define("/html/scenario4.html", {
ready: function (element, options) {
var localSuggestionSettings = new
Windows.ApplicationModel.Search.LocalContentSuggestionSettings();
localSuggestionSettings.enabled = true;
localSuggestionSettings.locations.append(Windows.Storage.KnownFolders.musicLibrary);
localSuggestionSettings.aqsFilter = "kind:=music";
Windows.ApplicationModel.Search.SearchPane.getForCurrentView()
.setLocalContentSuggestionSettings(localSuggestionSettings);
}
});
(рис 2.4) Предложения вариантов из локальных папок, автоматически предоставляемое панелью поиска
При заполнении свойств LocalContentSuggestionSettings , убедитесь, для начала, в том, что установили enabled в true. Коллекция locations (вектор) содержит один или большее количество объектов StorageFolder, которые показывают, где должен осуществляться поиск. Так как перечисление файлов для предоставления предложений требует программного доступа к этим папкам, вы должны убедиться в том, что в манифесте приложения сделаны соответствующие объявления, получить эти папки из AccessCache, или получить программный доступ к ним с помощью средства выбора файлов. В последнем случае приложение может предоставить пользовательский интерфейс для настройки мест поиска (возможно, например, в панели параметров).
Вы так же можете задать строку Advanced Query Syntax (AQS) (http://msdn.microsoft.com/library/windows/apps/aa965711.aspx ) в свойстве ) (наподобие System.Title) в propertiesToMatch (строковый вектор). Это обычно используется для фильтрации по типам файлов, как при поиске в папке, но здесь вы можете задать все, что нужно. Для того, чтобы узнать больше об AQS, обратитесь к Главе 2 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript", больше о свойствах Windows вы можете узнать в Главе 4 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript".
Что касается второй возможности, ) будет содержать, как обычно, свойства queryText, language, и linquisticDetails, и в ответе на событие вы заполняете коллекцию, содержащую до пяти придложений в eventArgs.request.searchSuggestionCollection (опять же, при необходимости включая альтернативы в объекте linguisticDetails). В идеале все это занимает полсекунды или меньше, и важно знать, что все необходимые результаты должны присутствовать в коллекции как только вы вернетесь из обработчика события.
Вот, как это реализованов Сценарии 2 примера реализации поискового контракта (здесь suggestionList – это заданный в коде список названий городов):
Windows.ApplicationModel.Search.SearchPane.getForCurrentView().onsuggestionsrequested =
function (eventObject) {
var queryText = eventObject.queryText;
var suggestionRequest = eventObject.request;
var query = queryText.toLowerCase();
var maxNumberOfSuggestions = 5;
for (var i = 0, len = suggestionList.length; i < len; i++) {
if (suggestionList[i].substr(0, query.length).toLowerCase() === query) {
suggestionRequest.searchSuggestionCollection.appendQuerySuggestion(
suggestionList[i]);
if (suggestionRequest.searchSuggestionCollection.size ===
maxNumberOfSuggestions) {
break;
}
}
}
};
Таким образом, если в query содержится "ba", как на рис. 2.2., первые пять названий в suggestionList будут Bangkok, Bangalore, Baghdad, Baltimore, и Bakersfield. Конечно, реальное приложение будет брать предложения из собственной базы данных или с какого-либо сервиса (это сымитировано в Сценариях 5 и 6, кстати), но идея у вас есть. Хотя, в случае с сервисом, вам следует так же проверить свойство suggestionResult.isCanceled прежде чем начинать новый запрос: этот флаг показывает, что поисковый запрос не изменился по сравнению с предыдущим запросом, и, значит, нет необходимости заполнять список предложений.
Примечание. Когда свойство SearchPane.searchHistoryEnabled установлено в true (по умолчанию), автоматически отслеживается история поиска пользователя и основные поисковые запросы отображаются при запуске интерфейса чудо-кнопки Поиск (прежде чем пользователь начнет вводить поисковый запрос). Установка этого свойства в false открючит такое поведение и в таком случае приложение сможет поддерживать собственную историю предыдущих значений queryText. Если приложение это делает, мы рекомендуем предоставлять в панели настроек приложения средства для очистки истории.
Так же приложения могут использовать свойство SearchPane.searchHistoryContext для создания различных наборов исторических данных поиска, зависящих от контекста. Когда это значение установлено до запуска интерфейса поиска, автоматически управляемые поисковые запросы (searchHistoryEnabled установлено в true) будут сохранены для этого контекста. Это не оказывает влияния, если приложение само поддерживает историю, в таком случае оно может самостоятельно поддерживать различные списки исторических данных по запросам.
Свойство ), имеет несколько возможностей, о которых полезно знать. Его свойство ) со свойством size и четырьмя методами: appendQuerySuggestion (для добавления в список отдельного элемента, как показано выше), appendQuerySuggestions (для добавления массива элементов, который вы можете получить из запроса к сервису), appendResultSuggestion (смотрите следующий раздел) и appendSearchSeparator (который используется для группировки предложений). В последнем случае, разделителю задается подпись, как показано ниже:
У объекта запроса так же есть метод getDeferral, который используется, если для получения предложений выполнить асинхронную операцию. Это работает как и прочие отложенные механизмы, которые мы уже видели: перед запуском асинхронной операции (наподобие WinJS.xhr), вызывается getDeferral для получения отложенного объекта, начинается операция, осуществляется возврат из метода suggestionsrequested, и вызывается метод отложенного объекта complete внутри асинхронного обработчика завершения. Это показано в Сценариях 5 и 6 примера, так как это, очевидно, необходимо при запрашивании данных с сервиса для этой цели (код взят из sj/scenario5.js):
Windows.ApplicationModel.Search.SearchPane.getForCurrentView().onsuggestionsrequested =
function (eventObject) {
var queryText = eventObject.queryText;
var suggestionRequest = eventObject.request;
var deferral = suggestionRequest.getDeferral();
// Создает запрос для получения предложений из сервиса и предоставляет их панели поиска.
// В зависимости от устройства сервиса, вы можете использовать различные URL, основанные на eventObject.language.
// Так же вы можете составить queryText в URL для того, чтобы позволить сервису выполнить фильтрацию.
xhrRequest = WinJS.xhr({ url: /* URL к сервису с предложениями вариантов */ });
xhrRequest.done(
function (request) {
if (request.responseText /* или responseXML */) {
// Заполняет suggestionRequest.searchSuggestionCollection на основе ответа
}
deferral.complete(); // Показывае, что мы успешно получили предложения.
},
function (error) {
// Вызывает complete отложенного объекта при возникновении ошибки.
deferral.complete();
});
};
Вы можете использовать любые необходимые форматы ответов JSON или XML, но так как ваше приложение выполняет их разбор, существуют стандарты на возвращаемые поисковые предложения. Для JSON, обратитесь к "OpenSearch Suggestions specification" (http://www.opensearch.org/Specifications/OpenSearch/Extensions/Suggestions/1.1 ) и к Сценарию 5, где JSON-ответ может быть напрямую преобразован в массив и передан в одном вызове appendQuerySuggestions. В случае с XML обратитесь "XML Search suggestions Format Specification" (http://msdn.microsoft.com/library/cc891508.aspx ) и к Сценарию 6. В последнем случае, функция generateSuggestions представляет стандартное средство для разбора подобного ответа, и, хотя в примере не показано использование разделителей, URI и изображений в подобных ответах, функция generateSuggestions показывает, как обрабатывать их и отправлять в appendQuerySuggestion[s] , как и в appendResultSuggestion, которую мы сейчас рассмотрим.
Другими словами, обработка события querysubmitted подразумевает, что вы возьмете текст запроса и заполните список результатов на вашей собственной странице. Поэтому вы нарямую обрабатываете события щелчка или прикосновения к этим элементам, перемещаясь к соответствующей странице с подробной информацией. Событие resultSuggestionChosen сообщает вам о том, что то же самое произошло на системной панели приложения, на которой отображены предложенные вами данные. Таким образом, вы обрабатываете событие resultSuggestionChosen так же, как вы обрабатывали бы активацию элемента на вашей собственной странице. Свойство eventArgs.tag в данном случае будет содержать тег, который вы предоставили для предложенного результата в вызове appendResultSuggestion.
Этот метод принимает пять аргументов в следующем порядке, здесь нужно позаботиться о локализации:
text – первая строка текста для показа в панели поиска (как на рис. 2.2).detailText – вторая строка текста для результата поиска (как на рис. 2.2), которая так же используется как текст всплывающей подсказки.tag – строка, которые вы хотите получить в событии resultSuggestionChosen.imageAlternateText – атрибут alt для изображения.
Как отмечено в предыдущем разделе, функция generateSuggestions из Сценария 6 примера предоставляет стандартный обработчик, который переводит предложения результатов поиска из формата XML в вызов appendResultSuggestion, включая использование Windows.Storage.Streams.RandomAccessStreamReference.createFromUri для преобразования URI изображения в соответствующее описание потока. Обычно подобные URI указывают на удаленный ресурс, который, в идеале, должен позволить вам запрашивать изображения различных размеров на основании масштабирования разрешения.
Локальные URI ms-appx:// и ms-appdata:// так же можно использовать с использованием соответствующего соглашения о формате имен .scale-1x0. Вам, фактически, всегда следует иметь в пакете изображения по умолчанию для предлагаемых результатов поиска (используя URI ms-appx:// для обращения к ним при необходимости). Система не будет предоставлять их вам автоматически.
Последняя особенность поиска заключается в возможности имитировать поведение "ввод для поиска" Начального экрана Windows, когда пользователь не выполняет явную активацию чудо-кнопки Поиск. Если вы не делали этого раньше и у вас есть компьютер, оснащенный физической клавиатурой, нажмите на клавишу Windows для того, чтобы попасть на Начальный экран и начните вводить название какого-нибудь приложения не открывая интерфейс чудо-кнопки Поиск. Вуаля! Панель поиска появилась автоматически, с уже отфильтрованными и отображенными результатами. Это такое же поведение, которым отличалась кнопка Пуск в предыдущих версиях Windows, но сейчас все это выглядит гораздо привлекательнее!
Для того, чтобы включить подобную возможность для своего приложения, просто установите свойство SearchPane.showOnKeyboardInput (http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.search.searchpane.showonkeyboardinput.aspx ) в значение ).
Разработчики приложений для Windows 8 часто спрашивают, может ли одно приложение запускать другое. Ответ на этот вопрос положителен, с некоторыми ограничениями (не удивлены ли вы!). Во-первых, приложения можно запускать только посредством сопоставления типа файла или схемы URI, а не напрямую по названию или через исполняемый файл. Говоря точнее, единственный способ, которым может воспользоваться Windows 8 для того, чтобы запустить другое приложение – это касается и классических приложений – это воспользоваться API Windows.System.Launcher (http://msdn.microsoft.com/library/windows/apps/windows.system.launcher.aspx ), которое представляет две возможности:
launchFileAsync – запускает другое приложение, связанное с заданным объектом StorageFile. Необязательный объект LauncherOptions позволяет задавать некоторые подробности (смотрите ниже)launchUriAsync – запускает другое приложение, связанное с заданной схемой URI, снова, с объектом LauncherOptions или без него.
Примечание.
И для " ) и "Обработка активации протокола" (http://msdn.microsoft.com/library/windows/apps/hh452686.aspx ) содержат список специальных типов файлов и схем URI, о которых идет речь. Схема URI file:// допустима в launchUriAsync, но только для URI, которые принадлежат локальной сети, и тогда, когда в манифесте приложения объявлена возможность Частные сети (клиент и сервер) (Private Networks (Client Server)).
Результат этих асинхронных методов, который передается в обработчик завершения, имеет логический тип: они возвращают true, если запуск произошел успешно, и false – если нет. Таким образом, если не произойдет катастрофический сбой, такой, как нехватка памяти, при котором асинхронная операция не будет выполнена, эти операции обычно сообщают об успешном результате в обработчик завершения, в логическом значении, указывающем на результат. Вы получите результат false, если попытаетесь запустить файл, который содержит исполняемый код, или другие файлы, заблокированные по соображениям безопасности.
Однако, невозможно знать заранее, каким будет результат. По этой причине используется параметр LauncherOptions (http://msdn.microsoft.com/library/windows/apps/windows.system.launcheroptions.aspx), посредством которого вы можете обеспечить механизмы обратной связи:
treatAsUntrusted (логического типа, значение по умолчанию – false) отобразит предупреждение пользователю о том, что будет произведено переключение на другое приложение, если выполнение операции продолжится (сморите изображение ниже). Этот подход полезно использовать, когда вы не уверены в источнике сопоставления, как, например, при открытии URI, найденного внутри PDF-файла или другого документа, и хотите предупредить столкновение пользователя с классическим проявлением недобросовестной рекламы!
displayApplicationPicker (логического типа, значение по умолчанию – false) позволяет пользователю выбирать, какое приложение запускать для обработки (смотрите изображение ниже). Отметим, что этот пользовательский интерфейс позволяет пользователю изменять приложение по умолчанию для последующих вызовов. Кроме того, свойство LauncherOptions.ui можно использовать для управления размещением средства выбора приложения.
preferredApplicationDisplayName и preferredApplicationPackageFamilyName предоставляют пользователю предложения по загрузке из Магазина Windows конкретных приложений, если ни одно другое приложение не способно обслужить запрос. Это очень полезно с особыми схемами URI или типами файлов, для работы с которыми вы предоставляете приложение.fallbackUri задает URI, по которому будет перенаправлен пользователь, если не будет найдено приложения для обработки запроса, и у вас нет конкретных предложений приложений из Магазина Windows.launchUriAsync, опция contentType идентифицирует тип содержимого, ассоциированного с URI, который управляет тем, какое приложение будет запущено. Это особенно полезно, когда URI не содержит конкретной схемы, а просто ссылается на файл в сети, используя схему наподобие http или file, которая обычно обрабатывается браузером для загрузки файлов. С использованием contentType, будет запущено приложение, которое зарегистрировано для данного типа содержимого, а не для схемы. Это приложение, конечно, должно иметь возможность использовать URI для доступа к файлу. Другими словами, эта опция является способом передать URI, а не передать весь файл, в обработчик приложения, о котором известно, что оно может работать с данным URI.Сценарии 1 и 2 примера "Запуск приложения для сопоставленных типов файлов и протоколов" ( http://code.msdn.microsoft.com/windowsapps/Association-Launching-535d2cec), предоставляют демонстрацию ипользования этих методов с некоторыми из опций, таким образом, вы сможете увидеть их действие. С другой стороны, как показано в Сценариях 2 и 3 того же примера, это вопрос о том, как приложение связывает себя с типом файла или схемой URI для того, чтобы оно могло быть запущено подобным образом. Эти сопоставления составляют контракт Активация файла (File Activation) и контракт Активация протокола (Protocol activation). В обоих случаях целевое приложение должно объявить о типе файла и/или схеме URI, которые оно намеревается обслуживать, в манифесте, и затем должно предоставить способы активации для этих целей, как мы увидим в следующем разделе.
Опять же, сопоставление файла или схемы URI – это единственное средство, с помощью которого приложение Windows 8 может запустить другое приложение, таким образом, нет гарантии, что вы действительно запустите конкретное приложение. Конечно, чем уникальнее и специфичнее тип файла или схема URI, тем менее вероятно, что у пользователя будет несколько приложений для обработки подобного сопоставления, или даже то, что несколько подобных приложений будут присутствовать в Магазине Windows. На самом деле, разработка уникального интерфейса схемы URI, где схема вполне очевидно специфична для приложения, действительно лучший способ для того, чтобы запущенное Windows 8-приложение могло передавать другому выполнение задачи, так как посредством строки URI можно передать любые данные. Приложение Maps (Карты) в Windows 8, например, поддерживает схему bingmaps для выполнения задач, связанных с картами, поступающих от других приложений. Вы можете представить то же самое для биржевого приложения, для календаря, почтового клиента (помимо mailto) и так далее. Если вы создаете подобную схему и хотите, чтобы другие приложения могли ей пользоваться, вам, конечно, нужно представить документацию с подробностями ее использования, что подразумевает, что другие приложения могут реализовать ту же самую схему, и, таким образом, представлять собой альтернативу в Магазине Windows. Таким образом, нет гарантии, даже с весьма специфической схемой, что вы можете быть уверены в том, что запустите другое известное приложение, но это все, что можно получить от данной возможности .
Для того, чтобы добавить в приложение возможность обрабатывать файлы, для начала пройдите в раздел Объявления (Declaration) редактора манифеста и добавьте Сопоставление типов файлов (File Type Associations), интерфейс Visual Studio для выполнения данной задачи показан на рис. 2.5. У каждого типа файла может быть множество конкретных обозначений (обратите внимание на кнопку Добавить (Add new) ниже раздела Поддерживаемый типы файлов (Supported File Types), например, у файлов формата JPEG могут быть расширения .jpg и .jpeg. Обратите внимание на то, что обработка файлов некоторых типов запрещена для приложений, смотрите их полный список в материале "Обработка активации файла" (http://msdn.microsoft.com/library/windows/apps/hh452684.aspx ).
В группе Свойства (Properties), Отображаемое имя (Display name) – это общее имя для группы типов файлов (это не обязательный параметр; он не нужен, если речь идет лишь об одном типе файла). Параметр Имя (Name), с другой стороны, необходим – это внутренний идентификатор для группы файла, и то, что должно оставаться неизменным в течение всего времени существования приложения, не меняться при обновлениях. В некотором смысле, свойства Имя/Отображаемое имя для группы файлов напоминают настоящее имя, а отдельные типы файлов напоминают псевдонимы – любой из них, в конечном счете, относится к сущности типа файла и к вашему приложению.
Подсказка (Info Tip) – это текст всплывающей подсказки, которая появляется, когда пользователь наводит указатель на файл данного типа и приложение является основным приложением для обработки этого типа файлов. Параметр Значок (Logo) имеет некоторые особенности. Здесь, в Visual Studio, вы просто ссылаетесь на базовое имя для файла изображение, как обычно делается с другими изображениями в манифесте. В проекте же вам следует иметь несколько файлов для одного и того же изображения с различными целевыми размерами (не имеющими отношения к масштабированию разрешения): 16x16, 32x32, 48x48, и 256x256. Пример "Запуск приложения для сопоставленных типов файлов и протоколов" (http://code.msdn.microsoft.com/windowsapps/Association-Launching-535d2cec ) использует подобные изображения с суффиксами targetsize-* в имени файла . Использование изображений различных размеров помогает Windows предоставлять наилучший опыт взаимодействия на устройствах различных типов.
(рис 2.5) Интерфейс Объявления (Declaration) > Сопоставление типов файлов (File Type Associations) в редакторе манифеста Visual Studio
В группе параметров Флаги изменения (Edit Flags) можно управлять тем, будет ли доступно действие Открыть (Open) для загруженных файлов данного типа: установка параметра Безопасное открытие (Open Is Safe) активирует эту команду в различных частях пользовательского интерфейса Windows; установка параметра Всегда небезопасно (Always Unsafe) отключает эту команду. Если оставить оба этих флага неустановленными, доступность команды будет зависеть от того, откуда поступил файл, а так же от других установок системы.
В самой нижней части этого окна вы так же можете установить отдельную начальную страницу (Start page) для обработки активации, однако, обычно используют основной обработчик активации, как показано в js/default.js примера обработки сопоставлений (посмотрите в js/scenario3.js).
Там вы примете вид активации file, в подобном случае eventArgs.detail будет объектом типа WebUIFileActivatedEventArgs (http://msdn.microsoft.com/library/windows/apps/windows.ui.webui.webuifileactivatedeventargs.aspx ), его свойство files содержит массив объектов StorageFile из Windows.System.Launcher.launchFileAsync, и его свойство verb будет иметь значение "open". В ответ, конечно, приложение открывает файл и представляет его содержимое соответствующим образом.
Конечно, так как файл может поступить откуда угодно, воспринимайте его как содержимое, которому нельзя доверять, как мы уже упоминали в разговоре о целевых объектах общего доступа. Избегайте выполнения на основе содержимых таких файлов действий, последствия которых нельзя отменить.
Как и в случае с контрактом Поиск, протестируйте обработку активации файла, когда приложение уже исполняется, и когда оно должно быть запущено. Во всех случаях убедитесь в том, что загружаете параметры приложения и восстанавливаете состояние сеанса, если
eventArgs.detail.previousExecutionState содержит значение terminated.
Создание сопоставления со схемой URI очень похоже на сопоставление с типом файла. В разделе редактора манифеста Объявления (Declarations), добавьте объявление Протокол (Protocol), как показано на рис. 2.6.
(рис 2.6) Интерфейс Объявления (Declaration) > Протокол (Protocol) в редакторе манифеста Visual Studio
В разделе Свойства (Properties) свойства Значок (Logo), Отображаемое имя (Display Name) и Имя (Name) имеют то же значение, что и для настройки сопоставления типа файла (смотрите предыдущий раздел). Похожим образом, хотя вы можете задать отдельную начальную страницу, обычно активацию протокола обрабатывают в основном обработчике активации, как показано в js/default.js примера об обработке активации файлов и протоколов (пройдите в js/scenario4.js).
Здесь вы принимаете вид активации protocol, в подобном случае ), его свойство uri содержит URI из Windows.System.Launcher.launchUriAsync.
Снова хочу предупредить, что URI с уникальными схемами могут поступать отовсюду, в том числе – из потенциально вредоносных источников. Опасайтесь любых данных или запросов в URI и старайтесь не выполнять, основываясь на них, необратимых изменений. Например, вы, возможно, можете перейти на новую страницу, но не меняйте записи базы данных, пытаясь выполнить команду eval для чего-либо, переданного в URI.
Тем не менее, сопоставление протокола является основным способом, с помощью которого приожение может, когда это необходимо, предоставить ценные услуги другим приложениям. Встроенное приложение Maps (Карты), например, поддерживает схему URI bingmaps:// и сопоставление с ней, что позволяет вам просто открыть URI соответствующего формата для того, чтобы показать пользователю интерактивную карту вместо того, чтобы пытаться реализовать подобную функциональность самостоятельно. Это похоже на то, как при использовании почтовго клиента применяют схему mailto:; другие приложения могут просто создать интерфейс для схемы URI для работы с другими сервисами и рабочими процессами.
Совет. Для отладки активации для обработки протокола вам нужно иметь возможность запускать приложение в отладчике при активации. Для того, чтобы это сделать, откройте свойства проекта (команда меню Проект > Свойства (Project > Properties) в Visual Studio) и затем в разделе Свойства конфигурации > Отладка (Configuration Properties > Debugging) установить параметр Запустить приложение (Launch Application) в значение Нет (No).
Возвращаясь к Главе 2 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript", где мы рассматривали использование средств выбора файлов и папок для получения доступа не только к файловой системе, но и к содержимому, которым управляют другие приложения, или даже к такому, которой создается по запросу другими приложениями. Внесем ясность в этот вопрос: приложения, которые используют средство выбора файлов, делают это для получения объектов StorageFile или StorageFolder для каких-либо целей. Но это не означает, что приложения-поставщики, которые могут быть активированы с помощью средства выбора файлов, обязательно управляют своими данными как файлами или папками. Их задача заключается в том, чтобы упаковать любые данные, которыми они управляют так, чтобы они выглядели, для средства выбора файлов, как файлы или папки.
В Главе 2 курса "Пользовательский интерфейс приложений для Windows 8, созданных с использованием HTML, CSS и JavaScript", например, мы видели, как приложение Windows 8 для работы с камерой может быть использовано для получения фотографий и передачи их с помощью средства выбора файлов. Подобные фотографии не существуют, когда активируется целевое приложение. Вместо этого, оно отображает интерфейс, посредством которого пользователь может создать файл своими силами, который потом будет передан с помощью средства выбора файла. Таким образом, приложение для работы с камерой ускоряет весь процесс по созданию нового изображения, предоставляя эту функцию в точности тогда, когда пользователь пытается выбрать файл изображения. В противном случае пользователь запустил бы приложение Camera (Камера) отдельно, сделал бы фотографию, сохранил бы ее в локальной файловой системе, переключился бы к исходному приложению для того, чтобы запустить средство выбора файлов и найти эту новую фотографию.
Конечно, средство выбора файлов не ограничено фотографиями: оно работает с файлами любых типов, в зависимости от того, что запрашивает вызывающее его приложение. Одно приложение может позволить пользователю просматривать библиотеку музыки, покупать и загружать записи, и передавать полученный файл средству выбора файлов. Другое может выполнять какие-то запросы к базе данных и возвращать результат в виде файла, еще какое-нибудь приложение может позволить пользователю просматривать онлайновую базу данных с сущностями, представляемыми в виде файлов, скрывая детали загрузки и упаковки этих данных в файлы, как и ожидает пользователь от средства выбора файлов. Причем, такое поведение не зависит от того, осуществляется ли работа с локальной файловой системой, с онлайновыми ресурсами или с приложениями, которые создают данные динамически. Возможно создать приложение, которое генерирует или получает данные, похожие на файлы, как приложение Camera (Камера), которое позволяет делать фотографии, или приложение для работы со звуком, которое может записывать новые звуки. В подобном случае, однако, помните что контракт Средство выбора файлов создан для выполнения сравнительно быстрых операций по работе с файлами. По этой причине приложению следует предоставлять лишь базовые средства редактирования данных (наподобие кадрирования фотографии или обрезки звука) в данном контексте.
Как в случае с целевыми объектами контрактов Поиск и Общий доступ, Visual Studio и Blend предоставляют шаблон элемента для поставщиков средства выбора файлов, в частности, это Контракт средства выбора файлов для открытия (File Open Picker contract item), в окне, которое появляется по команде Добавить > Создать элемент (Add > New Item), которое мы видели ранее (этот пункт скрыт выше списка, показанного на рис. 22.4). Этот элемент предоставляет вам базовую структуру для выбора файлов, построенную на основе элемента управления ListView, но не более того. Здесь мы не будем использовать этот шаблон, вместо этого возьмем соответствующие элементы из примеров. Говоря в общем, при обслуживании контракта Средство выбора файлов, приложению следует использовать тот же самый режим просмотра и интерфейс, который оно имеет при обычном запуске, таким образом, сохраняя единообразие опыта работы с ним при обоих сценариях.
Для получения официальных документов о завершении программы дополнительного профессионального образования (удостоверения о повышении квалификации, дипломов о профессиональной переподготовке и MBA) необходимо предоставить:
Внимание! Вы можете не заказывать доставку бумажной версии официального документы, а скачать его в электронном виде и распечатать самостоятельно. Информация о выданном документе в течение 1 месяца загружается в Федеральную информационную систему «Федеральный реестр сведений о документах об образовании и (или) о квалификации, документах об обучении» - ФИС ФРДО.
Доступ на новый сайт осуществляется с использованием адреса электронной почты, который был указан вами при регистрации на "старом". Мы постарались перенести все ваши данные с прежнего ресурса, однако не исключена вероятность потери части информации.
При возникновении проблемы со входом, воспользуйтесь функцией сброса пароля
Если вы обнаружите несоответствия, пожалуйста, сообщите нам.