Командный пользовательский интерфейс
Диалоговые окна сообщений
Последняя тема этой лекции, касающаяся командного интерфейса, посвящена диалоговым окнам сообщений. Как и контекстные меню, эти всплывающие элементы относятся к WinRT а не к WinJS, для работы с ними используется API Windows.UI.MessageDialog (http://msdn.microsoft.com/library/windows/apps/windows.ui.popups.messagedialog.aspx). Это, опять же, означает, что окна сообщений просто появляются поверх текущей страницы и не присутствуют в DOM. Диалоговые окна автоматически затеняют текущую страницу приложения и блокируют события ввода от приложения до тех пор, пока пользователь не отреагирует на окно сообщения.
В материале "Руководство и контрольный список для окон сообщений" (http://msdn.microsoft.com/library/windows/apps/hh738363.aspx) показаны варианты их использования:
- Для отображения срочной важной информации, которую пользователь должен знать для продолжения работы, особенно для ситуаций, которые не связаны с пользовательскими командами различного рода.
- Для вывода сведений об ошибках, которые применимы ко всему приложению, что отличается от ошибок, возникающих в ходе рабочего процесса, которые лучше отображать внутри приложения. Хороший пример – потеря сетевого соединения.
- Вопросы, которые требуют реакци пользователя и окна, отображающие которые, не могут быть закрыты как неактивные всплывающие окна. Таким образом, используйте диалоговые окна для того, чтобы прервать работу пользователя в ситуациях, когда ответ пользователя необходим для продолжения работы.
Интерфейс диалоговых окон очень прост. Вы создаете объект диалогового окна сообщения командой new Windows.UI.Popups.MessageDialog. Конструктор принимает в качесве обязательного параметра строку с содержимым сообщения и с необязательным вторым строковым параметром, содержащим заголовок окна. Окно сообщения имеет свойства content и title, которые вы можете использовать независимо друг от друга. В любом случае, строковые параметры поддерживают лишь обычный текст.
После этого вы конфигурируете диалоговое окно с помощью его свойств commands, options, defaultCommandIndex (команда, связанная с клавишей Enter) и cancelCommandIndex (команда, связанная с клавишей Escape).
Значения параметра options берутся из перечисления Windows.UI.Popups.MessageDialogOptions, которое содержит лишь два члена: none (значение по умолчанию, для случаев, когда особое поведение не требуется), и acceptUserInputAfterDelay (что приводит к тому, что окно сообщения некоторое время не воспринимает пользовательский ввод для того, чтобы предотвратить кликджекинг (clickjaking); это существенно, преимущественно, для интернет-браузеров, которые загружают произвольное веб-содержимое и практически не требуется большинству приложений).
Свойство command содержит до трех объектов типа Windows.UI.Popups.UICommand (http://msdn.microsoft.com/library/windows/apps/windows.ui.popups.uicommand.aspx), тех же самых, которые используются в контекстных меню. Каждая из команд содержит свойства id, label и invoked, к которому вы подключаете обработчик для команды. Обратите внимание на то, работа свойств defaultCommandIndex и cancelCommandIndex основана на индексах массива commands, а не на id этих команд. Кроме того, если вы не добавите собственные команды, диалоговое окно сообщения отобразится с единственной командой по умолчанию – Закрыть (Close).
И, наконец, когда диалоговое окно настроено, вы отображаете его, вызывая его метод showAsync. Как и в случае с контекстным меню, в результате выбранный пользователем объект UICommand, который передается обработчику завершения, который вы предоставили для метода done promise-объекта. Обычно вам не нужно получать этот результат, так как выбранная команда имеет связанный с ней обработчик invoked, где вы и выполняете действия, соответствующие команде.
Примечание. Если в то время, когда активно окно сообщения, активируются чудо-кнопки Поиск, Общий доступ, Устройства или Параметры, или если приложение активируется для обслуживания контракта, диалоговое окно сообщения будет закрыто и без выбора какой-либо команды в нем. Будет осуществлен вызов обработчика завершения для showAsync, с результатом, установленным на команду по умолчанию. Знайте об этом, если вы используете обработчик завершения для обработки подобных команд.
Пример "Диалоговое окно сообщения" (http://code.msdn.microsoft.com/windowsapps/Message-dialog-sample-00c928f5) – это один из самых простых примеров во всем SDK! Он показывает разные варианты использования API окон сообщений. Сценарий 1 показывает окно сообщения с заголовком и двумя командными кнопками, вторая командная кнопка (с индексом 1) установлена как кнопка по умолчанию. Вот как это выглядит:
Сценарий 2 показывает вывод команды по умолчанию – Закрыть (Close) с сообщением и без заголовка:
Сценарий 3 похож на Сценарий 1, но использует обработчик завершения метода showAsync().done для обработки команды, выбранной пользователем. Вы можете использовать этот пример для того, чтобы увидеть эффект активации чудо-кнопок при открытом диалоговом окне.
И, наконец, Сценарий 4 делает командой по умолчанию первую команду и отмечает вторую команду в качестве команды отмены, то есть, той команды, которая закрывает окно либо при ее выборе, либо при нажатии на клавишу клавиатуры Escape.
И это действительно все, что относится к окнам сообщений!