Mostrar varias vistas con ApplicationView

Ayuda a tus usuarios a ser más productivos y permíteles ver partes independientes de la aplicación en ventanas distintas. Si creas varias ventanas para una aplicación, cada una de ellas se comporta de manera independiente. La barra de tareas muestra cada ventana por separado. Los usuarios pueden mover, cambiar de tamaño, mostrar y ocultar ventanas de la aplicación de manera independiente, así como cambiar entre ventanas de la aplicación como si usaran aplicaciones distintas. Cada ventana funciona en su propio subproceso.

API importantes: ApplicationViewSwitcher, CreateNewView

¿Qué es una vista?

Una vista de la aplicación es el emparejamiento 1:1 de un subproceso y una ventana que la aplicación usa para mostrar contenido. Está representada por un objeto Windows.ApplicationModel.Core.CoreApplicationView.

Las vistas las administra el objeto CoreApplication. Llama al método CoreApplication.CreateNewView para crear un objeto CoreApplicationView. LA CoreApplicationView reúne una CoreWindow y un CoreDispatcher (almacenado en la CoreWindow y las propiedades de Dispatcher). Puedes considerar la CoreApplicationView como el objeto que Windows Runtime usa para interactuar con el sistema Windows principal.

Normalmente, no trabajas directamente con la CoreApplicationView. En su lugar, Windows Runtime proporciona la clase ApplicationView en el espacio de nombres Windows.UI.ViewManagement. Esta clase ofrece propiedades, métodos y eventos que usas cuando tu aplicación interactúa con el sistema de ventanas. Para trabajar con una ApplicationView, llama al método ApplicationView.GetForCurrentView estático, que obtiene una instancia ApplicationView vinculada a la conversación actual de la CoreApplicationView.

De igual modo, el marco XAML encapsula el objeto CoreWindow en un objeto Windows.UI.XAML.Window. En una aplicación XAML, sueles interactuar con el objeto Ventana en lugar de trabajar directamente con la CoreWindow.

Mostrar una vista nueva

Aunque cada diseño de aplicación es único, te recomendamos que incluyas un botón de "ventana nueva" en una ubicación predecible, como la esquina superior derecha del contenido que se pueda abrir en una ventana nueva. También puedes incluir una opción de menú contextual "Abrir en una nueva ventana".

Echemos un vistazo a los pasos para crear una nueva vista. Aquí, la nueva vista se inicia en respuesta al clic de un botón.

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

Para mostrar una vista nueva

  1. Llama a CoreApplication.CreateNewView para crear una nueva ventana y una conversación para el contenido de la vista.

    CoreApplicationView newView = CoreApplication.CreateNewView();
    
  2. Realiza un seguimiento del Id de la nueva vista. Úsalo para mostrar la vista más adelante.

    Es posible que desees considerar la posibilidad de crear infraestructura en tu aplicación para facilitar el seguimiento de las vistas que crees. Consulta la clase ViewLifetimeControl en la muestra de varias vistas para ver un ejemplo.

    int newViewId = 0;
    
  3. En el nuevo subproceso, rellena la ventana.

    Debes usar el método CoreDispatcher.RunAsync para programar el trabajo de la conversación de la interfaz de usuario para la nueva vista. Debes usar una expresión lambda para pasar una función como un argumento para el método RunAsync. El trabajo que realices en la función lambda se realizará en el subproceso de la nueva vista.

    En XAML, lo normal es agregar un elemento Frame a la propiedad Content del elemento Window y luego desplazar al elemento Frame a una página XAML donde has definido el contenido de la aplicación. Para obtener más información sobre marcos y páginas, consulta Navegación de punto a punto entre dos páginas.

    Después de rellenar el elemento nuevo Window debes llamar al método Activate del elemento Window para mostrar el elemento Window más adelante. Este trabajo se realiza en la conversación de la nueva vista, de modo que la nueva Ventana se activa.

    Por último, obtén el Id de la nueva vista que vas a usar para mostrar la vista más adelante. De nuevo, este trabajo se realiza en la conversación de la nueva vista, por lo que ApplicationView.GetForCurrentView obtiene el Id de la nueva vista.

    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. Para mostrar la nueva vista llama a ApplicationViewSwitcher.TryShowAsStandaloneAsync.

    Después de crear una nueva vista, puedes mostrarla en una ventana nueva mediante una llamada al método ApplicationViewSwitcher.TryShowAsStandaloneAsync. El parámetro viewId de este método es un entero que identifica de manera única cada una de las vistas de la aplicación. Para recuperar el Id de la vista, usa la propiedad ApplicationView.Id o el método ApplicationView.GetApplicationViewIdForWindow.

    bool viewShown = await ApplicationViewSwitcher.TryShowAsStandaloneAsync(newViewId);
    

La vista principal

La primera vista que se crea al iniciar la aplicación se denomina vista principal. Esta vista se almacena en la propiedad CoreApplication.MainView y su propiedad IsMain es true. El usuario no crea esta vista, sino que la crea la aplicación. El subproceso de la vista principal sirve de administrador de la aplicación, y todos los eventos de activación de la aplicación se entregan en este subproceso.

Si se abren vistas secundarias, se puede ocultar la ventana de la vista principal (por ejemplo, con un clic en el botón de cierre (x) de la barra de título de la ventana), pero su subproceso permanece activo. Al llamar a Cerrar en la Ventana de la vista principal se produce una InvalidOperationException. (Usa Application.Exit para cerrar la aplicación). Si finaliza la conversación principal de la vista, se cierra la aplicación.

Vistas secundarias

Otras vistas, incluidas todas las vistas que se crean llamando a CreateNewView en el código de la aplicación, son vistas secundarias. La vista principal y las vistas secundarias se almacenan en la colección CoreApplication.Views. Por lo general, las vistas secundarias se crean en respuesta a una acción del usuario. En algunos casos, el sistema crea vistas secundarias para tu aplicación.

Nota:

Puedes usar la característica acceso asignado de Windows para ejecutar una aplicación en modo de pantalla completa. Al hacerlo, el sistema crea una vista secundaria para presentar la interfaz de usuario de la aplicación sobre la pantalla de bloqueo. No se permiten vistas secundarias creadas por la aplicación, por lo que si intentas mostrar tu propia vista secundaria en modo de pantalla completa, se iniciará una excepción.

Cambiar de una vista a otra

Considere la posibilidad de proporcionar una manera de que el usuario navegue desde una ventana secundaria a su ventana primaria. Para ello, usa el método ApplicationViewSwitcher.SwitchAsync. Se llama a este método desde el subproceso de la ventana desde la que se cambia y se pasa el identificador de vista de la ventana a la que se cambia.

await ApplicationViewSwitcher.SwitchAsync(viewIdToShow);

Cuando uses SwitchAsync, puedes elegir si quieres cerrar la ventana inicial y quitarla de la barra de tareas; para ello, especifica el valor de ApplicationViewSwitchingOptions.