Поделиться через


Отображение нескольких представлений с помощью ApplicationView

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

Важные API: ApplicationViewSwitcher, CreateNewView

Что такое представление?

Представление приложения представляет собой сочетание потока и окна, которое приложение использует для отображения содержимого. Он представлен объектом Windows.ApplicationModel.Core.CoreApplicationView .

Управление представлениями осуществляется объектом CoreApplication. Вы вызываете CoreApplication.CreateNewView, чтобы создать объект CoreApplicationView. CoreApplicationView объединяет CoreWindow и CoreDispatcher (которые хранятся в свойствах CoreWindow и Dispatcher). CoreApplicationView можно рассматривать как объект, который среда выполнения Windows использует для взаимодействия с основной системой Windows.

Обычно вы не работаете непосредственно с CoreApplicationView. Вместо этого среда выполнения Windows предоставляет класс ApplicationView в пространстве имен Windows.UI.ViewManagement . Этот класс предоставляет свойства, методы и события, используемые при взаимодействии приложения с системой окон. Чтобы работать с ApplicationView, вызовите статический метод ApplicationView.GetForCurrentView, который получает экземпляр ApplicationView, привязанный к текущему потоку CoreApplicationView.

Аналогичным образом платформа XAML упаковывает объект CoreWindow в объект Windows.UI.XAML.Window . В приложении XAML вы обычно взаимодействуете с объектом окна , а не напрямую с CoreWindow.

Покажите новое представление

Хотя каждый макет приложения является уникальным, мы рекомендуем включить кнопку "Новое окно" в прогнозируемом расположении, например верхний правый угол содержимого, которое можно открыть в новом окне. Кроме того, рекомендуется включить параметр контекстного меню "Открыть в новом окне".

Рассмотрим шаги по созданию нового представления. Здесь новое представление запускается в ответ на нажатие кнопки.

private async void Button_Click(object sender, RoutedEventArgs e)
{
    CoreApplicationView newView = CoreApplication.CreateNewView();
    int newViewId = 0;
    await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        Frame frame = new Frame();
        frame.Navigate(typeof(SecondaryPage), null);   
        Window.Current.Content = frame;
        // You have to activate the window in order to show it later.
        Window.Current.Activate();

        newViewId = ApplicationView.GetForCurrentView().Id;
    });
    bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId);
}

Показать новое представление

  1. Вызовите CoreApplication.CreateNewView, чтобы создать новое окно и поток для содержимого представления.

    CoreApplicationView newView = CoreApplication.CreateNewView();
    
  2. Отслеживайте идентификатор нового представления. Это можно использовать для отображения представления позже.

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

    int newViewId = 0;
    
  3. В новом потоке заполните окно данными.

    Для планирования работы в потоке пользовательского интерфейса для нового представления используется метод CoreDispatcher.RunAsync. Для передачи функции в качестве аргумента в метод RunAsync использует ся лямбда-выражение. Работа, выполняемая в лямбда-функции, происходит в потоке нового представления.

    В XAML вы обычно добавляете Frame в свойство Window's Content, затем перемещаете Frame на XAML Page, где вы определяете содержимое своего приложения. Дополнительные сведения о кадрах и страницах см. в разделе одноранговой навигации между двумя страницами.

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

    Наконец, получите идентификатор нового представления Id, который вы используете для отображения представления позже. Опять же, эта работа выполняется в потоке нового представления, поэтому ApplicationView.GetForCurrentView получает идентификатор нового представления.

    await newView.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
    {
        Frame frame = new Frame();
        frame.Navigate(typeof(SecondaryPage), null);   
        Window.Current.Content = frame;
        // You have to activate the window in order to show it later.
        Window.Current.Activate();
    
        newViewId = ApplicationView.GetForCurrentView().Id;
    });
    
  4. Отобразите новое представление, вызвав ApplicationViewSwitcher.TryShowAsStandaloneAsync.

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

    bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId);
    

Основное представление

Первое представление, созданное при запуске приложения, называется основное представление. Это представление хранится в свойстве CoreApplication.MainView, а его свойство IsMain имеет значение true. Вы не создаете это представление; он создается приложением. Поток главного интерфейса служит диспетчером для приложения, а все события активации приложения обрабатываются в этом потоке.

Если вторичные представления открыты, окно основного представления может быть скрыто, например, нажав кнопку закрытия (x) в строке заголовка окна, но его поток остается активным. Вызов закрыть в окне основного представления приводит к возникновению invalidOperationException. (Используйте Application.Exit для закрытия приложения.) Если поток основного представления завершается, приложение закрывается.

Вторичные представления

Другие представления, включая все созданные представления путем вызова CreateNewView в коде приложения, являются вторичными представлениями. Основное представление и вторичные представления хранятся в коллекции CoreApplication.Views . Как правило, вы создаете вторичные представления в ответ на действие пользователя. В некоторых случаях система создает вторичные представления для вашего приложения.

Замечание

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

Переход с одного вида на другой

Рассмотрите возможность перехода пользователя из дополнительного окна обратно в родительское окно. Для этого используйте метод ApplicationViewSwitcher.SwitchAsync . Этот метод вызывается из потока окна, с которого вы переключаетесь, и вы передаете идентификатор представления окна, на который вы переключаетесь.

await ApplicationViewSwitcher.SwitchAsync(viewIdToShow);

При использовании SwitchAsync можно выбрать, нужно ли закрыть начальное окно и удалить его с панели задач, указав значение ApplicationViewSwitchingOptions.