Udostępnij za pośrednictwem


Nawigacja w powłoce MAUI platformy .NET

Przeglądaj przykład. Przeglądanie przykładu

Powłoka interfejsu użytkownika aplikacji wieloplatformowej platformy .NET (.NET MAUI) zawiera środowisko nawigacji oparte na identyfikatorze URI, które używa tras do przechodzenia do dowolnej strony w aplikacji bez konieczności korzystania z ustawionej hierarchii nawigacji. Ponadto zapewnia również możliwość przechodzenia do tyłu bez konieczności odwiedzania wszystkich stron w stosie nawigacji.

Klasa Shell definiuje następujące właściwości związane z nawigacją:

  • BackButtonBehavior, typu BackButtonBehavior, dołączona właściwość, która definiuje zachowanie przycisku Wstecz.
  • CurrentItem, typu ShellItem, aktualnie wybranego elementu.
  • CurrentPage, typu Page, aktualnie prezentowana strona.
  • CurrentState, typu ShellNavigationState, bieżący stan nawigacji .Shell
  • Current, typu Shell, który zapewnia dostęp do bieżącej powłoki.

Właściwości BackButtonBehavior, CurrentItemi CurrentState są wspierane przez BindableProperty obiekty, co oznacza, że te właściwości mogą być obiektami docelowymi powiązań danych.

Nawigacja jest wykonywana przez wywołanie GoToAsync metody z Shell klasy . Gdy nawigacja ma zostać wykonana, Navigating zdarzenie zostanie wyzwolone, a Navigated zdarzenie zostanie wyzwolone po zakończeniu nawigacji.

Uwaga

Nawigacja nadal może być wykonywana między stronami w aplikacji powłoki przy użyciu Navigation właściwości . Aby uzyskać więcej informacji, zobacz Wykonywanie nawigacji bez moderowania.

Trasy

Nawigacja jest wykonywana w aplikacji powłoki, określając identyfikator URI do przejścia do. Identyfikatory URI nawigacji mogą mieć trzy składniki:

  • Trasa, która definiuje ścieżkę do zawartości, która istnieje w ramach hierarchii wizualizacji powłoki.
  • Strona. Strony, które nie istnieją w hierarchii wizualizacji powłoki, można wypchnąć do stosu nawigacji z dowolnego miejsca w aplikacji powłoki. Na przykład strona szczegółów nie zostanie zdefiniowana w hierarchii wizualizacji powłoki, ale może zostać wypchnięta do stosu nawigacji zgodnie z potrzebami.
  • Co najmniej jeden parametr zapytania. Parametry zapytania to parametry, które można przekazać do strony docelowej podczas nawigowania.

Gdy identyfikator URI nawigacji zawiera wszystkie trzy składniki, struktura to: //route/page?queryParameters

Rejestrowanie tras

Trasy można definiować w FlyoutItemobiektach , , TabBarTabi ShellContent za pomocą ich Route właściwości:

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

Uwaga

Wszystkie elementy w hierarchii powłoki mają skojarzona trasa. Jeśli nie ustawisz trasy, zostanie ona wygenerowana w czasie wykonywania. Jednak wygenerowane trasy nie mają gwarancji spójności między różnymi sesjami aplikacji.

Powyższy przykład tworzy następującą hierarchię tras, która może być używana w nawigacji programowej:

animals
  domestic
    cats
    dogs
  monkeys
  elephants
  bears
about

Aby przejść do ShellContent obiektu trasy dogs , bezwzględny identyfikator URI trasy to //animals/domestic/dogs. Podobnie, aby przejść do ShellContent obiektu trasy about , bezwzględny identyfikator URI trasy to //about.

Ostrzeżenie

Jeśli ArgumentException zostanie wykryta zduplikowana trasa, zostanie zgłoszony podczas uruchamiania aplikacji. Ten wyjątek zostanie również zgłoszony, jeśli co najmniej dwie trasy na tym samym poziomie w hierarchii mają nazwę trasy.

