Delen via


.NET MAUI Shell-navigatie

bladervoorbeeld. Door het voorbeeld bladeren

De Shell van .NET Multi-Platform App UI (.NET MAUI) biedt een navigatie-ervaring via URI's die gebruikmaakt van routes om naar elke pagina in de app te navigeren, zonder dat u een vastgelegde navigatiehiërarchie hoeft te volgen. Daarnaast biedt het ook de mogelijkheid om achteruit te navigeren zonder dat u alle pagina's op de navigatiestack hoeft te bezoeken.

De klasse Shell definieert de volgende navigatie-gerelateerde eigenschappen:

  • BackButtonBehavior, van het type BackButtonBehavior, een gekoppelde eigenschap waarmee het gedrag van de knop Vorige wordt gedefinieerd.
  • CurrentItem, van het type ShellItem, het geselecteerde item.
  • CurrentPage, van het type Page, de pagina die momenteel wordt weergegeven.
  • CurrentState, van het type ShellNavigationState, de huidige navigatiestatus van de Shell.
  • Current, van het type Shell, dat toegang biedt tot de huidige Shell.

De eigenschappen BackButtonBehavior, CurrentItemen CurrentState worden ondersteund door BindableProperty objecten, wat betekent dat deze eigenschappen doelen kunnen zijn van gegevensbindingen.

Navigatie wordt uitgevoerd door de methode GoToAsync aan te roepen vanuit de klasse Shell. Wanneer navigatie op het punt staat te worden uitgevoerd, wordt de Navigating gebeurtenis geactiveerd en wordt de Navigated gebeurtenis geactiveerd wanneer de navigatie is voltooid.

Notitie

Navigatie kan nog steeds worden uitgevoerd tussen pagina's in een Shell-app met behulp van de eigenschap Navigation. Zie Modusloze navigatieuitvoeren voor meer informatie.

Trajecten

Navigatie wordt uitgevoerd in een Shell-app door een URI op te geven waar u naartoe wilt navigeren. Navigatie-URI's kunnen drie onderdelen hebben:

  • Een route, waarmee het pad naar inhoud wordt gedefinieerd dat bestaat als onderdeel van de Shell-visualhiërarchie.
  • Een pagina. Pagina's die niet aanwezig zijn in de Shell-visualhiërarchie, kunnen vanaf elke locatie in een Shell-app naar de navigatiestack worden gepusht. Een detailpagina wordt bijvoorbeeld niet gedefinieerd in de Shell-visualhiërarchie, maar kan naar behoefte naar de navigatiestack worden gepusht.
  • Een of meer queryparameters. Queryparameters zijn parameters die kunnen worden doorgegeven aan de doelpagina tijdens het navigeren.

Wanneer een navigatie-URI alle drie de onderdelen bevat, is de structuur: //route/page?queryParameters

Routes registreren

Routes kunnen worden gedefinieerd op FlyoutItem, TabBar, Taben ShellContent objecten, via hun Route eigenschappen:

<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>

Notitie

Aan alle items in de Shell-hiërarchie is een route gekoppeld. Als u geen route instelt, wordt er een gegenereerd tijdens runtime. Gegenereerde routes zijn echter niet gegarandeerd consistent in verschillende app-sessies.

In het bovenstaande voorbeeld wordt de volgende routehiërarchie gemaakt, die kan worden gebruikt in programmatische navigatie:

animals
  domestic
    cats
    dogs
  monkeys
  elephants
  bears
about

Om naar het ShellContent-object voor de route dogs te navigeren, is de absolute route-URI //animals/domestic/dogs. Evenzo is de absolute route-URI om naar het ShellContent-object voor de about route te navigeren, //about.

Waarschuwing

Er wordt een ArgumentException gegenereerd bij het opstarten van de app als er een dubbele route wordt gedetecteerd. Deze uitzondering wordt ook gegenereerd als twee of meer routes op hetzelfde niveau in de hiërarchie een routenaam delen.

Routes voor detailpagina registreren

In de constructor van de Shell-subklasse, of op een andere plaats die wordt uitgevoerd voordat een route wordt aangeroepen, kunnen aanvullende routes expliciet worden geregistreerd voor detailpagina's die niet in de visuele hiërarchie van de Shell worden weergegeven. Dit wordt bereikt met de Routing.RegisterRoute methode:

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

