Поиск
Основы поиска и активация для целей поиска
Базовое взаимодействие с контрактом Поиск заключается в получении запроса на поиск при исполняющемся приложении. Вот хороший пример того, как поиск вызывает перемещения по приложению. Для получения подобного запроса вам лишь нужно прослушивать событие querySubmitted (http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.search.searchpane.querysubmitted.aspx ) объекта Windows.ApplicationModel.Search.SearchPane (http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.search.searchpane.aspx ). Код для этого выглядит так, здесь searchPageURI задает страницу результатов поиска:
var searchPane = Windows.ApplicationModel.Search.SearchPane.getForCurrentView(); searchPane.onquerysubmitted = function (eventArgs) { WinJS.Navigation.navigate(searchPageURI, eventArgs); };
Здесь объект eventArgs имеет тип SearchPaneQuerySubmittedEventArgs ( http://msdn.microsoft.com/library/windows/apps/br225067.aspx) и содержит лишь два свойства: queryText (содержимое текстового поля на панели поиска) и language (тег текущего используемого языка в формате BCP 47). В вышеприведенном коде они просто передаются методу WinJS.Navigation.navigate, который передает их на страницу результатов поиска (на ту, куда ведет searchPageURI). Теперь эта страница обрабатывает queryText в соответствии с параметром language и заполняет содержимое страницы соответствующими элементами. Обычно для этой цели приложение использует элемент управления ListView, как вы можете ожидать, для коллекции результатов переменной длины.
Посредством того же самого объекта SearchPane вы так же можете задать свойство placeholderText, которое может содержать текст, который должен появиться в исходном поле ввода поисковой строки. Его метод show позволяет вам программно показывать панель поиска, свойство visible и событие visibilitychanged сообщают вам о ее состоянии, и свойство queryText предоставляет текущее содержимое элемента управления для ввода текста..
Кроме того, вы можете прослушивать ее событие querychanged. Это – предвестник querySubmitted и оно подходит для использования, если у вас есть некая внешняя логика, которая должна исполняться для предложения вариантов, таких, как предварительный просмотр результатов (такое поведение можно видеть на начальном экране при поиске приложений, еще его называют прокруткой слов). Его eventArgs ( http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.search.searchpanequerychangedeventargs.aspx) будет содержать свойства queryText и language , как и в случае отправки запроса, вместе со свойством linguisticDetails (http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.search.searchpanequerychangedeventargs.linguisticdetails.aspx) , которое предоставляет сведения о тексте, введенном с помощью редактора метода ввода (IME), в особенности – языковые альтернативы. Если вы ожидаете, что у вас будут пользователи из Японии или Китая, настоятельно рекомендуется выполнять поиск и по альтернативным словам в ответ на querychanged и suggestionsrequested (смотрите следующий раздел).
Посмотрим, как вызов для поиска воздействует на активацию приложения, которая, опять же, обычно происходит с помощью обработчика activated по умолчанию, в том же скриптовом контексте, как и при обычном запуске приложения.
В данном случае значение вида активации будет search, его нужно обрабатывать отдельно от варианта launch. Для того, чтобы увидеть это в действие, обратимся к примеру "Контракт Поиск" (http://code.msdn.microsoft.com/windowsapps/Search-app-contract-sample-118a92f5 ). Его код активации можно найти в 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 может быть пустым. В подобном случае вы можете показать результаты по умолчанию, или переместиться на домашнюю страницу, если такой вариант лучше подходит. Смотрите врезку "Тестирование поиска".
Врезка: Тестирование поиска
Некоторые варианты в интерфейсе чудо-кнопки Поиск могут влиять на то, как и с какими параметрами запускается целевое приложение поиска. Для того, чтобы убедиться, что вы испытали все применимые ветви кода, убедитесь в том, что протестировали приложение со следующими условиями:
- Приложение исполняется и поиск запущен без ввода текста запроса, с текстом запроса, результаты для которого есть, и с текстом, для которого результаты не были найдены.
- Приложение не исполняется и активировано для обслуживания поискового контракта с помощью чудо-кнопки Поиск, со всеми вариантами, перечисленными выше.
- Приложение находится в прикрепленном состоянии просмотра и активируется так, как описано выше, в таком случае поиск будет производиться на Начальном экране.
- Приложение приостановлено и активируется так, как описано выше.
Так же вам следует помнить о том, как вы представляете результат, заботиться о том, чтобы основные результаты не были перекрыты панелью поиска, которая будет оставаться видимой, пока пользователь не закроет ее.
Врезка: Синхронизация поиска внутри приложения с панелью поиска
Некоторые виды приложений все еще поддерживают собственный интерфейс поиска по приложению в дополнение к использованию панели поиска, или, другими словами, у них могут быть некоторые параметры поиска, которые хорошо было бы синхронизировать с теми же данными, отображаемыми в панели поиска. Для того, чтобы сделать это, приложение может запросить у панели поиска ее значение queryText и попытаться установить это значение с помощью метода SearchPane.trySetQueryText (http://msdn.microsoft.com/library/windows/apps/windows.applicationmodel.search.searchpane.trysetquerytext.aspx ). Знайте, что подобный вызов может не получиться, если приложение не видимо, или если панель поиска уже видима или становится видимой.