Rejestrowanie tras strony szczegółów

W konstruktorze Shell podklasy lub w dowolnej innej lokalizacji, która jest uruchamiana przed wywołaniem trasy, dodatkowe trasy można jawnie zarejestrować dla wszystkich stron szczegółów, które nie są reprezentowane w hierarchii wizualizacji powłoki. Jest to realizowane za Routing.RegisterRoute pomocą 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));

W tym przykładzie są rejestrowane strony szczegółów, które nie są zdefiniowane w podklasie Shell jako trasy. Następnie można przejść do tych stron szczegółów przy użyciu nawigacji opartej na identyfikatorze URI z dowolnego miejsca w aplikacji. Trasy dla takich stron są nazywane trasami globalnymi.

Ostrzeżenie

Zostanie ArgumentException zgłoszony błąd, jeśli Routing.RegisterRoute metoda spróbuje zarejestrować tę samą trasę do dwóch lub większej liczby różnych typów.

Alternatywnie strony można zarejestrować w różnych hierarchiach tras, jeśli jest to wymagane:

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

W tym przykładzie włączono nawigację między stronami kontekstowymi, gdzie przejście do details trasy ze strony monkeys trasy powoduje wyświetlenie elementu MonkeyDetailPage. Podobnie przejście do details trasy ze strony trasy elephants powoduje wyświetlenie ciągu ElephantDetailPage. Aby uzyskać więcej informacji, zobacz Nawigacja kontekstowa.

Uwaga

Strony, których trasy zostały zarejestrowane w Routing.RegisterRoute metodzie, można w razie potrzeby wyrejestrować za Routing.UnRegisterRoute pomocą metody .

Wykonywanie nawigacji

Aby przeprowadzić nawigację, należy najpierw uzyskać odwołanie do podklasy Shell . To odwołanie można uzyskać za pośrednictwem Shell.Current właściwości . Następnie można przeprowadzić nawigację GoToAsync przez wywołanie metody w Shell obiekcie . Ta metoda przechodzi do elementu ShellNavigationState i zwraca element Task , który zostanie ukończony po zakończeniu animacji nawigacji. Obiekt ShellNavigationState jest konstruowany przez metodę GoToAsync z klasy stringlub Uri, i ma jej Location właściwość ustawioną string na argument or Uri .

Ważne

Po przejściu do trasy z hierarchii wizualizacji powłoki nie zostanie utworzony stos nawigacji. Jednak po przejściu do strony, która nie znajduje się w hierarchii wizualizacji powłoki, zostanie utworzony stos nawigacji.

Bieżący stan Shell nawigacji obiektu można pobrać za pośrednictwem Shell.Current.CurrentState właściwości, która zawiera identyfikator URI wyświetlanej trasy we Location właściwości .

Trasy bezwzględne

Nawigacja może być wykonywana przez określenie prawidłowego bezwzględnego identyfikatora URI jako argumentu GoToAsync metody:

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

W tym przykładzie zostanie wyświetlona strona trasy monkeys z trasą zdefiniowaną ShellContent na obiekcie. ShellContent Obiekt reprezentujący monkeys trasę jest elementem podrzędnym FlyoutItem obiektu, którego trasa to animals.

Trasy względne

Nawigacja może być również wykonywana przez określenie prawidłowego względnego identyfikatora URI jako argumentu GoToAsync metody . System routingu podejmie próbę ShellContent dopasowania identyfikatora URI do obiektu. W związku z tym, jeśli wszystkie trasy w aplikacji są unikatowe, nawigacja może być wykonywana tylko przez określenie unikatowej nazwy trasy jako względnego identyfikatora URI.

Obsługiwane są następujące formaty tras względnych:

Format opis
trasa Hierarchia tras zostanie przeszukana pod kątem określonej trasy w górę z bieżącej pozycji. Dopasowana strona zostanie wypchnięta do stosu nawigacji.
/trasa Hierarchia tras zostanie przeszukana z określonej trasy w dół z bieżącej pozycji. Dopasowana strona zostanie wypchnięta do stosu nawigacji.
//trasa Hierarchia tras zostanie przeszukana pod kątem określonej trasy w górę z bieżącej pozycji. Pasująca strona zastąpi stos nawigacji.
///trasa Hierarchia tras zostanie przeszukana pod kątem określonej trasy w dół z bieżącej pozycji. Pasująca strona zastąpi stos nawigacji.

Poniższy przykład przechodzi do strony trasy monkeydetails :

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

W tym przykładzie monkeyDetails trasa jest wyszukiwana w górę hierarchii do momentu znalezienia pasującej strony. Po znalezieniu strony zostanie ona wypchnięta do stosu nawigacji.

Nawigacja kontekstowa

Trasy względne umożliwiają nawigację kontekstową. Rozważmy na przykład następującą hierarchię tras:

monkeys
  details
bears
  details

Po wyświetleniu zarejestrowanej monkeys strony trasy przejście do details trasy spowoduje wyświetlenie zarejestrowanej strony trasy monkeys/details . Podobnie po wyświetleniu zarejestrowanej bears strony trasy nawigowanie do details trasy spowoduje wyświetlenie zarejestrowanej strony trasy bears/details . Aby uzyskać informacje na temat rejestrowania tras w tym przykładzie, zobacz Rejestrowanie tras stron.

Nawigacja wstecz

Nawigacja wsteczna może być wykonywana przez określenie ".". Jako argument metody GoToAsync :

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

Nawigacja wsteczna z ciągiem "."." może być również połączona z trasą:

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

W tym przykładzie jest wykonywana nawigacja wsteczna, a następnie nawigacja do określonej trasy.

Ważne

Przechodzenie do tyłu i do określonej trasy jest możliwe tylko wtedy, gdy nawigacja wsteczna umieści Cię w bieżącej lokalizacji w hierarchii tras, aby przejść do określonej trasy.

Podobnie można wielokrotnie przechodzić do tyłu, a następnie przechodzić do określonej trasy:

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

W tym przykładzie nawigacja wsteczna jest wykonywana dwa razy, a następnie nawigacja do określonej trasy.

Ponadto dane mogą być przekazywane przez właściwości zapytania podczas przechodzenia do tyłu:

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

W tym przykładzie jest wykonywana nawigacja wsteczna, a wartość parametru zapytania jest przekazywana do parametru zapytania na poprzedniej stronie.

Uwaga

Parametry zapytania można dołączyć do dowolnego żądania nawigacji wstecz.

Aby uzyskać więcej informacji na temat przekazywania danych podczas nawigowania, zobacz Przekazywanie danych.

Nieprawidłowe trasy

Następujące formaty tras są nieprawidłowe:

Formatuj Wyjaśnienie
//strona lub ///page Obecnie trasy globalne nie mogą być jedyną stroną w stosie nawigacji. W związku z tym routing bezwzględny do tras globalnych nie jest obsługiwany.

Użycie tych formatów tras powoduje Exception zgłoszenie.

Ostrzeżenie

Próba przejścia do nieistniejącej trasy powoduje ArgumentException zgłoszenie wyjątku.

Nawigacja debugowania

Niektóre klasy powłoki są ozdobione elementem DebuggerDisplayAttribute, który określa sposób wyświetlania klasy lub pola przez debuger. Może to pomóc w debugowaniu żądań nawigacji, wyświetlając dane związane z żądaniem nawigacji. Na przykład poniższy zrzut ekranu przedstawia CurrentItem właściwości Shell.Current i CurrentState obiektu :

Zrzut ekranu przedstawiający debuger.

W tym przykładzie CurrentItem właściwość typu FlyoutItemwyświetla tytuł i trasę FlyoutItem obiektu. CurrentState Podobnie właściwość typu ShellNavigationStatewyświetla identyfikator URI wyświetlanej trasy w aplikacji powłoki.

