Anzeigen mehrerer Ansichten mit ApplicationView

Du kannst deinen Benutzern zu mehr Produktivität verhelfen, indem du ihnen ermöglichst, unabhängige Teile der App in separaten Fenstern anzuzeigen. Wenn Sie für eine App mehrere Fenster erstellen, verhält sich jedes Fenster anders. Auf der Taskleiste wird jedes Fenster separat angezeigt. Die Benutzer können App-Fenster unabhängig voneinander verschieben, deren Größe ändern, Fenster anzeigen und ausblenden und zwischen App-Fenstern wechseln, als würde es sich um separate Apps handeln. Jedes Fenster agiert in seinem eigenen Thread.

Wichtige APIs: ApplicationViewSwitcher, CreateNewView

Was ist eine Sicht?

Eine App-Ansicht ist die 1:1-Zuordnung eines Threads und eines Fensters, das die App zur Anzeige von Inhalten verwendet. Sie wird durch ein Windows.ApplicationModel.Core.CoreApplicationView-Objekt dargestellt.

Ansichten werden durch das CoreApplication-Objekt verwaltet. Sie rufen CoreApplication.CreateNewView auf, um ein CoreApplicationView-Objekt zu erstellen. Die CoreApplicationView vereint ein CoreWindow und einen CoreDispatcher (der in den Eigenschaften CoreWindow und Dispatcher gespeichert ist). Sie können sich CoreApplicationView als das Objekt vorstellen, das von der Windows-Runtime für die Interaktion mit dem zentralen Windows-System verwendet wird.

In der Regel arbeiten Sie nicht direkt mit der CoreApplicationView. Stattdessen wird die ApplicationView-Klasse von der Windows-Runtime im Windows.UI.ViewManagement-Namespace bereitgestellt. Diese Klasse stellt Eigenschaften, Methoden und Ereignisse bereit, die Sie bei der Interaktion zwischen App und Windowing-System verwenden. Wenn Sie mit einer ApplicationView arbeiten möchten, rufen Sie die statische ApplicationView.GetForCurrentView-Methode auf, die eine an den aktuellen Thread der CoreApplicationView gebundene Instanz von ApplicationView abruft.

Entsprechend umschließt das XAML-Framework das CoreWindow-Objekt in einem Windows.UI.XAML.Window-Objekt. In einer XAML-App interagieren Sie normalerweise mit dem Window-Objekt, anstatt direkt mit dem CoreWindow zu arbeiten.

Anzeigen einer neuen Ansicht

Während jedes App-Layout einzigartig ist, empfehlen wir dir, eine Schaltfläche für ein „Neues Fenster” an geeigneter Stelle zu platzieren, wie etwa in der rechten oberen Ecke des Inhalts, der in einem neuen Fenster geöffnet werden kann. Erwäge außerdem, die Kontextmenüoption In einem neuen Fenster öffnen einzufügen.

Sehen wir uns die Schritte zum Erstellen einer neuen Ansicht an. Die neue Ansicht wird hier als Reaktion auf das Anklicken einer Schaltfläche gestartet.

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);
}

