Sdílet prostřednictvím


Navigace prostředí .NET MAUI

Projděte si ukázku. Procházení ukázky

Prostředí .NET Multi-Platform App UI (.NET MAUI) zahrnuje navigační prostředí založené na identifikátorech URI, které používá trasy k navigaci na libovolnou stránku v aplikaci, aniž by bylo nutné sledovat nastavenou navigační hierarchii. Kromě toho také poskytuje možnost přecházet zpět, aniž byste museli navštěvovat všechny stránky v navigačním zásobníku.

Třída Shell definuje následující vlastnosti související s navigacemi:

  • BackButtonBehavior, typu BackButtonBehavior, připojená vlastnost, která definuje chování tlačítka Zpět.
  • CurrentItem, typu ShellItem, aktuálně vybraná položka.
  • CurrentPage, typu Page, aktuálně prezentovaná stránka.
  • CurrentState, typu ShellNavigationState, aktuální navigační stav Shell.
  • Current, typu Shell, přetypovaný alias pro Application.Current.MainPage.

Objekty BackButtonBehaviora CurrentItemCurrentState vlastnosti jsou podporovány BindableProperty objekty, což znamená, že tyto vlastnosti mohou být cílem datových vazeb.

Navigace se provádí vyvoláním GoToAsync metody z Shell třídy. Když se chystáte provést navigaci, Navigating událost se aktivuje a Navigated událost se aktivuje po dokončení navigace.

Poznámka:

Navigace se dá dál provádět mezi stránkami v aplikaci Shell pomocí Navigation vlastnosti. Další informace naleznete v tématu Provádění bezmodální navigace.

Trasy

Navigace se provádí v aplikaci Prostředí zadáním identifikátoru URI, na který chcete přejít. Identifikátory URI navigace můžou mít tři komponenty:

  • Trasa, která definuje cestu k obsahu, který existuje jako součást hierarchie vizuálů prostředí.
  • Stránka. Stránky, které v hierarchii vizuálů prostředí neexistují, je možné do navigačního zásobníku odeslat odkudkoli v aplikaci Shell. Například stránka podrobností nebude definována v hierarchii vizuálů prostředí, ale můžete ji podle potřeby odeslat do navigačního zásobníku.
  • Jeden nebo více parametrů dotazu. Parametry dotazu jsou parametry, které lze předat na cílovou stránku při navigaci.

Pokud navigační identifikátor URI obsahuje všechny tři komponenty, struktura je: //route/page?queryParameters.

Registrace tras

Trasy lze definovat pro FlyoutItemobjekty , , TabBarTaba ShellContent to prostřednictvím jejich Route vlastností:

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

Poznámka:

Všechny položky v hierarchii prostředí mají přidruženou trasu. Pokud trasu nenastavíte, vygeneruje se za běhu. U generovaných tras ale není zaručeno, že budou konzistentní napříč různými relacemi aplikací.

Výše uvedený příklad vytvoří následující hierarchii tras, kterou lze použít v programové navigaci:

animals
  domestic
    cats
    dogs
  monkeys
  elephants
  bears
about

Chcete-li přejít k objektu ShellContent pro trasu dogs , absolutní identifikátor URI trasy je //animals/domestic/dogs. Podobně pokud chcete přejít k objektu ShellContent pro trasu about , absolutní identifikátor URI trasy je //about.

Upozorňující

Pokud ArgumentException se zjistí duplicitní trasa, vyvolá se při spuštění aplikace. Tato výjimka se vyvolá také v případě, že dvě nebo více tras na stejné úrovni v hierarchii sdílí název trasy.

Registrace tras stránky podrobností

V konstruktoru Shell podtřídy nebo v jakémkoli jiném umístění, které se spouští před vyvoláním trasy, je možné explicitně zaregistrovat další trasy pro všechny stránky podrobností, které nejsou reprezentovány v hierarchii vizuálů prostředí. To se provádí pomocí Routing.RegisterRoute metody:

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