Klasa Tab definiuje właściwość typu IReadOnlyList<Page>, która reprezentuje bieżący stos nawigacji w obiekcie TabStack . Klasa udostępnia również następujące metody nawigacji, które można zastąpić:

  • GetNavigationStack, zwraca IReadOnlyList<Page>bieżący stos nawigacji.
  • OnInsertPageBefore, który jest wywoływany, gdy INavigation.InsertPageBefore jest wywoływany.
  • OnPopAsync, zwraca Task<Page>element , i jest wywoływany, gdy INavigation.PopAsync jest wywoływany.
  • OnPopToRootAsync, zwraca Taskelement , i jest wywoływany, gdy INavigation.OnPopToRootAsync jest wywoływany.
  • OnPushAsync, zwraca Taskelement , i jest wywoływany, gdy INavigation.PushAsync jest wywoływany.
  • OnRemovePage, który jest wywoływany, gdy INavigation.RemovePage jest wywoływany.

W poniższym przykładzie pokazano, jak zastąpić metodę OnRemovePage :

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

        // Custom logic
    }
}

W tym przykładzie MyTab obiekty powinny być używane w hierarchii wizualizacji powłoki zamiast Tab obiektów.

Klasa Shell definiuje Navigating zdarzenie, które jest uruchamiane, gdy ma być wykonywana nawigacja, albo z powodu nawigacji programowej lub interakcji użytkownika. Obiekt ShellNavigatingEventArgs , który towarzyszy Navigating zdarzeniu, zawiera następujące właściwości:

Właściwość Type Opis
Current ShellNavigationState Identyfikator URI bieżącej strony.
Source ShellNavigationSource Typ nawigacji, który wystąpił.
Target ShellNavigationState Identyfikator URI reprezentujący miejsce, w którym jest kierowana nawigacja.
CanCancel bool Wartość wskazująca, czy można anulować nawigację.
Cancelled bool Wartość wskazująca, czy nawigacja została anulowana.

Ponadto klasa udostępnia metodęCancel, ShellNavigatingEventArgs która może służyć do anulowania nawigacji, oraz GetDeferral metody zwracającej ShellNavigatingDeferral token, który może służyć do ukończenia nawigacji. Aby uzyskać więcej informacji na temat odroczenia nawigacji, zobacz Odroczenie nawigacji.

Klasa Shell definiuje również zdarzenie, które jest wyzwalane po zakończeniu Navigated nawigacji. Obiekt ShellNavigatedEventArgs , który towarzyszy Navigated zdarzeniu, zawiera następujące właściwości:

Właściwość Type Opis
Current ShellNavigationState Identyfikator URI bieżącej strony.
Previous ShellNavigationState Identyfikator URI poprzedniej strony.
Source ShellNavigationSource Typ nawigacji, który wystąpił.

Ważne

Metoda jest wywoływana OnNavigating Navigating , gdy zdarzenie jest uruchamiane. Podobnie metoda jest wywoływana OnNavigated , gdy Navigated zdarzenie jest uruchamiane. Obie metody można zastąpić w podklasie w Shell celu przechwycenia żądań nawigacji.

Klasy ShellNavigatedEventArgs i ShellNavigatingEventArgs mają Source właściwości typu ShellNavigationSource. Ta wyliczenie zawiera następujące wartości:

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

W związku z tym nawigacja może zostać przechwycona w przesłonięć OnNavigating , a akcje można wykonać na podstawie źródła nawigacji. Na przykład poniższy kod pokazuje, jak anulować nawigację wstecz, jeśli dane na stronie są niezapisane:

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

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

Nawigacja w powłoce może zostać przechwycona i ukończona lub anulowana w oparciu o wybór użytkownika. Można to osiągnąć, przesłaniając metodę OnNavigating w Shell podklasie i wywołując GetDeferral metodę ShellNavigatingEventArgs w obiekcie . Ta metoda zwraca token, który ma metodę ShellNavigatingDeferral Complete , która może służyć do ukończenia żądania nawigacji:

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