In dit voorbeeld worden detailpagina's geregistreerd die niet zijn gedefinieerd in de subklasse Shell, als routes. Deze detailpagina's kunnen vervolgens overal binnen de app worden bereikt door middel van URI-gebaseerde navigatie. De routes voor dergelijke pagina's worden globale routesgenoemd.

Waarschuwing

Er wordt een ArgumentException gegenereerd als de Routing.RegisterRoute methode probeert dezelfde route naar twee of meer verschillende typen te registreren.

U kunt ook pagina's registreren bij verschillende routehiërarchieën, indien nodig:

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

Dit voorbeeld maakt contextuele paginanavigatie mogelijk, waarbij het navigeren naar de details route vanaf de pagina voor de monkeys route het MonkeyDetailPageweergeeft. Op dezelfde manier wordt de ElephantDetailPageweergegeven wanneer u vanaf de pagina van de elephants route naar de details route navigeert. Zie Contextuele navigatievoor meer informatie.

Notitie

Pagina's waarvan de routes zijn geregistreerd bij de Routing.RegisterRoute methode, kunnen indien nodig worden gederegistereerd met de methode Routing.UnRegisterRoute.

Navigatie uitvoeren

Als u navigatie wilt uitvoeren, moet eerst een verwijzing naar de subklasse Shell worden verkregen. Deze verwijzing kan worden verkregen via de Shell.Current eigenschap. Navigatie kan vervolgens worden uitgevoerd door de methode GoToAsync aan te roepen op het Shell-object. Deze methode navigeert naar een ShellNavigationState en retourneert een Task die wordt voltooid wanneer de navigatieanimatie is afgerond. Het ShellNavigationState-object wordt samengesteld door de methode GoToAsync, van een stringof een Uri, en de eigenschap Location is ingesteld op het argument string of Uri.

Belangrijk

Wanneer er naar een route binnen de Shell-visualhiërarchie wordt genavigeerd, wordt er geen navigatiestack gemaakt. Wanneer echter een pagina die zich niet in de Shell-visualhiërarchie bevindt, naartoe wordt genavigeerd, wordt er een navigatiestack gemaakt.

De huidige navigatiestatus van het Shell-object kan worden opgehaald via de eigenschap Shell.Current.CurrentState, waaronder de URI van de weergegeven route in de eigenschap Location.

Absolute routes

Navigatie kan worden uitgevoerd door een geldige absolute URI op te geven als argument voor de methode GoToAsync:

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

In dit voorbeeld wordt naar de pagina voor de monkeys route genavigeerd, waarbij de route wordt gedefinieerd op een ShellContent-object. Het ShellContent-object dat de monkeys route vertegenwoordigt, is een onderliggend element van een FlyoutItem-object, waarvan de route animalsis.

Waarschuwing

Absolute routes werken niet met pagina's die zijn geregistreerd bij de methode Routing.RegisterRoute.

Relatieve routes

Navigatie kan ook worden uitgevoerd door een geldige relatieve URI op te geven als argument voor de methode GoToAsync. Het routeringssysteem probeert de URI te koppelen aan een ShellContent-object. Dus als alle routes in een app uniek zijn, kan navigatie worden uitgevoerd door alleen de unieke routenaam op te geven als een relatieve URI.

In het volgende voorbeeld gaat u naar de pagina voor de monkeydetails route:

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

In dit voorbeeld wordt de monkeyDetails route gezocht totdat de overeenkomende pagina is gevonden. Wanneer de pagina wordt gevonden, wordt deze naar de navigatiestack gepusht.

Waarschuwing

Relatieve routes werken niet met pagina's die zijn gedefinieerd in een onderklasse van de Shell-klasse, wat doorgaans de AppShell.xamlis. In plaats daarvan kunnen alleen pagina's die zijn geregistreerd bij de methode Routing.RegisterRoute worden gepusht naar de navigatiestack met behulp van relatieve routes. Zie de detailpagina over registerroutes voor meer informatie .

Contextuele navigatie

Relatieve routes maken contextuele navigatie mogelijk. Denk bijvoorbeeld aan de volgende routehiërarchie:

monkeys
  details
bears
  details

Wanneer de geregistreerde pagina voor de monkeys route wordt weergegeven, wordt de geregistreerde pagina voor de monkeys/details route weergegeven wanneer u naar de details route navigeert. Wanneer de geregistreerde pagina voor de bears route wordt weergegeven, wordt de geregistreerde pagina voor de bears/details route weergegeven wanneer u naar de details route navigeert. Voor meer informatie over het registreren van de routes in dit voorbeeld, zie Paginaroutes registreren.

