Condividi tramite


Mostrare più visualizzazioni con ApplicationView

Puoi aiutare gli utenti a essere più produttivi consentendo loro di visualizzare parti indipendenti della tua app in finestre separate. Quando si creano più finestre per un'app, ogni finestra si comporta in modo indipendente. La barra delle applicazioni mostra ogni finestra separatamente. Gli utenti possono spostare, ridimensionare, mostrare e nascondere le finestre delle app in modo indipendente e passare da una finestra all'altra come se fossero app separate. Ogni finestra opera nel proprio thread.

API importanti: ApplicationViewSwitcher, CreateNewView

Che cos'è una visualizzazione?

Una visualizzazione app è l'associazione 1:1 di un thread e una finestra usata dall'app per visualizzare il contenuto. È rappresentato da un oggetto Windows.ApplicationModel.Core.CoreApplicationView.

Le visualizzazioni vengono gestite dall'oggetto CoreApplication. Puoi chiamare CoreApplication.CreateNewView per creare un oggetto CoreApplicationView. CoreApplicationView riunisce un oggetto CoreWindow e un oggetto CoreDispatcher (archiviati nelle proprietà CoreWindow e Dispatcher). È possibile pensare a CoreApplicationView come a un oggetto usato da Windows Runtime per interagire con il sistema Windows core.

In genere non si lavora direttamente con l'oggetto CoreApplicationView. Windows Runtime fornisce invece la classe ApplicationView nello spazio dei nomi Windows.UI.ViewManagement. Questa classe fornisce proprietà, metodi ed eventi da usare quando l'app interagisce con il sistema di windowing. Per lavorare con ApplicationView, chiamare il metodo statico ApplicationView.GetForCurrentView, che ottiene un'istanza di ApplicationView associata al thread coreApplicationView corrente.

Analogamente, il framework XAML esegue il wrapping dell'oggetto CoreWindow in un oggetto Windows.UI.XAML.Window. In un'app XAML si interagisce in genere con l'oggetto Window anziché direttamente con CoreWindow.

Mostrare una nuova visualizzazione

Anche se il layout di ogni app è univoco, è consigliabile includere un pulsante per una "nuova finestra" in un percorso prevedibile, ad esempio l'angolo in alto a destra del contenuto che può essere aperto in una nuova finestra. Valuta anche se aggiungere un'opzione di menu di scelta rapida in "Apri in una nuova finestra".

Esaminiamo i passaggi per creare una nuova visualizzazione. In questo caso, la nuova visualizzazione viene avviata in risposta a un clic del pulsante.

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

Per mostrare una nuova visualizzazione

  1. Chiamare CoreApplication.CreateNewView per creare una nuova finestra e un thread per il contenuto della visualizzazione.

    CoreApplicationView newView = CoreApplication.CreateNewView();
    
  2. Tenere traccia dell'ID della nuova visualizzazione. Usare questa opzione per mostrare la visualizzazione in un secondo momento.

    È possibile prendere in considerazione la creazione di un'infrastruttura nell'app per tenere traccia delle visualizzazioni create. Per un esempio, vedere la classe ViewLifetimeControl nell'esempio MultipleViews.

    int newViewId = 0;
    
  3. Popolare la finestra nel nuovo thread.

    Usare il metodo CoreDispatcher.RunAsync per pianificare il lavoro sul thread dell'interfaccia utente per la nuova visualizzazione. Usare un'espressione lambda per passare una funzione come argomento al metodo RunAsync. Il lavoro svolto nella funzione lambda viene eseguito nel thread della nuova visualizzazione.

    In XAML, si aggiunge in genere un Frame alla proprietà Content di Window, quindi si sposta il Frame in una Pagina XAML in cui è stato definito il contenuto dell'app. Per altre informazioni su frame e pagine, vedi Spostamento peer-to-peer tra due pagine.

    Dopo aver popolato il nuovo oggetto Window, è necessario chiamare il metodo Activate di Window per visualizzare l'oggetto Window in un secondo momento. Questo lavoro viene eseguito sul thread della nuova visualizzazione, quindi viene attivata la nuova Window.

    Infine, si ottiene l'ID della nuova visualizzazione da usare in un secondo momento. Anche in questo caso, questo lavoro ha luogo nel thread della nuova visualizzazione, quindi ApplicationView.GetForCurrentView riceve l'ID della nuova visualizzazione.

    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. Visualizzare la nuova visualizzazione chiamando ApplicationViewSwitcher.TryShowAsStandaloneAsync.

    Dopo aver creato una nuova visualizzazione, è possibile visualizzarla in una nuova finestra chiamando il metodo ApplicationViewSwitcher.TryShowAsStandaloneAsync. Il parametro viewId di questo metodo è un numero intero che identifica in modo univoco ognuna delle visualizzazioni nell'app. È possibile recuperare l'ID della visualizzazione usando la proprietà ApplicationView.Id o il metodo ApplicationView.GetApplicationViewIdForWindow.

    bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId);
    

La visualizzazione principale

La prima visualizzazione creata all'avvio dell'app è denominata visualizzazione principale. Questa visualizzazione viene archiviata nella proprietà CoreApplication.MainView e la relativa proprietà IsMain è impostata al valore true. Questa vista non viene creata dall'utente, viene creata dall'app. Il thread della visualizzazione principale funge da gestore per l'app e tutti gli eventi di attivazione dell'app vengono trasmessi a questo thread.

Se le visualizzazioni secondarie sono aperte, la finestra della visualizzazione principale può essere nascosta, ad esempio facendo clic sul pulsante chiudi (x) nella barra del titolo della finestra, ma il thread rimane attivo. La chiamata a Close nella finestra della visualizzazione principale di Window genera l'eccezione InvalidOperationException. (Usare Application.Exit per chiudere l'app). Se il thread della visualizzazione principale viene terminato, l'app viene chiusa.

Visualizzazioni secondarie

Altre visualizzazioni, incluse tutte le visualizzazioni create chiamando CreateNewView nel codice dell'app, sono visualizzazioni secondarie. Sia la visualizzazione principale che quelle secondarie vengono archiviate nella raccolta CoreApplication.Views. In genere, si creano visualizzazioni secondarie in risposta a un'azione dell'utente. In alcuni casi, il sistema crea visualizzazioni secondarie per l'app.

Nota

È possibile usare la funzionalità accesso assegnato a Windows per eseguire un'app in modalità tutto schermo. Quando si esegue questa operazione, il sistema crea una visualizzazione secondaria per presentare l'interfaccia utente dell'app sopra la schermata di blocco. Le visualizzazioni secondarie create dall'app non sono consentite, quindi se si tenta di visualizzare la propria visualizzazione secondaria in modalità tutto schermo, viene generata un'eccezione.

Passare da una visualizzazione a un'altra

Valuta se fornire un modo per consentire all'utente di tornare alla finestra padre da una finestra secondaria. A tale scopo, usare il metodo ApplicationViewSwitcher.SwitchAsync. Si chiama questo metodo dal thread della finestra da cui si passa e si passa l'ID visualizzazione della finestra a cui si sta passando.

await ApplicationViewSwitcher.SwitchAsync(viewIdToShow);

Quando si usa SwitchAsync, è possibile scegliere se chiudere la finestra iniziale e rimuoverla dalla barra delle applicazioni specificando il valore di ApplicationViewSwitchingOptions.