W tym przykładzie zostanie wyświetlony arkusz akcji, który zaprasza użytkownika do ukończenia żądania nawigacji lub anuluje go. Nawigacja jest anulowana przez wywołanie Cancel metody w ShellNavigatingEventArgs obiekcie. Nawigacja jest zakończona przez wywołanie Complete metody na ShellNavigatingDeferral tokenie, który został pobrany przez GetDeferral metodę w ShellNavigatingEventArgs obiekcie .

Ostrzeżenie

Metoda GoToAsync zgłosi błąd InvalidOperationException , jeśli użytkownik spróbuje nawigować po oczekiwaniu na odroczenie nawigacji.

Przekazywanie danych

Dane pierwotne mogą być przekazywane jako parametry zapytania oparte na ciągach podczas wykonywania nawigacji programowej opartej na identyfikatorze URI. Jest to osiągane ? przez dołączenie po trasie, po której następuje identyfikator parametru zapytania, =i wartość:

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

W tym przykładzie jest pobierany aktualnie wybrany słoń w CollectionViewobiekcie i przechodzi do elephantdetails trasy, przekazując elephantName jako parametr zapytania.

Przekazywanie wielu danych nawigacji opartych na obiektach

Wiele danych nawigacji opartych na obiektach można przekazać z GoToAsync przeciążeniem, które określa 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);
}

W tym przykładzie jest pobierany aktualnie wybrany niedźwiedź w elemecie CollectionViewAnimal, jako element . Obiekt Animal jest dodawany do obiektu Dictionary z kluczem Bear. Następnie jest wykonywana nawigacja do beardetails trasy z Dictionary przekazywanym parametrem nawigacji.

Wszystkie dane przekazane jako IDictionary<string, object> argument są przechowywane w pamięci przez okres istnienia strony i nie są zwalniane, dopóki strona nie zostanie usunięta ze stosu nawigacji. Może to być problematyczne, jak pokazano w poniższym scenariuszu:

  1. Page1 przechodzi do Page2 metody GoToAsync , przekazując obiekt o nazwie MyData. Page2 następnie otrzymuje MyData jako parametr zapytania.
  2. Page2 przechodzi do Page3 metody bez GoToAsync przekazywania żadnych danych.
  3. Page3 przechodzi do tyłu za pomocą GoToAsync metody . Page2 następnie otrzymuje MyData ponownie jako parametr zapytania.

Chociaż jest to pożądane w wielu scenariuszach, jeśli nie jest to pożądane, należy wyczyścić IDictionary<string, object> argument z Clear metodą po jej pierwszym odebraniu przez stronę.

Przekazywanie danych nawigacji opartych na obiektach

Dane nawigacji opartej na obiektach mogą być przekazywane z GoToAsync przeciążeniem określającym ShellNavigationQueryParameters argument. ShellNavigationQueryParameters Obiekt jest przeznaczony do pojedynczego użycia danych nawigacji, które są czyszczone po wystąpieniu nawigacji. W poniższym przykładzie pokazano nawigowanie podczas przekazywania danych z użyciem pojedynczego użycia:

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

W tym przykładzie jest pobierany aktualnie wybrany niedźwiedź w CollectionViewobiekcie , który Animal jest dodawany do ShellNavigationQueryParameters obiektu. Następnie odbywa się nawigacja beardetails do trasy z ShellNavigationQueryParameters obiektem przekazywanym jako parametr nawigacji. Po wyczyszczonej nawigacji dane w ShellNavigationQueryParameters obiekcie.

Odbieranie danych nawigacji

Istnieją dwa podejścia do odbierania danych nawigacji:

  1. Klasa reprezentująca stronę, do którego jest przechodzina, lub klasa dla strony BindingContext, może być ozdobiona elementem QueryPropertyAttribute dla każdego parametru zapytania. Aby uzyskać więcej informacji, zobacz Przetwarzanie danych nawigacji przy użyciu atrybutów właściwości zapytania.
  2. Klasa reprezentująca stronę, do którego jest przechodzina, lub klasa dla strony BindingContext, może zaimplementować IQueryAttributable interfejs. Aby uzyskać więcej informacji, zobacz Przetwarzanie danych nawigacji przy użyciu jednej metody.

Przetwarzanie danych nawigacji przy użyciu atrybutów właściwości zapytania

Dane nawigacji można odbierać, dekorując klasę odbierającą za QueryPropertyAttribute pomocą parametru zapytania dla każdego parametru zapytania opartego na ciągu, parametru nawigacji opartej na obiektach lub ShellNavigationQueryParameters obiektu:

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

W tym przykładzie pierwszy argument dla parametru QueryPropertyAttribute określa nazwę właściwości, która będzie odbierać dane, z drugim argumentem określającym identyfikator parametru. W związku z tym w QueryPropertyAttribute powyższym przykładzie określa, że Bear właściwość będzie otrzymywać dane przekazane w parametrze Bear nawigacji w wywołaniu GoToAsync metody.

Ważne

Wartości parametrów zapytania oparte na ciągach, które są odbierane za pośrednictwem elementu QueryPropertyAttribute , są automatycznie dekodowane adresami URL.

Ostrzeżenie

Odbieranie danych nawigacyjnych przy użyciu elementu QueryPropertyAttribute nie jest bezpieczne i nie powinno być używane z pełnym przycinaniem ani nativeAOT. Zamiast tego należy zaimplementować IQueryAttributable interfejs dla typów, które muszą akceptować parametry zapytania. Aby uzyskać więcej informacji, zobacz Przetwarzanie danych nawigacji przy użyciu jednej metody, Przycinanie aplikacji MAUI platformy .NET i wdrażanie natywnego AOT.

Przetwarzanie danych nawigacji przy użyciu jednej metody

Dane nawigacji można odbierać przez zaimplementowanie interfejsu IQueryAttributable w klasie odbierającego. Interfejs IQueryAttributable określa, że klasa implementowania musi implementować metodę ApplyQueryAttributes . Ta metoda ma query argument typu IDictionary<string, object>, który zawiera wszystkie dane przekazywane podczas nawigacji. Każdy klucz w słowniku jest identyfikatorem parametru zapytania z jego wartością odpowiadającą obiektowi reprezentującemu dane. Zaletą tego podejścia jest to, że dane nawigacji mogą być przetwarzane przy użyciu jednej metody, co może być przydatne, gdy masz wiele elementów danych nawigacji, które wymagają przetwarzania jako całości.

W poniższym przykładzie przedstawiono klasę modelu widoku, która implementuje IQueryAttributable interfejs:

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

W tym przykładzie ApplyQueryAttributes metoda pobiera obiekt odpowiadający Monkey kluczowi w słowniku query , który został przekazany jako argument GoToAsync wywołania metody.

Ważne

Wartości parametrów zapytania oparte na ciągu, które są odbierane za pośrednictwem interfejsu IQueryAttributable , nie są automatycznie dekodowane adresami URL.

Przekazywanie i przetwarzanie wielu elementów danych

Wiele parametrów zapytania opartych na ciągach można przekazać, łącząc je za pomocą polecenia &. Na przykład następujący kod przekazuje dwa elementy danych:

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

Ten przykład kodu pobiera aktualnie wybranego słonia w CollectionViewobiekcie i przechodzi do elephantdetails trasy, przekazując elephantName i elephantLocation jako parametry zapytania.

Aby odbierać wiele elementów danych, klasa reprezentująca stronę, do którego jest przechodzina, lub klasa dla strony BindingContext, może zostać ozdobiona elementem QueryPropertyAttribute dla każdego parametru zapytania opartego na ciągu:

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

W tym przykładzie klasa jest ozdobiona parametrem QueryPropertyAttribute dla każdego parametru zapytania. Pierwszy QueryPropertyAttribute określa, że Name właściwość będzie otrzymywać dane przekazane w parametrze name zapytania, podczas gdy druga QueryPropertyAttribute określa, że Location właściwość będzie odbierać dane przekazane w parametrze location zapytania. W obu przypadkach wartości parametrów zapytania są określone w identyfikatorze URI w wywołaniu GoToAsync metody.

Ostrzeżenie

Odbieranie danych nawigacyjnych przy użyciu elementu QueryPropertyAttribute nie jest bezpieczne i nie powinno być używane z pełnym przycinaniem ani nativeAOT. Zamiast tego należy zaimplementować IQueryAttributable interfejs dla typów, które muszą akceptować parametry zapytania. Aby uzyskać więcej informacji, zobacz Trim a .NET MAUI app and Native AOT deployment (Przycinanie aplikacji MAUI platformy .NET) i Native AOT deployment (Wdrażanie natywnego rozwiązania AOT).

Alternatywnie dane nawigacji mogą być przetwarzane przez jedną metodę przez zaimplementowanie interfejsu IQueryAttributable w klasie reprezentującej stronę, do którą jest przechodzina, lub klasy dla strony 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());
        ...        
    }
    ...
}

W tym przykładzie ApplyQueryAttributes metoda pobiera wartość parametrów name zapytania i location z identyfikatora URI w wywołaniu GoToAsync metody.

Uwaga

Parametry zapytania oparte na ciągach i parametry nawigacji oparte na obiektach mogą być jednocześnie przekazywane podczas wykonywania nawigacji opartej na trasach.

Zachowanie przycisku Wstecz

Wygląd i zachowanie przycisku Wstecz można ponownie zdefiniować, ustawiając dołączoną BackButtonBehavior BackButtonBehavior właściwość do obiektu. Klasa BackButtonBehavior definiuje następujące właściwości:

  • Command, typu ICommand, który jest wykonywany po naciśnięciu przycisku Wstecz.
  • CommandParameter, typu object, który jest parametrem przekazanym do .Command
  • IconOverride, typu ImageSource, ikona użyta dla przycisku Wstecz.
  • IsEnabled, typu boolean, wskazuje, czy przycisk Wstecz jest włączony. Domyślna wartość to true.
  • IsVisible, typu boolean, wskazuje, czy przycisk Wstecz jest widoczny. Domyślna wartość to true.
  • TextOverride, typu string, tekst używany dla przycisku Wstecz.

Wszystkie te właściwości są wspierane przez BindableProperty obiekty, co oznacza, że właściwości mogą być obiektami docelowymi powiązań danych. Każdy z nich BindableProperty ma OneTime tryb powiązania, co oznacza, że dane przechodzą ze źródła do miejsca docelowego, ale tylko wtedy, gdy BindingContext zmiany.

Wszystkie te właściwości są wspierane przez BindableProperty obiekty, co oznacza, że właściwości mogą być obiektami docelowymi powiązań danych. Obiekty Command, , IconOverideCommandParameteri TextOveride BindableProperty mają OneTime tryby powiązań, co oznacza, że dane przechodzą ze źródła do obiektu docelowego, ale tylko wtedy, gdy BindingContext zmiany. Obiekty IsEnabled i IsVisible BindableProperty mają OneWay tryby powiązań, co oznacza, że dane przechodzą ze źródła do obiektu docelowego.

Poniższy kod przedstawia przykład ponownego definiowania wyglądu i zachowania przycisku wstecz:

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

Właściwość Command jest ustawiona na ICommand wartość , która ma być wykonywana po naciśnięciu przycisku Wstecz, a IconOverride właściwość jest ustawiona na ikonę używaną dla przycisku Wstecz:

Zrzut ekranu przedstawiający ikonę przycisku Wstecz powłoki.