Navigatie naar achteren

Achterwaartse navigatie kan worden uitgevoerd door '.' op te geven als argument voor de methode GoToAsync:

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

Achterwaartse navigatie met '.' kan ook worden gecombineerd met een route:

await Shell.Current.GoToAsync("../route");

In dit voorbeeld wordt achterwaartse navigatie uitgevoerd en vervolgens wordt de navigatie naar de opgegeven route uitgevoerd.

Belangrijk

Navigeren naar achteren en naar een opgegeven route is alleen mogelijk als de navigatie naar achteren u op de huidige locatie in de routehiërarchie plaatst om naar de opgegeven route te navigeren.

Op dezelfde manier is het mogelijk om meerdere keren naar achteren te navigeren en vervolgens naar een opgegeven route te navigeren:

await Shell.Current.GoToAsync("../../route");

In dit voorbeeld wordt achterwaartse navigatie tweemaal uitgevoerd en vervolgens wordt de navigatie naar de opgegeven route uitgevoerd.

Daarnaast kunnen gegevens worden doorgegeven via query-eigenschappen wanneer u achteruit navigeert:

await Shell.Current.GoToAsync($"..?parameterToPassBack={parameterValueToPassBack}");

In dit voorbeeld wordt navigatie achterwaarts uitgevoerd en wordt de queryparameterwaarde doorgegeven aan de queryparameter op de vorige pagina.

Notitie

Queryparameters kunnen worden toegevoegd aan elke achterwaartse navigatieaanvraag.

Zie Gegevens doorgevenvoor meer informatie over het doorgeven van gegevens tijdens het navigeren.

Ongeldige routes

De volgende routeindelingen zijn ongeldig:

Formaat Uitleg
// pagina of ///pagina Globale routes kunnen momenteel niet de enige pagina in de navigatiestack zijn. Daarom wordt absolute routering naar globale routes niet ondersteund.

Het gebruik van deze routeindelingen resulteert in het werpen van een Exception.

Waarschuwing

Een poging om naar een niet-bestaande route te navigeren, resulteert in een ArgumentException uitzondering die wordt gegenereerd.

Navigatie voor foutopsporing

Sommige Shell-klassen zijn ingericht met de DebuggerDisplayAttribute, waarmee wordt aangegeven hoe een klasse of veld wordt weergegeven door het foutopsporingsprogramma. Dit kan helpen bij het opsporen van fouten in navigatieaanvragen door gegevens weer te geven die betrekking hebben op de navigatieaanvraag. In de volgende schermopname ziet u bijvoorbeeld de eigenschappen CurrentItem en CurrentState van het Shell.Current-object:

schermopname van het foutopsporingsprogramma.

In dit voorbeeld geeft de eigenschap CurrentItem van het type FlyoutItemde titel en route van het FlyoutItem-object weer. Op dezelfde manier geeft de eigenschap CurrentState van het type ShellNavigationStatede URI weer van de weergegeven route in de Shell-app.

De Tab-klasse definieert een Stack eigenschap van het type IReadOnlyList<Page>, die de huidige navigatiestack in de Tabvertegenwoordigt. De klasse biedt ook de volgende overschrijfbare navigatiemethoden:

  • GetNavigationStack, retourneert IReadOnlyList<Page>, de huidige navigatiestack.
  • OnInsertPageBeforewordt aangeroepen wanneer INavigation.InsertPageBefore wordt aangeroepen.
  • OnPopAsync, retourneert Task<Page>en wordt aangeroepen wanneer INavigation.PopAsync wordt aangeroepen.
  • OnPopToRootAsync, retourneert Tasken wordt aangeroepen wanneer INavigation.OnPopToRootAsync wordt aangeroepen.
  • OnPushAsync, retourneert Tasken wordt aangeroepen wanneer INavigation.PushAsync wordt aangeroepen.
  • Wanneer INavigation.RemovePage wordt aangeroepen, wordt ook OnRemovePageaangeroepen.

In het volgende voorbeeld ziet u hoe u de methode OnRemovePage overschrijft:

public class MyTab : Tab
{
    protected override void OnRemovePage(Page page)
    {
        base.OnRemovePage(page);

        // Custom logic
    }
}

