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


Отображение нескольких представлений с помощью 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 обычно взаимодействуют с объектом Window , а не напрямую с 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 обычно добавляется кадр в свойство "Содержимое окна", а затем перейдите к странице XAML, в которой вы определили содержимое приложения. Подробные сведения о фреймах и страницах см. в статье Реализация навигации между двумя страницами.

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

    Наконец, получите идентификатор нового представления, который вы используете для отображения представления позже. Опять же, эта работа выполняется в потоке нового представления, поэтому 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) в строке заголовка окна, но его поток остается активным. Вызов close on the main view's Window приводит к возникновению invalidOperationException . (Используйте Application.Exit , чтобы закрыть приложение.) Если поток основного представления завершается, приложение закрывается.

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

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

Примечание.

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

Переход с одного представления на другое

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

await ApplicationViewSwitcher.SwitchAsync(viewIdToShow);

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