So zeigen Sie eine neue Ansicht an

  1. Rufen Sie CoreApplication.CreateNewView auf, um ein neues Fenster und einen Thread für den anzuzeigenden Inhalt zu erstellen.

    CoreApplicationView newView = CoreApplication.CreateNewView();
    
  2. Verfolgen Sie die Id der neuen Ansicht nach. Über die ID können Sie die Ansicht später anzeigen.

    Sie können Ihre App mit einer bestimmten Infrastruktur ausstatten, um das Nachverfolgen der erstellten Ansichten zu erleichtern. Ein Beispiel bietet die ViewLifetimeControl-Klasse im MultipleViews-Beispiel.

    int newViewId = 0;
    
  3. Füllen Sie das Fenster im neuen Thread auf.

    Mithilfe der CoreDispatcher.RunAsync-Methode können Sie die Arbeit am UI-Thread für die neue Ansicht planen. Mithilfe eines Lambdaausdrucks übergeben Sie eine Funktion als Argument an die RunAsync-Methode. Die in der Lambdafunktion ausgeführten Arbeiten finden im Thread der neuen Ansicht statt.

    In XAML fügen Sie der Content-Eigenschaft von Window in der Regel einen Frame hinzu und navigieren dann den Frame zu einer XAML-Seite, auf der Sie den App-Inhalt definiert haben. Weitere Informationen zu Frames und Seiten findest du unter Peer-zu-Peer-Navigation zwischen zwei Seiten.

    Nachdem das neue Window aufgefüllt wurde, müssen Sie die Activate-Methode von Window aufrufen, um das Window später anzuzeigen. Diese Arbeit findet im Thread der neuen Ansicht statt, sodass das neue Window aktiviert ist.

    Schließlich rufen Sie die Id der neuen Ansicht ab, die Sie später zum Anzeigen der Ansicht verwenden. Auch diese Arbeit wird im Thread der neuen Ansicht erledigt, sodass ApplicationView.GetForCurrentView die Id der neuen Ansicht abruft.

    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. Zeigen Sie die neue Ansicht an, indem Sie ApplicationViewSwitcher.TryShowAsStandaloneAsync aufrufen.

    Nachdem Sie eine neue Ansicht erstellt haben, können Sie sie in einem neuen Fenster anzeigen, indem Sie die ApplicationViewSwitcher.TryShowAsStandaloneAsync-Methode aufrufen. Der viewId-Parameter für diese Methode ist eine ganze Zahl, die die einzelnen Ansichten in der App eindeutig identifiziert. Sie rufen die Id der Ansicht entweder über die ApplicationView.Id-Eigenschaft oder die ApplicationView.GetApplicationViewIdForWindow-Methode ab.

    bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId);
    

Die Hauptansicht

Die erste Ansicht, die beim Starten der App erstellt wird, wird als Hauptansicht bezeichnet. Diese Ansicht ist in der CoreApplication.MainView-Eigenschaft gespeichert und ihre IsMain-Eigenschaft ist „true“. Diese Ansicht wird nicht von Ihnen, sondern von der App erstellt. Der Thread der Hauptansicht dient als Manager für die App und alle App-Aktivierungsereignisse werden in diesem Thread übermittelt.

Wenn sekundäre Ansichten geöffnet sind, kann das Fenster der Hauptansicht ausgeblendet werden, z. B. durch Klicken auf die Schaltfläche „Schließen“ (X) in der Fenstertitelleiste. Der Thread bleibt jedoch aktiv. Durch Aufrufen von Close im Window der Hauptansicht wird eine InvalidOperationException ausgelöst. (Verwenden Sie Application.Exit, um Ihre App zu schließen.) Sobald der Thread der Hauptansicht beendet wird, wird die App geschlossen.

Sekundäre Ansichten

Andere Ansichten sind sekundäre Ansichten. Dies schließt auch Ansichten ein, die durch Aufrufen von CreateNewView im App-Code erstellt werden. Sowohl die Hauptansicht als auch sekundäre Ansichten werden in der CoreApplication.Views-Auflistung gespeichert. Normalerweise erstellen Sie sekundäre Ansichten in Reaktion auf eine Benutzeraktion. In einigen Fällen erstellt das System sekundäre Ansichten für Ihre App.

Hinweis

Sie können das Windows-Feature Zugewiesener Zugriff verwenden, um eine App im Kioskmodus auszuführen. In diesem Fall erstellt das System eine sekundäre Ansicht, um die App-Benutzeroberfläche über dem Sperrbildschirm darzustellen. Von der App erstellte sekundäre Ansichten sind nicht zulässig. Wenn Sie also versuchen, Ihre eigene sekundäre Ansicht im Kioskmodus anzuzeigen, wird eine Ausnahme ausgelöst.

Wechseln zwischen Ansichten

Erwägen Sie, dem Benutzer eine Möglichkeit zu bieten, von einem sekundären Fenster zurück zum übergeordneten Fenster zu navigieren. Verwenden Sie dazu die ApplicationViewSwitcher.SwitchAsync-Methode. Sie rufen diese Methode über den Thread des Fensters auf, von dem aus Sie wechseln, und übergeben die Ansichts-ID des Fensters, zu dem Sie wechseln.

await ApplicationViewSwitcher.SwitchAsync(viewIdToShow);

Wenn Sie SwitchAsync verwenden, können Sie auswählen, ob das erste Fenster geschlossen und aus der Taskleiste entfernt werden soll, indem Sie den Wert von ApplicationViewSwitchingOptions angeben.