Tento příklad registruje stránky podrobností, které nejsou definovány v Shell podtřídě jako trasy. Tyto stránky podrobností se pak dají procházet pomocí navigace založené na identifikátoru URI, a to odkudkoli v aplikaci. Trasy pro tyto stránky se označují jako globální trasy.

Upozorňující

Vyvolá se chyba ArgumentException , pokud Routing.RegisterRoute se metoda pokusí zaregistrovat stejnou trasu na dva nebo více různých typů.

Případně je možné stránky v případě potřeby zaregistrovat na různých hierarchiích tras:

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

Tento příklad umožňuje kontextovou navigaci na stránce, kde navigace na trasu details ze stránky pro trasu monkeys MonkeyDetailPagezobrazí . Podobně se zobrazí přechod na trasu details ze stránky trasy pro trasu elephants ElephantDetailPage. Další informace naleznete v tématu Kontextová navigace.

Poznámka:

Stránky, jejichž trasy byly zaregistrovány v Routing.RegisterRoute metodě, lze v případě potřeby zrušit registraci s metodou Routing.UnRegisterRoute .

Provádění navigace

Chcete-li provést navigaci, musí být nejprve získán odkaz na podtřídu Shell . Tento odkaz lze získat přetypováním App.Current.MainPage vlastnosti na Shell objekt nebo prostřednictvím Shell.Current vlastnosti. Navigaci pak lze provést voláním GoToAsync metody na objektu Shell . Tato metoda přejde na a ShellNavigationState vrátí Task , která se dokončí po dokončení animace navigace. Objekt ShellNavigationState je vytvořen metodou GoToAsync , z string, nebo Uri, a má jeho Location vlastnost nastavena string na hodnotu nebo Uri argument.

Důležité

Když se trasa z hierarchie vizuálů prostředí přepíná na, nevytvoří se zásobník navigace. Pokud se ale na stránku, která není v hierarchii vizuálů prostředí, přejde, vytvoří se navigační zásobník.

Aktuální stav navigace objektu Shell lze načíst prostřednictvím Shell.Current.CurrentState vlastnosti, která zahrnuje identifikátor URI zobrazené trasy ve Location vlastnosti.

Absolutní trasy

Navigaci lze provést zadáním platného absolutního identifikátoru URI jako argumentu metody GoToAsync :

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

Tento příklad přejde na stránku trasy s trasou monkeys definovanou v objektu ShellContent . Objekt ShellContent , který představuje trasu monkeys , je podřízeným objektem FlyoutItem , jehož trasa je animals.

Relativní trasy

Navigaci lze provést také zadáním platného relativního identifikátoru URI jako argumentu metody GoToAsync . Systém směrování se pokusí shodovat s identifikátorem URI objektu ShellContent . Proto pokud jsou všechny trasy v aplikaci jedinečné, lze navigaci provést pouze zadáním jedinečného názvu trasy jako relativního identifikátoru URI.

Podporují se následující relativní formáty tras:

Formát Popis
cesta Hierarchie tras bude prohledána zadanou trasou směrem nahoru od aktuální pozice. Odpovídající stránka se odešle do navigačního zásobníku.
/cesta Hierarchie tras bude prohledána ze zadané trasy směrem dolů od aktuální pozice. Odpovídající stránka se odešle do navigačního zásobníku.
//cesta Hierarchie tras bude prohledána zadanou trasou směrem nahoru od aktuální pozice. Odpovídající stránka nahradí zásobník navigace.
///cesta Hierarchie tras bude prohledána zadanou trasu směrem dolů od aktuální pozice. Odpovídající stránka nahradí zásobník navigace.

Následující příklad přejde na stránku trasy monkeydetails :

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

V tomto příkladu monkeyDetails se trasa vyhledá v hierarchii, dokud nenajde odpovídající stránku. Po nalezení stránky se nasdílí do navigačního zásobníku.

Kontextová navigace

Relativní trasy umožňují kontextovou navigaci. Představte si například následující hierarchii tras:

monkeys
  details
bears
  details

