Будьте в двух местах одновременно

Windows 8.1 обеспечивает многозадачность, позволяя пользователю распределить несколько приложений по экрану одновременно. Бывают ситуации, когда полезно иметь несколько окон одного и того же приложения на экране. Например, при разработке веб-сайтов, удобно расположить бок о бок окна браузера, для редактирования кода, отладчик и документацию.

Windows 8.1 позволяет одному приложению показать более одного окна, так что пользователи могут быстро получить доступ к двум разным частям приложения одновременно. Это открывает новые сценарии, такие как: сравнения нескольких документов одновременно или  их составление, при этом ссылаясь на другие материалы из того же приложения. Они (приложения) так же могут использовать несколько дисплеев, показывая содержимое на одном дисплее и что-то еще на другом. Как разработчик, вы можете внедрить эту возможность в ваше приложение, сделав его еще более привлекательным.

На картинке выше вы можете увидеть два окна Internet Explorer.

Наглядный пример

Если у вашего приложения есть несколько независимых функций, например, просмотр двух несвязанных единиц контента, вы можете помочь вашим пользователям быть более продуктивными, позволяя выполнять каждую функцию в отдельном окне. Если у пользователя есть более одного дисплея, окно можно перемещать на любой из этих экранов.

Mail, Internet Explorer, и Reader являются одними из первых приложений с поддержкой нескольких окон. Mail является отличным примером того, как это должно работать. Почта начинает свою работу, как и все приложения, в одном окне, но как только пользователь создает новое сообщение или открывает существующее письмо у него появляется возможность открыть данную информацию в новом.

 Так же, если вы открыли, допустим, письмо, в новом окне, у вас есть возможность продолжать любую работу с вашим устройством и в любой необходимый момент обратиться к нему из списка недавно использованных приложений для дальнейшей работы.

Когда письмо открывается в новом окне, оно содержит все необходимые функции для дальнейшей работы с ним.

Что можно извлечь из данного примера:

  • Разрешите пользователю контролировать: положитесь на его явное действие по созданию нового окна, а не перегружайте пользователя автоматическим созданием нескольких.
  • Создать классный функционал, который будет доступен в одном окне, а дополнительными ТОЛЬКО расширять его: пользователи должны быть в состоянии выполнить все доступные сценарии в рамках одного окна (главного).
  • Сделать вторичные окна полными: дополнительное окно должно содержать задачу, которую можно завершить независимо от любого другого окна.
  • Сохранять “утерянные” данные: пользователи могут потерять доступ к окнам, когда они пропадают из списка недавно использованных приложений. Убедитесь в том, что ваше приложение всегда сохраняет их важные данные и  предоставляет возможность легко воссоздать.

Разработка.

Вы можете разрабатывать ваше приложение в несколько шагов. Использование API можно посмотреть в стандартном примере.

Создание нового окна:

CoreApplicationView newView = CoreApplication.CreateNewView();

Данный вызов создаст новое окно в новом потоке. Связь между потоками осуществляется с помощью CoreDispatcher.RunAsync.

Первое окно создается при запуске вашего приложения (так называемый главный вид). Когда приложение активирует контракт, например, FilePicker или ProtocolLaunch, главное окно будет отображаться перед пользователем пока не вызывается событие ApplicationViewSwitcher.DisableShowingMainViewOnActivation (ApplicationViewSwitcher является основным классом для управления поведения нескольких окон). Все события активации происходят в потоке главного окна. Если оно закроется или поток “умрет” по любой другой причине — приложение завершится.

Заполнение нового окна:

Для внедрения контента в новое окно вам необходимо предпринять дополнительные меры:

await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
  var frame = new Frame();
  frame.Navigate(typeof(SecondaryViewPage), null);
  Window.Current.Content = frame;
});

Обратите внимание на вызов RunAsync. Поскольку функция взаимодействует с новым окном — она должна вызываться с UI потока.

