Afficher plusieurs vues avec ApplicationView

Aidez les utilisateurs à accroître leur productivité en leur permettant d’afficher des parties indépendantes de votre application dans des fenêtres distinctes. Quand vous créez plusieurs fenêtres pour une application, chacune d’elles se comporte de manière indépendante. La barre des tâches répertorie chaque fenêtre séparément. Les utilisateurs peuvent déplacer, redimensionner, afficher et masquer des fenêtres d’application indépendamment et ils peuvent basculer d’une fenêtre à une autre comme s’il s’agissait d’applications distinctes. Chaque fenêtre opère dans son propre thread.

API importantes : ApplicationViewSwitcher, CreateNewView

Qu’est-ce qu’une vue ?

Une vue d’application est l’association de type 1:1 d’un thread et d’une fenêtre que l’application utilise pour afficher le contenu. Elle est représentée par un objet Windows.ApplicationModel.Core.CoreApplicationView.

Les vues sont gérées par l’objet CoreApplication. Vous appelez CoreApplication.CreateNewView pour créer un objet CoreApplicationView . L’objet CoreApplicationView réunit CoreWindow et CoreDispatcher (stockés dans les propriétés CoreWindow et Dispatcher). Vous pouvez considérer la CoreApplicationView comme l’objet qui utilise Windows Runtime pour interagir avec le système Windows principal.

En règle générale, vous ne travaillez pas directement avec CoreApplicationView. Au lieu de cela, le Windows Runtime fournit la classe ApplicationView dans l’espace de noms Windows.UI.ViewManagement. Cette classe fournit des propriétés, des méthodes et des événements que vous utilisez quand votre application interagit avec le système de fenêtrage. Pour fonctionner avec une ApplicationView, appelez la méthode statique ApplicationView.GetForCurrentView, qui obtient une instance ApplicationView liée au thread actuel de la CoreApplicationView.

De même, l’infrastructure XAML enveloppe l’objet CoreWindow dans un objet Windows.UI.XAML.Window. Dans une application XAML, vous interagissez généralement avec l’objet Window au lieu de travailler directement avec la CoreWindow.

Afficher une nouvelle vue

Chaque disposition d'application est unique, mais nous vous recommandons d'inclure un bouton « nouvelle fenêtre » dans un emplacement prévisible, comme le coin supérieur droit du contenu, qui pourra être ouvert dans une nouvelle fenêtre. Envisagez également d’inclure une option de menu contextuel pour « Ouvrir dans une nouvelle fenêtre ».

Examinons les étapes pour créer une vue. Ici, la nouvelle vue est lancée en réponse à un clic sur un bouton.

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

Pour afficher une nouvelle vue

  1. Appelez CoreApplication.CreateNewView pour créer une fenêtre et un thread pour le contenu de l’affichage.

    CoreApplicationView newView = CoreApplication.CreateNewView();
    
  2. Suivez l’élément Id de la nouvelle vue. Vous pouvez utiliser cette fonction pour afficher la vue plus tard.

    Vous souhaiterez peut-être prendre en compte la création d’une infrastructure dans votre application pour faciliter le suivi des vues que vous créez. Voir la classe ViewLifetimeControl dans l’exemple MultipleViews pour plus d’informations.

    int newViewId = 0;
    
  3. Sur le nouveau thread, remplissez la fenêtre.

    Vous utilisez la méthode CoreDispatcher.RunAsync pour planifier le travail sur le thread d’interface utilisateur pour la nouvelle vue. Vous utilisez une expression lambda pour transmettre une fonction en tant qu’argument à la méthode RunAsync. Le travail que vous effectuez dans la fonction lambda se répercute sur le thread de la nouvelle vue.

    En XAML, vous ajoutez généralement un frame à la propriété Content de la fenêtre, puis accédez à lapage XAML où vous avez défini le contenu de votre application. Pour plus d’informations sur les frames et les pages, consultez Navigation pair à pair entre deux pages.

    Une fois le nouvel élément Window rempli, vous devez appeler la méthode Activate de Window pour afficher l’élément Window ultérieurement. Cela se produit sur le thread de la nouvelle vue ; ainsi la nouvelle Window est activée.

    Enfin, obtenez l’ID de la nouvelle vue que vous utilisez pour afficher la vue ultérieurement. Une fois encore, cela se produit sur le thread de la nouvelle vue ; ainsi ApplicationView.GetForCurrentView obtient l’élément Id de la nouvelle vue.

    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. Affichez la nouvelle vue en appelant ApplicationViewSwitcher.TryShowAsStandaloneAsync.

    Après avoir créé une vue, vous pouvez l’afficher dans une nouvelle fenêtre en appelant la méthode ApplicationViewSwitcher.TryShowAsStandaloneAsync. Le paramètre viewId de cette méthode est un entier qui identifie de manière unique chacune des vues dans votre application. Vous récupérez l’élément Id de la vue à l’aide de la propriété ApplicationView.Id ou de la méthode ApplicationView.GetApplicationViewIdForWindow.

    bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId);
    

Vue principale

La première vue créée lors du démarrage de votre application s’appelle la vue principale. Cette vue est stockée dans la propriété CoreApplication.MainView et sa propriété IsMain a la valeur true. Vous ne créez pas cette vue. Elle est créée par l’application. Le thread de la vue principale agit en tant que gestionnaire de l’application, et tous les évènements d’activation de l’application sont fournis sur ce thread.

Si des vues secondaires sont ouvertes, la fenêtre de la vue principale peut être masquée (par exemple, en cliquant sur le bouton de fermeture (x) dans la barre de titre de la fenêtre), mais son thread reste actif. Appeler Close sur la Window de la vue principale entraîne une InvalidOperationException. (Utilisez Application.Exit pour fermer votre application.) Si le thread de la vue main est terminé, l’application se ferme.

Vues secondaires

Les autres vues, y compris toutes les vues que vous créez en appelant CreateNewView dans le code de votre application, sont des vues secondaires. Les vues main et secondaires sont stockées dans la collection CoreApplication.Views. En règle générale, vous créez des vues secondaires en réponse à une action de l’utilisateur. Dans certains cas, le système crée des vues secondaires pour votre application.

Notes

Vous pouvez utiliser la fonctionnalité d’accès affecté de Windows pour exécuter une application en mode plein écran. Dans ce cas, le système crée une vue secondaire pour présenter l’interface utilisateur de votre application au-dessus de l’écran de verrouillage. Les vues secondaires créées par l’application ne sont pas autorisées. Ainsi, si vous essayez d’afficher votre propre vue secondaire en mode plein écran, une exception est levée.

Basculer d’une vue à une autre

Envisagez de fournir à l’utilisateur un moyen de naviguer d’une fenêtre secondaire vers sa fenêtre parente. Pour ce faire, utilisez la méthode ApplicationViewSwitcher.SwitchAsync . Vous appelez cette méthode à partir du thread de la fenêtre que vous quittez et vous transmettez l’ID de vue de la fenêtre vers laquelle vous basculez.

await ApplicationViewSwitcher.SwitchAsync(viewIdToShow);

Lorsque vous utilisez SwitchAsync, vous pouvez choisir si vous souhaitez fermer la fenêtre initiale et la supprimer de la barre des tâches en spécifiant la valeur d’ApplicationViewSwitchingOptions.