Když se zobrazí registrovaná stránka pro trasu monkeys , zobrazí se při přechodu na details trasu registrovaná stránka pro trasu monkeys/details . Podobně když se zobrazí registrovaná stránka pro trasu bears , zobrazí se při přechodu na details trasu registrovaná stránka pro trasu bears/details . Informace o tom, jak v tomto příkladu zaregistrovat trasy, najdete v tématu Registrace tras stránky.

Zpětná navigace

Zpětnou navigaci lze provést zadáním "." jako argumentu GoToAsync metody:

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

Zpětná navigace s "." lze také kombinovat s trasou:

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

V tomto příkladu se provede zpětná navigace a pak přejde na zadanou trasu.

Důležité

Navigace zpět a do zadané trasy je možná pouze v případě, že zpětná navigace umístí vás na aktuální místo v hierarchii tras a přejde na zadanou trasu.

Podobně je možné několikrát přecházet zpět a pak přejít na zadanou trasu:

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

V tomto příkladu se zpětná navigace provádí dvakrát a pak navigace na zadanou trasu.

Kromě toho je možné data předávat prostřednictvím vlastností dotazu při procházení dozadu:

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

V tomto příkladu se provede zpětná navigace a hodnota parametru dotazu se předá parametru dotazu na předchozí stránce.

Poznámka:

Parametry dotazu je možné připojit k jakémukoli zpětnému navigačnímu požadavku.

Další informace o předávání dat při navigaci naleznete v tématu Předávání dat.

Neplatné trasy

Následující formáty tras jsou neplatné:

Formát Vysvětlení
//nebo ///page Globální trasy momentálně nemůžou být jedinou stránkou v navigačním zásobníku. Proto absolutní směrování na globální trasy není podporováno.

Použití těchto formátů tras způsobí Exception vyvolání.

Upozorňující

Při pokusu o přechod na neexistující trasu ArgumentException dojde k vyvolání výjimky.

Ladění navigace

Některé třídy prostředí jsou zdobeny DebuggerDisplayAttribute, který určuje, jak třída nebo pole je zobrazen ladicí program. To může pomoct ladit požadavky navigace zobrazením dat souvisejících s navigačním požadavkem. Například následující snímek obrazovky ukazuje CurrentItem a CurrentState vlastnosti objektu Shell.Current :

Snímek obrazovky ladicího programu

V tomto příkladu vlastnost CurrentItem typu FlyoutItem, zobrazí název a trasu objektu FlyoutItem . CurrentState Podobně vlastnost typu ShellNavigationState, zobrazí identifikátor URI zobrazené trasy v rámci aplikace Shell.

Třída Tab definuje vlastnost typu IReadOnlyList<Page>, která představuje aktuální navigační zásobník v rámci TabStack . Třída také poskytuje následující přepisovatelné navigační metody:

  • GetNavigationStack, vrátí IReadOnlyList<Page>aktuální navigační zásobník.
  • OnInsertPageBeforevolá se, když INavigation.InsertPageBefore je volána.
  • OnPopAsync, vrátí Task<Page>a je volána při INavigation.PopAsync zavolání.
  • OnPopToRootAsync, vrátí Taska je volána při INavigation.OnPopToRootAsync zavolání.
  • OnPushAsync, vrátí Taska je volána při INavigation.PushAsync zavolání.
  • OnRemovePagevolá se, když INavigation.RemovePage je volána.

Následující příklad ukazuje, jak přepsat metodu OnRemovePage :

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

        // Custom logic
    }
}

V tomto příkladu MyTab by se objekty měly využívat v hierarchii vizuálů prostředí místo Tab objektů.

Třída Shell definuje Navigating událost, která se aktivuje při spuštění navigace, a to buď kvůli programové navigaci nebo interakci uživatele. Objekt ShellNavigatingEventArgs , který doprovází Navigating událost, poskytuje následující vlastnosti:

Vlastnost Type Popis
Current ShellNavigationState Identifikátor URI aktuální stránky.
Source ShellNavigationSource Typ navigace, ke kterému došlo.
Target ShellNavigationState Identifikátor URI představující umístění navigace.
CanCancel bool Hodnota označující, jestli je možné zrušit navigaci.
Cancelled bool Hodnota označující, jestli byla navigace zrušena.

Kromě toho třída poskytuje metoduCancel, ShellNavigatingEventArgs kterou lze použít ke zrušení navigace, a GetDeferral metoda, která vrací ShellNavigatingDeferral token, který lze použít k dokončení navigace. Další informace o odložení navigace najdete v tématu Odložení navigace.

Třída Shell také definuje Navigated událost, která se aktivuje po dokončení navigace. Objekt ShellNavigatedEventArgs , který doprovází Navigated událost, poskytuje následující vlastnosti:

Vlastnost Type Popis
Current ShellNavigationState Identifikátor URI aktuální stránky.
Previous ShellNavigationState Identifikátor URI předchozí stránky.
Source ShellNavigationSource Typ navigace, ke kterému došlo.

Důležité

Metoda OnNavigating se volá, když se Navigating událost aktivuje. OnNavigated Podobně se volá metoda, když se Navigated událost aktivuje. Obě metody je možné přepsat v Shell podtřídě za účelem zachycení požadavků na navigaci.

Obě ShellNavigatedEventArgs třídy mají Source vlastnosti typu ShellNavigationSource.ShellNavigatingEventArgs Tento výčet poskytuje následující hodnoty:

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

Proto lze navigaci zachytit v OnNavigating přepsání a akce lze provádět na základě zdroje navigace. Následující kód například ukazuje, jak zrušit zpětnou navigaci, pokud jsou data na stránce neuložené:

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

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

Navigace v prostředí může být zachycena a dokončena nebo zrušena na základě volby uživatele. Toho lze dosáhnout přepsáním OnNavigating metody v Shell podtřídě a voláním GetDeferral metody na objektu ShellNavigatingEventArgs . Tato metoda vrátí ShellNavigatingDeferral token, který má metodu Complete , kterou lze použít k dokončení požadavku navigace:

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

V tomto příkladu se zobrazí seznam akcí, který uživatele vyzve k dokončení žádosti o navigaci nebo ji zruší. Navigace je zrušena vyvoláním Cancel metody v objektu ShellNavigatingEventArgs . Navigace je dokončena vyvoláním Complete metody na ShellNavigatingDeferral tokenu, který byla načtena metodou GetDeferral objektu ShellNavigatingEventArgs .

Upozorňující

Metoda GoToAsync vyvolá InvalidOperationException výjimku, pokud se uživatel pokusí přejít, pokud existuje čekající odložení navigace.

Předání dat

Primitivní data lze předat jako parametry dotazu založené na řetězci při provádění programové navigace založené na identifikátoru URI. Toho dosáhnete připojením ? za trasou, za kterou následuje ID =parametru dotazu a hodnotou:

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

Tento příklad načte aktuálně vybraný slon v objektu CollectionViewa přejde na trasu elephantdetails , která se předává elephantName jako parametr dotazu.

Předání více použití navigačních dat založených na objektech

Více použití objektových navigačních dat lze předat s GoToAsync přetížením, které určuje IDictionary<string, object> argument:

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

Tento příklad načte aktuálně vybraného medvěda v objektu CollectionView, jako .Animal Objekt Animal se přidá do Dictionary klíče Bear. Pak se provede navigace na trasu beardetails s předávanou Dictionary jako navigační parametr.

Všechna data, která se předávají jako IDictionary<string, object> argument, se uchovávají v paměti po celou dobu životnosti stránky a nevyvolají se, dokud se stránka neodebere ze zásobníku navigace. To může být problematické, jak je znázorněno v následujícím scénáři:

  1. Page1 přejde pomocí Page2 GoToAsync metody a předává objekt s názvem MyData. Page2 pak obdrží MyData jako parametr dotazu.
  2. Page2 přejde k Page3 použití GoToAsync metody bez předání jakýchkoli dat.
  3. Page3 přechádí zpět metodou GoToAsync . Page2 pak se znovu přijme MyData jako parametr dotazu.