Отображение

После того как мы создали новое окно, показать его можно с помощью ApplicationViewSwitcher.TryShowAsStandaloneAsync. Всё API ApplicationViewSwitcher принимает в виде параметра целочисленные идентификаторы, которые идентифицируют каждое окно вашего приложения. Получить ID можно используя ApplicationView.Id или ApplicationView.GetApplicationViewIdForWindow. Полный код для создания и отображения показан ниже:

var newView = CoreApplication.CreateNewView();
int newViewId = 0;
await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
  var frame = new Frame();
  frame.Navigate(typeof(SecondaryViewPage), null);
  Window.Current.Content = frame;
  newViewId = ApplicationView.GetForCurrentView().Id;
});

Вы могли заметить, что результат TryShowAsStandloneAsync является логическим значением, которое указывает — было ли новое окно показано ​​пользователю. Ваше приложение может показать новое окно только при определенных обстоятельствах. Кроме того, данное API ведет себя следующим образом: если данное окно уже было представлено пользователю, то вы можете отобразить его на экране снова.

Переключение между окнами

Ваше приложение должно предоставлять пользователю возможность добраться до любого контента в приложении из текущего окна. Например, вторичные окна приложения Mail содержат в себе кнопку “назад”, которая при нажатии отображает главное окно. ApplicationViewSwitcher.SwitchAsync решает эту задачу. Просто вызовите его из потока данного окна.

await ApplicationViewSwitcher.SwitchAsync(viewIdToShow);

Закрытие неиспользуемых окон

После того как вы показали окно пользователю, оно остается в списке недавно использованных приложений, пока пользователь не запускает достаточно других  и система не закроет его. Событие Consolidated вызывается в потоке окна, которое было удалено, при условии, что у приложения есть несколько вспомогательных окон.

ApplicationView.GetForCurrentView().Consolidated += ViewConsolidated;

void ViewConsolidated(ApplicationView sender, ApplicationViewConsolidatedEventArgs e)
{
  if (!CoreApplication.GetCurrentView().IsMain)
  {
      Window.Current.Close();
  }
}

bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId);

Если вы хотите, удалить окно с экрана от имени пользователя, вы можете сделать это, используя SwitchAsync. Почта делает это, например, при отправке или удаление сообщения, содержащегося во вторичном окне. Обратите внимание, что лучшая практика — при закрытии окна, заменить его другим окном (как правило, основным), так что бы пользователь смог продолжать работать в вашем приложении.

await ApplicationViewSwitcher.SwitchAsync(replacementViewId, viewIdToClose, ApplicationViewSwitchingOptions.ConsolidateViews);

Отображение на другом дисплее

Ваше приложение может также показать окно на другом дисплее. Например, во время презентации можно показывать слайды на проектор, а на главном устройстве отображает заметки по слайдам. За все это отвечает класс ProjectionManager, функциональность которого аналогична ApplicationViewSwitcher.

Шаги такие же, как и в случае выше, с небольшим отличием:

  • До создания окна, проверить, доступен ли дополнительный дисплей с помощью ProjectionManager.ProjectionDisplayAvailable и ProjectionManager.ProjectionDisplayAvailableChanged
  • После создания окна, отобразить его на дополнительном дисплее, вызвав ProjectionManager.StartProjectingAsync вместо ApplicationViewSwitcher.TryShowAsStandaloneAsync
  • Чтобы удалить окно со вторичного дисплея, вызовите ProjectionManager.StopProjectingAsync вместо ApplicationViewSwitcher.SwitchAsync

Посмотрите данный пример для более подробной информации.

Итог

Windows 8.1 позволяет приложению показать два или более различных окон одновременно. Это поможет реализовать многозадачность и привлечь ещ больше пользователей.

Ссылка на источник: Be two places at once using multiple windows

 

 

Advertisements
Tagged with: , , ,
Опубликовано в Development, Windows 8.1

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: