Navegación en Xamarin.Forms ShellXamarin.Forms Shell Navigation

Descargar ejemplo Descargar el ejemploDownload Sample Download the sample

Xamarin.Forms Shell incluye una experiencia de navegación basada en el URI que emplea rutas para navegar a cualquier página de la aplicación, sin tener que seguir una jerarquía de navegación establecida.Xamarin.Forms Shell includes a URI-based navigation experience that uses routes to navigate to any page in the application, without having to follow a set navigation hierarchy. También ofrece la posibilidad de navegar hacia atrás sin tener que visitar todas las páginas de la pila de navegación.In addition, it also provides the ability to navigate backwards without having to visit all of the pages on the navigation stack.

Shell define las siguientes propiedades relacionadas con la navegación:Shell defines the following navigation related properties:

  • BackButtonBehavior, de tipo BackButtonBehavior, una propiedad adjunta que define el comportamiento del botón Atrás.BackButtonBehavior, of type BackButtonBehavior, an attached property that defines the behavior of the back button.
  • CurrentItem, de tipo FlyoutItem, el valor de FlyoutItem seleccionado actualmente.CurrentItem, of type FlyoutItem, the currently selected FlyoutItem.
  • CurrentState, de tipo ShellNavigationState, el estado de navegación actual de Shell.CurrentState, of type ShellNavigationState, the current navigation state of the Shell.
  • Current, de tipo Shell, un alias con el tipo convertido para Application.Current.MainPage.Current, of type Shell, a type-casted alias for Application.Current.MainPage.

Las propiedades BackButtonBehavior, CurrentItem y CurrentState están respaldadas por objetos BindableProperty, lo que significa que estas propiedades pueden ser destinos de los enlaces de datos.The BackButtonBehavior, CurrentItem, and CurrentState properties are backed by BindableProperty objects, which means that these properties can be targets of data bindings.

La navegación se realiza mediante la invocación del método GoToAsync, desde la clase Shell.Navigation is performed by invoking the GoToAsync method, from the Shell class. Cuando la navegación está a punto de realizarse, se activa un evento Navigating y cuando finaliza, se activa un evento Navigated.When navigation is about to be performed, a Navigating event is fired, and a Navigated event is fired when navigation completes.

Nota

La navegación todavía se puede realizar en una aplicación de Xamarin.Forms Shell mediante la propiedad Navigation.Navigation can still be performed in a Xamarin.Forms Shell application by using the Navigation property. Para más información, consulte Navegación jerárquica.For more information, see Hierarchical Navigation.

RutasRoutes

La navegación se realiza en una aplicación de Shell mediante la especificación de un URI al que navegar.Navigation is performed in a Shell application by specifying a URI to navigate to. Los URI de navegación pueden tener tres componentes:Navigation URIs can have three components:

  • Una ruta, que define la ruta de acceso al contenido que existe como parte de la jerarquía visual de Shell.A route, which defines the path to content that exists as part of the Shell visual hierarchy.
  • Una página.A page. Las páginas que no existen en la jerarquía visual de Shell se pueden insertar en la pila de navegación desde cualquier lugar dentro de una aplicación de Shell.Pages that don't exist in the Shell visual hierarchy can be pushed onto the navigation stack from anywhere within a Shell application. Por ejemplo, una página de detalles de elementos no se definirá en la jerarquía visual de Shell, pero se puede insertar en la pila de navegación si es necesario.For example, an item details page won't be defined in the Shell visual hierarchy, but can be pushed onto the navigation stack as required.
  • Uno o varios parámetros de consulta.One or more query parameters. Los parámetros de consulta son parámetros que se pueden pasar a la página de destino durante la navegación.Query parameters are parameters that can be passed to the destination page while navigating.

Cuando un URI de navegación incluye los tres componentes, la estructura es: //route/page?queryParametersWhen a navigation URI includes all three components, the structure is: //route/page?queryParameters

Registro de rutasRegister routes

Las rutas se pueden definir en objetos FlyoutItem, Tab y ShellContent mediante sus propiedades Route:Routes can be defined on FlyoutItem, Tab, and ShellContent objects, through their Route properties:

<Shell ...>
    <FlyoutItem ...
                Route="animals">
        <Tab ...
             Route="domestic">
            <ShellContent ...
                          Route="cats" />
            <ShellContent ...
                          Route="dogs" />
        </Tab>
        <ShellContent ...
                      Route="monkeys" />
        <ShellContent ...
                      Route="elephants" />  
        <ShellContent ...
                      Route="bears" />
    </FlyoutItem>
    <ShellContent ...
                  Route="about" />                  
    ...
</Shell>

Nota

Todos los elementos de la jerarquía de Shell tienen asociada una ruta.All items in the Shell hierarchy have a route associated with them. Si el desarrollador no establece una ruta, esta se genera en tiempo de ejecución.If a route is not set by the developer, the route is generated at runtime. Sin embargo, no se garantiza que las rutas generadas sean coherentes entre distintas sesiones de aplicación.However, generated routes are not guaranteed to be consistent across different application sessions.

En este ejemplo se crea la siguiente jerarquía de ruta desde la misma aplicación, que se puede usar en la navegación mediante programación:This example, from the sample application, creates the following route hierarchy, which can be used in programmatic navigation:

animals
  domestic
    cats
    dogs
  monkeys
  elephants
  bears
about

Para desplazarse al objeto ShellContent de la ruta dogs, el URI de la ruta absoluta es //animals/domestic/dogs.To navigate to the ShellContent object for the dogs route, the absolute route URI is //animals/domestic/dogs. Igualmente, para desplazarse al objeto ShellContent de la ruta about, el URL de la ruta absoluta es //about.Similarly, to navigate to the ShellContent object for the about route, the absolute route URI is //about.

Importante

Si se detecta una ruta duplicada, se produce una excepción ArgumentException al inicio de la aplicación.An ArgumentException will be thrown on application startup if a duplicate route is detected. También se producirá esta excepción si dos o más rutas del mismo nivel de la jerarquía comparten el nombre de ruta.This exception will also be thrown if two or more routes at the same level in the hierarchy share a route name.

Registro de rutas de páginaRegister page routes

En el constructor de subclases de Shell, o en cualquier otra ubicación que se ejecute antes de invocar una ruta, se pueden registrar explícitamente rutas adicionales para cualquier página que no esté representada en la jerarquía visual de Shell:In the Shell subclass constructor, or any other location that runs before a route is invoked, additional routes can be explicitly registered for any pages that aren't represented in the Shell visual hierarchy:

Routing.RegisterRoute("monkeydetails", typeof(MonkeyDetailPage));
Routing.RegisterRoute("beardetails", typeof(BearDetailPage));
Routing.RegisterRoute("catdetails", typeof(CatDetailPage));
Routing.RegisterRoute("dogdetails", typeof(DogDetailPage));
Routing.RegisterRoute("elephantdetails", typeof(ElephantDetailPage));

En este ejemplo se registran como rutas páginas de detalles de elementos que no están definidas en la subclase de Shell.This example registers item detail pages, that aren't defined in the Shell subclass, as routes. Luego, es posible desplazarse por estas páginas desde cualquier lugar de la aplicación mediante la navegación basada en el URI.These pages can then be navigated to using URI-based navigation, from anywhere within the application. Las rutas de estas páginas se conocen como rutas globales.The routes for such pages are known as global routes.

Nota

Si es necesario, se puede cancelar el registro de las páginas cuyas rutas se han registrado con el método Routing.RegisterRoute, con el método Routing.UnRegisterRoute.Pages whose routes have been registered with the Routing.RegisterRoute method can be deregistered with the Routing.UnRegisterRoute method, if required.

Como alternativa, se pueden registrar las páginas en diferentes jerarquías de ruta:Alternatively, pages can be registered at different route hierarchies if required:

Routing.RegisterRoute("monkeys/details", typeof(MonkeyDetailPage));
Routing.RegisterRoute("bears/details", typeof(BearDetailPage));
Routing.RegisterRoute("cats/details", typeof(CatDetailPage));
Routing.RegisterRoute("dogs/details", typeof(DogDetailPage));
Routing.RegisterRoute("elephants/details", typeof(ElephantDetailPage));

En este ejemplo se habilita la navegación contextual por las páginas, donde la navegación a la ruta details desde la página de la ruta monkeys muestra MonkeyDetailPage.This example enables contextual page navigation, where navigating to the details route from the page for the monkeys route displays the MonkeyDetailPage. De forma similar, al desplazarse a la ruta details desde la página de la ruta elephants se muestra ElephantDetailPage.Similarly, navigating to the details route from the page for the elephants route displays the ElephantDetailPage.

Importante

Se producirá una excepción ArgumentException si el método Routing.RegisterRoute intenta registrar la misma ruta en dos o más tipos diferentes.An ArgumentException will be thrown if the Routing.RegisterRoute method attempts to register the same route to two or more different types.

Realización de la navegaciónPerform navigation

Para realizar la navegación, se debe obtener primero una referencia a la subclase Shell.To perform navigation, a reference to the Shell subclass must first be obtained. Esta referencia se puede obtener mediante la conversión de la propiedad App.Current.MainPage en un objeto Shell, por medio de la propiedad Shell.Current.This reference can be obtained by casting the App.Current.MainPage property to a Shell object, or through the Shell.Current property. Luego, se puede realizar la navegación mediante la llamada al método GoToAsync en el objeto Shell.Navigation can then be performed by calling the GoToAsync method on the Shell object. Este método lleva a ShellNavigationState y devuelve un objeto Task que se completa una vez completada la animación de navegación.This method navigates to a ShellNavigationState and returns a Task that will complete once the navigation animation has completed. El objeto ShellNavigationState se construye mediante el método GoToAsync, desde una propiedad string o Uri, y tiene su propiedad Location establecida en el argumento string o Uri.The ShellNavigationState object is constructed by the GoToAsync method, from a string, or a Uri, and it has its Location property set to the string or Uri argument.

Cuando se navega a una ruta de la jerarquía visual de Shell, no se crea una pila de navegación.When a route from the Shell visual hierarchy is navigated to, a navigation stack isn't created. Sin embargo, cuando se navega a una página que no está en la jerarquía visual de Shell, se crea una pila de navegación.However, when a page that's not in the Shell visual hierarchy is navigated to, a navigation stack is created.

Nota

El estado actual de navegación de Shell se puede recuperar mediante la propiedad Shell.Current.CurrentState, que incluye el URI de la ruta mostrada en la propiedad Location.The current navigation state of the Shell can be retrieved through the Shell.Current.CurrentState property, which includes the URI of the displayed route in the Location property.

Rutas absolutasAbsolute routes

Se puede realizar la navegación mediante la especificación de un URI absoluto válido como argumento del método GoToAsync:Navigation can be performed by specifying a valid absolute URI as an argument to the GoToAsync method:

await Shell.Current.GoToAsync("//animals/monkeys");

En este ejemplo se navega a la página de la ruta monkeys, donde dicha ruta se define en un objeto ShellContent.This example navigates to the page for the monkeys route, with the route being defined on a ShellContent object. El objeto ShellContent que representa la ruta monkeys es un elemento secundario de un objeto FlyoutItem, cuya ruta es animals.The ShellContent object that represents the monkeys route is a child of a FlyoutItem object, whose route is animals.

Rutas relativasRelative routes

La navegación se puede realizar también mediante la especificación de un URI relativo válido como argumento del método GoToAsync.Navigation can also be performed by specifying a valid relative URI as an argument to the GoToAsync method. El sistema de enrutamiento intenta hacer coincidir el URI con un objeto ShellContent.The routing system will attempt to match the URI to a ShellContent object. Por lo tanto, si todas las rutas de una aplicación son únicas, la navegación se puede realizar con solo especificar el nombre de ruta único como un URI relativo:Therefore, if all the routes in an application are unique, navigation can be performed by only specifying the unique route name as a relative URI:

await Shell.Current.GoToAsync("monkeydetails");

En este ejemplo se navega a la página de la ruta monkeydetails.This example navigates to the page for the monkeydetails route.

Además, se admiten los siguientes formatos de ruta relativa:In addition, the following relative route formats are supported:

FormatoFormat DESCRIPCIÓNDescription
//route//route En la jerarquía de ruta se buscará la ruta especificada, hacia arriba desde la ruta mostrada actualmente.The route hierarchy will be searched for the specified route, upwards from the currently displayed route.
///route///route En la jerarquía de ruta se buscará la ruta especificada, hacia abajo desde la ruta mostrada actualmente.The route hierarchy will be searched for the specified route, downwards from the currently displayed route.

Navegación contextualContextual navigation

Las rutas relativas permiten la navegación contextual.Relative routes enable contextual navigation. Por ejemplo, considere la siguiente jerarquía de ruta:For example, consider the following route hierarchy:

monkeys
  details
bears
  details

Cuando se muestra la página registrada para la ruta monkeys, al navegar a la ruta details se mostrará la página registrada para la ruta monkeys/details.When the registered page for the monkeys route is displayed, navigating to the details route will display the registered page for the monkeys/details route. Igualmente, cuando se muestra la página registrada para la ruta bears, al navegar a la ruta details se mostrará la página registrada para la ruta bears/details.Similarly, when the registered page for the bears route is displayed, navigating to the details route will display the registered page for the bears/details route. Para información sobre cómo registrar las rutas en este ejemplo, consulte Registro de rutas de página.For information on how to register the routes in this example, see Register page routes.

Rutas no válidasInvalid routes

Los siguientes formatos de ruta no son válidos:The following route formats are invalid:

FormatoFormat ExplicaciónExplanation
route o /routeroute or /route Las rutas de la jerarquía visual no se pueden insertar en la pila de navegación.Routes in the visual hierarchy can't be pushed onto the navigation stack.
//page o ///page//page or ///page Actualmente, las rutas globales no pueden ser la única página en la pila de navegación.Global routes currently can't be the only page on the navigation stack. Por lo tanto, no se admite el enrutamiento absoluto a rutas globales.Therefore, absolute routing to global routes is unsupported.

El uso de cualquiera de estos formatos de ruta dará como resultado una excepción Exception.Use of any of these route formats result in an Exception being thrown.

Importante

Al intentar navegar a una ruta inexistente, se producirá una excepción ArgumentException.Attempting to navigate to a non-existent route results in an ArgumentException exception being thrown.

Depuración de la navegaciónDebugging navigation

Algunas de las clases de Shell se representan con DebuggerDisplayAttribute, que especifica cómo el depurador muestra una clase o campo.Some of the Shell classes are decorated with the DebuggerDisplayAttribute, which specifies how a class or field is displayed by the debugger. Esto puede ayudar a depurar las solicitudes de navegación puesto que se muestran los datos relacionados con la solicitud de navegación.This can help to debug navigation requests by displaying data related to the navigation request. Por ejemplo, en la captura de pantalla siguiente se muestran las propiedades CurrentItem y CurrentState del objeto Shell.Current:For example, the following screenshot shows the CurrentItem and CurrentState properties of the Shell.Current object:

Captura de pantalla del depuradorScreenshot of debugger

En este ejemplo, la propiedad CurrentItem, de tipo FlyoutItem, muestra el título y la ruta del objeto FlyoutItem.In this example, the CurrentItem property, of type FlyoutItem, displays the title and route of the FlyoutItem object. Igualmente, la propiedad CurrentState, de tipo ShellNavigationState, muestra el URI de la ruta mostrada dentro de la aplicación de Shell.Similarly, the CurrentState property, of type ShellNavigationState, displays the URI of the displayed route within the Shell application.

Clase TabTab class

La clase Tab define una propiedad Stack, de tipo IReadOnlyList<Page>, que representa la pila de navegación actual insertada en Tab.The Tab class defines a Stack property, of type IReadOnlyList<Page>, which represents the current pushed navigation stack within the Tab. La clase también proporciona los siguientes métodos de navegación reemplazables:The class also provides the following overridable navigation methods:

  • GetNavigationStack, devuelve IReadOnlyList<Page>, la pila de navegación actual.GetNavigationStack, returns IReadOnlyList<Page>, the current navigation stack.
  • OnInsertPageBefore, que se llama cuando se llama a INavigation.InsertPageBefore.OnInsertPageBefore, that's called when INavigation.InsertPageBefore is called.
  • OnPopAsync, devuelve Task<Page>, y se llama cuando se llama a INavigation.PopAsync.OnPopAsync, returns Task<Page>, and is called when INavigation.PopAsync is called.
  • OnPopToRootAsync, devuelve Task, y se llama cuando se llama a INavigation.OnPopToRootAsync.OnPopToRootAsync, returns Task, and is called when INavigation.OnPopToRootAsync is called.
  • OnPushAsync, devuelve Task, y se llama cuando se llama a INavigation.PushAsync.OnPushAsync, returns Task, and is called when INavigation.PushAsync is called.
  • OnRemovePage, que se llama cuando se llama a INavigation.RemovePage.OnRemovePage, that's called when INavigation.RemovePage is called.

La clase Shell define un evento Navigating, que se desencadena cuando está a punto de realizarse la navegación, ya sea debido a la navegación mediante programación o a la interacción del usuario.The Shell class defines a Navigating event, which is fired when navigation is about to be performed, either due to programmatic navigation or user interaction. El objeto ShellNavigatingEventArgs que acompaña al evento Navigating proporciona las siguientes propiedades:The ShellNavigatingEventArgs object that accompanies the Navigating event provides the following properties:

Propiedad.Property EscribaType DESCRIPCIÓNDescription
Current ShellNavigationState Identificador URI de la página actual.The URI of the current page.
Source ShellNavigationSource El tipo de navegación que se ha producido.The type of navigation that occurred.
Target ShellNavigationState Identificador URI que representa el destino de la navegación.The URI representing where the navigation is destined.
CanCancel bool Valor que indica si es posible cancelar la navegación.A value indicating if it's possible to cancel the navigation.
Cancelled bool Valor que indica si la navegación se ha cancelado.A value indicating if the navigation was cancelled.

Además, la clase ShellNavigatingEventArgs proporciona un método Cancel que se puede usar para cancelar la navegación.In addition, the ShellNavigatingEventArgs class provides a Cancel method that can be used to cancel navigation.

Nota

El evento Navigated se desencadena por el método OnNavigating reemplazable de la clase Shell.The Navigated event is fired by the overridable OnNavigating method in the Shell class.

La clase Shell también define un evento Navigated, que se desencadena cuando se ha completado la navegación.The Shell class also defines a Navigated event, which is fired when navigation has completed. El objeto ShellNavigatedEventArgs que acompaña al evento Navigating proporciona las siguientes propiedades:The ShellNavigatedEventArgs object that accompanies the Navigating event provides the following properties:

Propiedad.Property EscribaType DESCRIPCIÓNDescription
Current ShellNavigationState Identificador URI de la página actual.The URI of the current page.
Previous ShellNavigationState Identificador URI de la página anterior.The URI of the previous page.
Source ShellNavigationSource El tipo de navegación que se ha producido.The type of navigation that occurred.

Nota

El evento Navigating se desencadena por el método OnNavigated reemplazable de la clase Shell.The Navigating event is fired by the overridable OnNavigated method in the Shell class.

Las clases ShellNavigatedEventArgs y ShellNavigatingEventArgs tienen ambas propiedades Source, de tipo ShellNavigationSource.The ShellNavigatedEventArgs and ShellNavigatingEventArgs classes both have Source properties, of type ShellNavigationSource. Esta enumeración proporciona los valores siguientes:This enumeration provides the following values:

  • Unknown
  • Push
  • Pop
  • PopToRoot
  • Insert
  • Remove
  • ShellItemChanged
  • ShellSectionChanged
  • ShellContentChanged

Por lo tanto, en un controlador del evento Navigating, es posible interceptar la navegación y realizar acciones en función del origen de navegación.Therefore, in a handler for the Navigating event, it's possible to intercept navigation and performs actions based on the navigation source. Por ejemplo, el código siguiente muestra cómo cancelar la navegación hacia atrás si no se han guardado los datos de la página:For example, the following code shows how to cancel backwards navigation if the data on the page is unsaved:

void OnNavigating(object sender, ShellNavigatingEventArgs e)
{
    // Cancel back navigation if data is unsaved
    if (e.Source == ShellNavigationSource.Pop && !dataSaved)
    {
        e.Cancel();
    }
}

Pasar datosPass data

Al realizar la navegación mediante programación, los datos pueden pasarse como parámetros de consulta.Data can be passed as query parameters when performing programmatic navigation. Por ejemplo, el código siguiente se ejecuta en la aplicación de ejemplo cuando un usuario selecciona un elefante en ElephantsPage:For example, the following code is executed in the sample application when a user selects an elephant on the ElephantsPage:

async void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    string elephantName = (e.CurrentSelection.FirstOrDefault() as Animal).Name;
    await Shell.Current.GoToAsync($"//animals/elephants/elephantdetails?name={elephantName}");
}

En este ejemplo de código se recupera el elefante actualmente seleccionado en CollectionView y se navega a la ruta elephantdetails; además, se pasa elephantName como parámetro de consulta.This code example retrieves the currently selected elephant in the CollectionView, and navigates to the elephantdetails route, passing elephantName as a query parameter. Tenga en cuenta que los parámetros de consulta van a ser codificados con URL para la navegación, por lo que "Indian Elephant" se convertirá en "Indian%20Elephant".Note that query parameters will be URL encoded for navigation, so "Indian Elephant" will become "Indian%20Elephant".

Para recibir datos, la clase que representa la página a la que se navega, o la clase de BindingContext de la página, se debe decorar con un elemento QueryPropertyAttribute para cada parámetro de consulta:To receive data, the class that represents the page being navigated to, or the class for the page's BindingContext, must be decorated with a QueryPropertyAttribute for each query parameter:

[QueryProperty("Name", "name")]
public partial class ElephantDetailPage : ContentPage
{
    public string Name
    {
        set
        {
            BindingContext = ElephantData.Elephants.FirstOrDefault(m => m.Name == Uri.UnescapeDataString(value));
        }
    }
    ...
}

El primer argumento de QueryPropertyAttribute especifica el nombre de la propiedad que recibirá los datos, mientras que el segundo argumento especifica el identificador del parámetro de consulta. Por tanto, el elemento QueryPropertyAttribute del ejemplo anterior especifica que la propiedad Name recibirá los datos pasados al parámetro de consulta name del URI en la llamada al método GoToAsync.The first argument for the QueryPropertyAttribute specifies the name of the property that will receive the data, with the second argument specifying the query parameter id. Therefore, the QueryPropertyAttribute in the above example specifies that the Name property will receive the data passed in the name query parameter from the URI in the GoToAsync method call. La propiedad Name decodifica entonces el valor del parámetro de consulta en una dirección URL y lo usa para establecer el objeto BindingContext de la página en el objeto que se mostrará.The Name property then URL decodes the query parameter value, and uses it to set the BindingContext of the page to the object that will be displayed.

Nota

Una clase se puede representar con varios objetos QueryPropertyAttribute.A class can be decorated with multiple QueryPropertyAttribute objects.

Comportamiento del botón AtrásBack button behavior

La clase BackButtonBehavior define las siguientes propiedades que controlan la apariencia y el comportamiento del botón Atrás:The BackButtonBehavior class defines the following properties that control back button appearance and behavior:

  • Command, de tipo ICommand, que se ejecuta cuando se presiona el botón Atrás.Command, of type ICommand, which is executed when the back button is pressed.
  • CommandParameter, de tipo object, que es el parámetro que se pasa a Command.CommandParameter, of type object, which is the parameter that's passed to the Command.
  • IconOverride, de tipo ImageSource, el icono usado para el botón Atrás.IconOverride, of type ImageSource, the icon used for the back button.
  • IsEnabled, de tipo boolean, indica si se ha habilitado el botón Atrás.IsEnabled, of type boolean, indicates whether the back button is enabled. El valor predeterminado es true.The default value is true.
  • TextOverride, de tipo string, el texto usado para el botón Atrás.TextOverride, of type string, the text used for the back button.

Todas estas propiedades están respaldados por objetos BindableProperty, lo que significa que las propiedades pueden ser destinos de los enlaces de datos.All of these properties are backed by BindableProperty objects, which means that the properties can be targets of data bindings.

La clase BackButtonBehavior se puede consumir mediante el establecimiento de la propiedad adjunta Shell.BackButtonBehavior a un objeto BackButtonBehavior:The BackButtonBehavior class can be consumed by setting the Shell.BackButtonBehavior attached property to a BackButtonBehavior object:

<ContentPage ...>    
    <Shell.BackButtonBehavior>
        <BackButtonBehavior Command="{Binding BackCommand}"
                            IconOverride="back.png" />   
    </Shell.BackButtonBehavior>
    ...
</ContentPage>

El código de C# equivalente es el siguiente:The equivalent C# code is:

Shell.SetBackButtonBehavior(this, new BackButtonBehavior
{
    Command = new Command(() =>
    {
        ...
    }),
    IconOverride = "back.png"
});

La propiedad Command se establece en ICommand para ejecutarse cuando se presiona el botón Atrás, y la propiedad IconOverride se establece en el icono que se usa para el botón Atrás:The Command property is set to an ICommand to be executed when the back button is pressed, and the IconOverride property is set to the icon that's used for the back button:

Captura de pantalla de la invalidación de un icono de botón Atrás de Shell en iOS y AndroidScreenshot of a Shell back button icon override, on iOS and Android