.NET MAUI Shell-navigatie
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 typeShellItem
, het geselecteerde item. -
CurrentPage
, van het type Page, de pagina die momenteel wordt weergegeven. -
CurrentState
, van het typeShellNavigationState
, de huidige navigatiestatus van de Shell. -
Current
, van het type Shell, dat toegang biedt tot de huidige Shell.
De eigenschappen BackButtonBehavior, CurrentItem
en 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 MonkeyDetailPage
weergeeft. Op dezelfde manier wordt de ElephantDetailPage
weergegeven 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 string
of 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 animals
is.
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:
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 ShellNavigationState
de URI weer van de weergegeven route in de Shell-app.
Navigatiestack
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
, retourneertIReadOnlyList<Page>
, de huidige navigatiestack. -
OnInsertPageBefore
wordt aangeroepen wanneerINavigation.InsertPageBefore
wordt aangeroepen. -
OnPopAsync
, retourneertTask<Page>
en wordt aangeroepen wanneerINavigation.PopAsync
wordt aangeroepen. -
OnPopToRootAsync
, retourneertTask
en wordt aangeroepen wanneerINavigation.OnPopToRootAsync
wordt aangeroepen. -
OnPushAsync
, retourneertTask
en wordt aangeroepen wanneerINavigation.PushAsync
wordt aangeroepen. - Wanneer
INavigation.RemovePage
wordt aangeroepen, wordt ookOnRemovePage
aangeroepen.
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.
Navigatie-gebeurtenissen
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();
}
}
Uitstel van navigatie
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:
-
Page1
navigeert naarPage2
met behulp van de methode GoToAsync, waarbij een object met de naamMyData
wordt doorgegeven.Page2
ontvangt vervolgensMyData
als queryparameter. -
Page2
navigeert naarPage3
met behulp van de methode GoToAsync, zonder gegevens door te geven. -
Page3
navigeert achteruit met de GoToAsync-methode.Page2
ontvangtMyData
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:
- De klasse waarmee de pagina wordt aangegeven waarnaar wordt genavigeerd, of de klasse voor de
BindingContext
van de pagina, kan worden ingericht met een QueryPropertyAttribute voor elke queryparameter. Voor meer informatie, zie Navigatiegegevens verwerken met behulp van query-eigenschap attributen. - De klasse waarmee de pagina wordt aangegeven waarnaar wordt genavigeerd, of de klasse voor de
BindingContext
van 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 BindingContext
van 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 BindingContext
van 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 typeobject
, wat de parameter is die wordt doorgegeven aan deCommand
. -
IconOverride
, van het type ImageSource, is het pictogram dat wordt gebruikt voor de terugknop. -
IsEnabled
, van het typeboolean
, geeft aan of de terugknop is ingeschakeld. De standaardwaarde istrue
. -
IsVisible
, van het typeboolean
, geeft aan of de terugknop zichtbaar is. De standaardwaarde istrue
. -
TextOverride
, van het typestring
, 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 TextOveride
BindableProperty-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 IsVisible
BindableProperty-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.