I když je to žádoucí v mnoha scénářích, pokud to není žádoucí, měli byste argument s metodou Clear vymazatIDictionary<string, object>, jakmile ji stránka poprvé přijala.

Předání navigačních dat založených na objektech s jedním použitím

Jedno použití objektových navigačních dat lze předat přetížením GoToAsync , které určuje ShellNavigationQueryParameters argument. Objekt ShellNavigationQueryParameters je určený pro jedno použití navigačních dat, která jsou po dokončení navigace vymazána. Následující příklad ukazuje navigaci při předávání dat s jedním použitím:

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

Tento příklad načte aktuálně vybraného medvěda v objektu CollectionView, který Animal je přidán do objektu ShellNavigationQueryParameters . Pak se provede navigace na trasu beardetails ShellNavigationQueryParameters s objektem předaným jako navigační parametr. Po navigaci dojde k vymazání dat v objektu ShellNavigationQueryParameters .

Příjem navigačních dat

K příjmu navigačních dat existují dva přístupy:

  1. Třída, která představuje stránku, na kterou se přechává, nebo třídu stránky BindingContext, lze dekorovat pomocí parametru QueryPropertyAttribute každého dotazu. Další informace naleznete v tématu Zpracování navigačních dat pomocí atributů vlastností dotazu.
  2. Třída, která představuje stránku, na kterou se prochází, nebo třída stránky BindingContext, může implementovat IQueryAttributable rozhraní. Další informace naleznete v tématu Zpracování navigačních dat pomocí jedné metody.

Zpracování navigačních dat pomocí atributů vlastností dotazu

Navigační data lze přijmout dekorací přijímající třídy s parametrem QueryPropertyAttribute dotazu založeným na řetězci, parametrem navigace na objektu nebo ShellNavigationQueryParameters objektem:

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

V tomto příkladu první argument pro QueryPropertyAttribute určuje název vlastnosti, která obdrží data, s druhým argumentem určujícím ID parametru. Proto výše uvedený příklad určuje, QueryPropertyAttribute že Bear vlastnost obdrží data předaná v Bear navigačním parametru GoToAsync volání metody.

Důležité

Hodnoty parametrů dotazu založené na řetězci, které jsou přijaty prostřednictvím adresy QueryPropertyAttribute URL, jsou automaticky dekódovány.

Upozorňující

Příjem navigačních dat pomocí QueryPropertyAttribute příkazu není bezpečný a neměl by se používat s úplným oříznutím ani nativním objektem AOT. Místo toho byste měli implementovat IQueryAttributable rozhraní u typů, které potřebují přijímat parametry dotazu. Další informace najdete v tématu Zpracování navigačních dat pomocí jedné metody, oříznutí aplikace .NET MAUI a nativního nasazení AOT.

Zpracování navigačních dat pomocí jedné metody

Navigační data lze přijmout implementací IQueryAttributable rozhraní v přijímající třídě. Rozhraní IQueryAttributable určuje, že implementovat třídu musí implementovat metodu ApplyQueryAttributes . Tato metoda má query argument typu IDictionary<string, object>, který obsahuje všechna data předaná během navigace. Každý klíč ve slovníku je ID parametru dotazu s jeho hodnotou odpovídající objektu, který představuje data. Výhodou tohoto přístupu je, že navigační data je možné zpracovat pomocí jedné metody, což může být užitečné, pokud máte více položek navigačních dat, které vyžadují zpracování jako celek.

Následující příklad ukazuje třídu modelu zobrazení, která implementuje IQueryAttributable rozhraní:

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

V tomto příkladu ApplyQueryAttributes metoda načte objekt, který odpovídá Monkey klíči ve query slovníku, který byl předán jako argument volání GoToAsync metody.

Důležité

Hodnoty parametrů dotazu založené na řetězci přijaté přes IQueryAttributable rozhraní nejsou automaticky dekódovány adresou URL.

Předávání a zpracování více položek dat

Více řetězcových parametrů dotazu lze předat jejich propojením s &. Například následující kód předá dvě datové položky:

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

Tento příklad kódu načte aktuálně vybraný slon v objektu CollectionView, a přejde na trasu elephantdetails , předává elephantName a elephantLocation jako parametry dotazu.

Chcete-li přijmout více položek dat, třída představující stránku, na kterou se přechází, nebo třídu stránky BindingContext, může být zdobena parametrem QueryPropertyAttribute dotazu založeným na řetězci:

[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
        }
    }
    ...    
}

V tomto příkladu je třída vyzdobena parametrem QueryPropertyAttribute každého dotazu. První QueryPropertyAttribute určuje, že Name vlastnost obdrží data předaná v parametru name dotazu, zatímco druhá QueryPropertyAttribute určuje, že Location vlastnost obdrží data předaná v parametru location dotazu. V obou případech jsou hodnoty parametrů dotazu zadány v identifikátoru URI volání GoToAsync metody.

Upozorňující

Příjem navigačních dat pomocí QueryPropertyAttribute příkazu není bezpečný a neměl by se používat s úplným oříznutím ani nativním objektem AOT. Místo toho byste měli implementovat IQueryAttributable rozhraní u typů, které potřebují přijímat parametry dotazu. Další informace najdete v tématu Oříznutí aplikace .NET MAUI a nativního nasazení AOT.

Další možností je zpracování navigačních dat jedinou metodou implementací IQueryAttributable rozhraní třídy, která představuje stránku, na kterou se prochází, nebo třídy stránky BindingContext:

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

V tomto příkladu ApplyQueryAttributes metoda načte hodnotu name parametrů dotazu location z identifikátoru URI volání GoToAsync metody.

Poznámka:

Parametry dotazu založené na řetězci a parametry navigace založené na objektech je možné předávat současně při provádění navigace založené na trasách.

Chování tlačítka Zpět

Vzhled a chování tlačítka Zpět lze předefinovat nastavením BackButtonBehavior připojené vlastnosti na BackButtonBehavior objekt. Třída BackButtonBehavior definuje následující vlastnosti:

  • Command, typu ICommand, který se spustí při stisknutí tlačítka Zpět.
  • CommandParameter, typu object, což je parametr, který je předán do Command.
  • IconOverride, typu ImageSource, ikona použitá pro tlačítko Zpět.
  • IsEnabled, typu booleanoznačuje, zda je tlačítko zpět povoleno. Výchozí hodnota je true.
  • IsVisible, typu booleanoznačuje, zda je tlačítko zpět viditelné. Výchozí hodnota je true.
  • TextOverride, typu string, text použitý pro tlačítko Zpět.

Všechny tyto vlastnosti jsou podporovány BindableProperty objekty, což znamená, že vlastnosti mohou být cílem datových vazeb. Každý z nich BindablePropertyOneTime režim vazby, což znamená, že data přejdou ze zdroje do cíle, ale pouze v případě, že se BindingContext změny změní.

Všechny tyto vlastnosti jsou podporovány BindableProperty objekty, což znamená, že vlastnosti mohou být cílem datových vazeb. Režimy vazby Command, , CommandParameterIconOveridea TextOveride BindableProperty objektyOneTime, což znamená, že data pocházejí ze zdroje do cíle, ale pouze v případěBindingContext, že se změny. IsVisible BindableProperty Objekty IsEnabled mají OneWay režimy vazeb, což znamená, že data pocházejí ze zdroje do cíle.

Následující kód ukazuje příklad opětovného definice vzhledu a chování tlačítka zpět:

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

Vlastnost Command je nastavena na ICommand spuštění při stisknutí tlačítka Zpět a IconOverride vlastnost je nastavena na ikonu, která se používá pro tlačítko Zpět:

Snímek obrazovky s přepsáním ikony tlačítka Zpět v prostředí