In dit voorbeeld moeten MyTab-objecten worden gebruikt in uw Shell-visuele hiërarchie in plaats van Tab-objecten.

De Shell-klasse definieert de Navigating gebeurtenis, die wordt geactiveerd wanneer navigatie op het punt staat te worden uitgevoerd, hetzij vanwege programmatische navigatie of gebruikersinteractie. Het ShellNavigatingEventArgs-object dat bij de Navigating gebeurtenis hoort, bevat de volgende eigenschappen:

Eigendom Type Beschrijving
Current ShellNavigationState De URI van de huidige pagina.
Source ShellNavigationSource Het type navigatie dat heeft plaatsgevonden.
Target ShellNavigationState De URI die aangeeft waar de navigatie is bestemd.
CanCancel bool Een waarde die aangeeft of het mogelijk is om de navigatie te annuleren.
Cancelled bool Een waarde die aangeeft of de navigatie is geannuleerd.

Bovendien biedt de ShellNavigatingEventArgs-klasse een Cancel methode die kan worden gebruikt om navigatie te annuleren en een GetDeferral methode die een ShellNavigatingDeferral token retourneert dat kan worden gebruikt om de navigatie te voltooien. Voor meer informatie over navigatie-uitstel, zie Navigatie-uitstel.

De Shell-klasse definieert ook de Navigated gebeurtenis, die wordt geactiveerd wanneer de navigatie is voltooid. Het ShellNavigatedEventArgs-object dat bij de Navigated gebeurtenis hoort, bevat de volgende eigenschappen:

Eigendom Type Beschrijving
Current ShellNavigationState De URI van de huidige pagina.
Previous ShellNavigationState De URI van de vorige pagina.
Source ShellNavigationSource Het type navigatie dat is gebruikt.

Belangrijk

De methode OnNavigating wordt aangeroepen wanneer de Navigating gebeurtenis wordt geactiveerd. Op dezelfde manier wordt de methode OnNavigated aangeroepen wanneer de Navigated gebeurtenis wordt geactiveerd. Beide methoden kunnen worden aangepast in uw Shell subklasse om navigatieaanvragen te onderscheppen.

De klassen ShellNavigatedEventArgs en ShellNavigatingEventArgs hebben beide Source eigenschappen, van het type ShellNavigationSource. Deze opsomming bevat de volgende waarden:

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

Daarom kan navigatie worden onderschept met een OnNavigating overschrijving en kunnen acties worden uitgevoerd op basis van de navigatiebron. In de volgende code ziet u bijvoorbeeld hoe u navigatie naar achteren annuleert als de gegevens op de pagina niet zijn opgeslagen:

protected override void OnNavigating(ShellNavigatingEventArgs args)
{
    base.OnNavigating(args);

    // Cancel any back navigation.
    if (args.Source == ShellNavigationSource.Pop)
    {
        args.Cancel();
    }
}

Shell-navigatie kan worden onderschept en voltooid of geannuleerd op basis van de gebruikerskeuze. Dit kan worden bereikt door de OnNavigating methode in uw Shell subklasse te overschrijven en door de methode GetDeferral aan te roepen voor het ShellNavigatingEventArgs-object. Deze methode retourneert een ShellNavigatingDeferral token met een Complete methode, die kan worden gebruikt om de navigatieaanvraag te voltooien:

public MyShell : Shell
{
    // ...
    protected override async void OnNavigating(ShellNavigatingEventArgs args)
    {
        base.OnNavigating(args);

        ShellNavigatingDeferral token = args.GetDeferral();

        var result = await DisplayActionSheet("Navigate?", "Cancel", "Yes", "No");
        if (result != "Yes")
        {
            args.Cancel();
        }
        token.Complete();
    }    
}

In dit voorbeeld wordt een actieblad weergegeven waarin de gebruiker wordt uitgenodigd om de navigatieaanvraag te voltooien of deze te annuleren. Navigatie wordt geannuleerd door de methode Cancel aan te roepen op het ShellNavigatingEventArgs-object. Navigatie wordt voltooid door de methode Complete aan te roepen op het ShellNavigatingDeferral token dat is opgehaald door de GetDeferral methode op het ShellNavigatingEventArgs-object.

Waarschuwing

De methode GoToAsync genereert een InvalidOperationException als een gebruiker probeert te navigeren terwijl er een uitstel voor navigatie in behandeling is.

Gegevens doorgeven

Primitieve gegevens kunnen worden doorgegeven als queryparameters op basis van tekenreeksen bij het uitvoeren van programmatische navigatie op basis van URI. Dit wordt bereikt door ? toe te voegen na een route, gevolgd door een queryparameter-id, =en een waarde:

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

In dit voorbeeld wordt de momenteel geselecteerde olifant opgehaald in de CollectionView, en wordt er genavigeerd naar de elephantdetails route met elephantName als queryparameter.

Navigatiegegevens op basis van meerdere gebruiksobjecten doorgeven

Navigatiegegevens op basis van meerdere gebruiksobjecten kunnen worden doorgegeven met een GoToAsync overbelasting waarmee een IDictionary<string, object> argument wordt opgegeven:

async void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Animal animal = e.CurrentSelection.FirstOrDefault() as Animal;
    var navigationParameter = new Dictionary<string, object>
    {
        { "Bear", animal }
    };
    await Shell.Current.GoToAsync($"beardetails", navigationParameter);
}

In dit voorbeeld wordt de momenteel geselecteerde beer opgehaald in de CollectionViewals een Animal. Het Animal-object wordt toegevoegd aan een Dictionary met de sleutel Bear. Vervolgens wordt navigatie naar de beardetails route uitgevoerd, waarbij de Dictionary wordt doorgegeven als navigatieparameter.

Alle gegevens die als een IDictionary<string, object> argument worden doorgegeven, worden gedurende de levensduur van de pagina bewaard in het geheugen en worden pas vrijgegeven als de pagina uit de navigatiestack wordt verwijderd. Dit kan problematisch zijn, zoals wordt weergegeven in het volgende scenario:

  1. Page1 navigeert naar Page2 met behulp van de methode GoToAsync, waarbij een object met de naam MyDatawordt doorgegeven. Page2 ontvangt vervolgens MyData als queryparameter.
  2. Page2 navigeert naar Page3 met behulp van de methode GoToAsync, zonder gegevens door te geven.
  3. Page3 navigeert achteruit met de GoToAsync-methode. Page2 ontvangt MyData opnieuw als queryparameter.

Hoewel dit in veel scenario's wenselijk is, moet u, als het niet gewenst is, het argument IDictionary<string, object> wissen met de methode Clear nadat het voor het eerst door een pagina is ontvangen.

Navigatiegegevens gebaseerd op enkelvoudig te gebruiken objecten doorgeven

Eenmalig te gebruiken objectgebaseerde navigatiegegevens kunnen worden doorgegeven met een GoToAsync-overload die een ShellNavigationQueryParameters-argument aangeeft. Een ShellNavigationQueryParameters-object is bedoeld voor navigatiegegevens voor eenmalig gebruik die worden gewist nadat de navigatie is uitgevoerd. In het volgende voorbeeld ziet u navigeren tijdens het doorgeven van gegevens voor eenmalig gebruik:

async void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
    Animal animal = e.CurrentSelection.FirstOrDefault() as Animal;
    var navigationParameter = new ShellNavigationQueryParameters
    {
        { "Bear", animal }
    };
    await Shell.Current.GoToAsync($"beardetails", navigationParameter);
}

In dit voorbeeld wordt de momenteel geselecteerde beer opgehaald in de CollectionView, als een Animal die wordt toegevoegd aan het ShellNavigationQueryParameters-object. Vervolgens wordt de navigatie naar de beardetails route uitgevoerd, waarbij het ShellNavigationQueryParameters-object wordt doorgegeven als navigatieparameter. Nadat de navigatie heeft plaatsgevonden, worden de gegevens in het ShellNavigationQueryParameters-object gewist.

Navigatiegegevens ontvangen

Er zijn twee benaderingen voor het ontvangen van navigatiegegevens:

  1. De klasse waarmee de pagina wordt aangegeven waarnaar wordt genavigeerd, of de klasse voor de BindingContextvan de pagina, kan worden ingericht met een QueryPropertyAttribute voor elke queryparameter. Voor meer informatie, zie Navigatiegegevens verwerken met behulp van query-eigenschap attributen.
  2. De klasse waarmee de pagina wordt aangegeven waarnaar wordt genavigeerd, of de klasse voor de BindingContextvan de pagina, kan de IQueryAttributable-interface implementeren. Zie Navigatiegegevens verwerken met één methodevoor meer informatie.

Navigatiegegevens verwerken met behulp van eigenschappenkenmerken van query's

Navigatiegegevens kunnen worden ontvangen door de ontvangende klasse te decoreren met een QueryPropertyAttribute voor elke queryparameter op basis van tekenreeksen, navigatieparameter op basis van objecten of ShellNavigationQueryParameters object:

[QueryProperty(nameof(Bear), "Bear")]
public partial class BearDetailPage : ContentPage
{
    Animal bear;
    public Animal Bear
    {
        get => bear;
        set
        {
            bear = value;
            OnPropertyChanged();
        }
    }

    public BearDetailPage()
    {
        InitializeComponent();
        BindingContext = this;
    }
}

In dit voorbeeld geeft het eerste argument voor de QueryPropertyAttribute de naam op van de eigenschap die de gegevens ontvangt, met het tweede argument waarmee de parameter-id wordt opgegeven. Daarom geeft de QueryPropertyAttribute in het bovenstaande voorbeeld aan dat de eigenschap Bear de gegevens ontvangt die worden doorgegeven in de Bear navigatieparameter in de aanroep van de GoToAsync methode.

Belangrijk

Tekenreeks-gebaseerde queryparameterwaarden die via de QueryPropertyAttribute worden ontvangen, worden automatisch URL-gedecodeerd.

Waarschuwing

Het ontvangen van navigatiegegevens met behulp van de QueryPropertyAttribute is niet trim-safe en mag niet worden gebruikt met volledige trimoptimalisatie of NativeAOT. In plaats daarvan moet u de IQueryAttributable-interface implementeren voor typen die queryparameters moeten accepteren. Voor meer informatie, zie Navigatiegegevens van processen met behulp van één methode, Een .NET MAUI-app bijsnijdenen native AOT-implementatie.

Navigatiegegevens verwerken met één methode

Navigatiegegevens kunnen worden ontvangen door de IQueryAttributable-interface op de ontvangende klasse te implementeren. De IQueryAttributable-interface geeft aan dat de implementatieklasse de methode ApplyQueryAttributes moet implementeren. Deze methode heeft een query argument, van het type IDictionary<string, object>, dat gegevens bevat die tijdens de navigatie zijn doorgegeven. Elke sleutel in de woordenlijst is een queryparameter-id, met de waarde die overeenkomt met het object dat de gegevens vertegenwoordigt. Het voordeel van het gebruik van deze methode is dat navigatiegegevens kunnen worden verwerkt met één methode, wat handig kan zijn wanneer u meerdere items met navigatiegegevens hebt die als geheel moeten worden verwerkt.

In het volgende voorbeeld ziet u een weergavemodelklasse waarmee de IQueryAttributable-interface wordt geïmplementeerd:

public class MonkeyDetailViewModel : IQueryAttributable, INotifyPropertyChanged
{
    public Animal Monkey { get; private set; }

    public void ApplyQueryAttributes(IDictionary<string, object> query)
    {
        Monkey = query["Monkey"] as Animal;
        OnPropertyChanged("Monkey");
    }
    ...
}

In dit voorbeeld haalt de ApplyQueryAttributes methode het object op dat overeenkomt met de Monkey sleutel in de query woordenlijst, die is doorgegeven als een argument voor de aanroep van de GoToAsync methode.

Belangrijk

Queryparameterwaarden op basis van tekenreeksen die worden ontvangen via de IQueryAttributable-interface, worden niet automatisch door url's gedecodeerd.

Meerdere gegevensitems doorgeven en verwerken

Meerdere queryparameters op basis van tekenreeksen kunnen worden doorgegeven door ze te verbinden met &. De volgende code geeft bijvoorbeeld twee gegevensitems door:

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

In dit codevoorbeeld wordt de momenteel geselecteerde olifant opgehaald in de CollectionViewen wordt genavigeerd naar de elephantdetails-route, waarbij elephantName en elephantLocation als queryparameters worden doorgegeven.

Als u meerdere gegevensitems wilt ontvangen, kan de klasse waarmee de pagina wordt aangegeven waarnaar wordt genavigeerd, of de klasse voor de BindingContextvan de pagina, worden ingericht met een QueryPropertyAttribute voor elke queryparameter op basis van tekenreeksen:

[QueryProperty(nameof(Name), "name")]
[QueryProperty(nameof(Location), "location")]
public partial class ElephantDetailPage : ContentPage
{
    public string Name
    {
        set
        {
            // Custom logic
        }
    }

    public string Location
    {
        set
        {
            // Custom logic
        }
    }
    ...    
}

In dit voorbeeld is de klasse ingericht met een QueryPropertyAttribute voor elke queryparameter. De eerste QueryPropertyAttribute geeft aan dat de eigenschap Name de gegevens ontvangt die zijn doorgegeven in de name queryparameter, terwijl de tweede QueryPropertyAttribute aangeeft dat de eigenschap Location de gegevens ontvangt die zijn doorgegeven in de location queryparameter. In beide gevallen worden de queryparameterwaarden opgegeven in de URI in de GoToAsync methode-aanroep.

Waarschuwing

Het ontvangen van navigatiegegevens met behulp van de QueryPropertyAttribute is niet veilig voor bijsnijden en moet niet worden gebruikt in combinatie met volledige optimalisatie of NativeAOT. In plaats daarvan moet u de IQueryAttributable-interface implementeren voor typen die queryparameters moeten accepteren. Zie voor meer informatie Trim a .NET MAUI app en Native AOT deployment.

U kunt navigatiegegevens ook met één methode verwerken door de IQueryAttributable-interface te implementeren in de klasse waarmee de pagina wordt aangegeven waarnaar wordt genavigeerd, of de klasse voor de BindingContextvan de pagina:

public class ElephantDetailViewModel : IQueryAttributable, INotifyPropertyChanged
{
    public Animal Elephant { get; private set; }

    public void ApplyQueryAttributes(IDictionary<string, object> query)
    {
        string name = HttpUtility.UrlDecode(query["name"].ToString());
        string location = HttpUtility.UrlDecode(query["location"].ToString());
        ...        
    }
    ...
}

In dit voorbeeld haalt de ApplyQueryAttributes methode de waarde van de name en location queryparameters op uit de URI in de GoToAsync methode-aanroep.

Notitie

Queryparameters op basis van tekenreeksen en navigatieparameters op basis van objecten kunnen tegelijkertijd worden doorgegeven bij het uitvoeren van navigatie op basis van route.

Terugknopgedrag

Weergave en gedrag van de knop Terug kunnen opnieuw worden gedefinieerd door de eigenschap BackButtonBehavior gekoppeld aan een BackButtonBehavior-object in te stellen. De klasse BackButtonBehavior definieert de volgende eigenschappen:

  • Command, van het type ICommand, dat wordt uitgevoerd wanneer de knop terug wordt ingedrukt.
  • CommandParameter, van het type object, wat de parameter is die wordt doorgegeven aan de Command.
  • IconOverride, van het type ImageSource, is het pictogram dat wordt gebruikt voor de terugknop.
  • IsEnabled, van het type boolean, geeft aan of de terugknop is ingeschakeld. De standaardwaarde is true.
  • IsVisible, van het type boolean, geeft aan of de terugknop zichtbaar is. De standaardwaarde is true.
  • TextOverride, van het type string, de tekst die wordt gebruikt voor de knop Vorige.

Al deze eigenschappen worden ondersteund door BindableProperty objecten, wat betekent dat de eigenschappen doelen van gegevensbindingen kunnen zijn. Elke BindableProperty heeft een OneTime bindingsmodus, wat betekent dat gegevens van de bron naar het doel gaan, maar alleen wanneer de BindingContext wordt gewijzigd.

Al deze eigenschappen worden ondersteund door BindableProperty objecten, wat betekent dat de eigenschappen doelen van gegevensbindingen kunnen zijn. De Command-, CommandParameter-, IconOveride- en TextOverideBindableProperty-objecten hebben OneTime bindingsmodi, wat betekent dat gegevens van de bron naar het doel gaan, maar alleen wanneer de BindingContext wordt gewijzigd. De IsEnabled- en IsVisibleBindableProperty-objecten hebben OneWay bindingsmodi, wat betekent dat gegevens van de bron naar het doel gaan.

De volgende code toont een voorbeeld van het opnieuw definiëren van de weergave en het gedrag van de knop Terug:

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

De eigenschap Command is ingesteld op een ICommand die moet worden uitgevoerd wanneer de knop Terug wordt ingedrukt, en de eigenschap IconOverride is ingesteld op het pictogram dat wordt gebruikt voor de knop Terug.

Schermopname van het pictogram van een Shell-knop terug overschrijven.