Xamarin.Forms Nawigacja w powłoce

Xamarin.Forms Powłoka zawiera środowisko nawigacji oparte na identyfikatorze URI, które używa tras do przechodzenia do dowolnej strony w aplikacji bez konieczności korzystania z hierarchii nawigacji zestawu. 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ą:

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 może być nadal wykonywana między stronami w aplikacji powłoki przy użyciu właściwości Navigation . Aby uzyskać więcej informacji, zobacz Nawigacja hierarchiczna.

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ć przez rzutowanie App.Current.MainPage właściwości do Shell obiektu lub 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
Trasy 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.
/Trasy Hierarchia tras zostanie przeszukana z określonej trasy w dół z bieżącej pozycji. Dopasowana strona zostanie wypchnięta do stosu nawigacji.
//Trasy Hierarchia tras zostanie przeszukana pod kątem określonej trasy w górę z bieżącej pozycji. Pasująca strona zastąpi stos nawigacji.
///Trasy 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 OnNavigatingNavigating , 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ę ShellNavigatingDeferralComplete , 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 mogą być przekazywane jako parametry zapytania podczas wykonywania nawigacji programowej opartej na identyfikatorze URI. Jest to osiągane przez dołączenie ? po trasie, a następnie identyfikator parametru zapytania, =i wartość. Na przykład następujący kod jest wykonywany w przykładowej aplikacji, gdy użytkownik wybierze słoń na obiekcie ElephantsPage:

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

Ten przykładowy kod pobiera aktualnie wybrany słoń w CollectionViewobiekcie i przechodzi do elephantdetails trasy, przekazując elephantName jako parametr zapytania.

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 pomocą QueryPropertyAttribute elementu dla każdego parametru zapytania:

[QueryProperty(nameof(Name), "name")]
public partial class ElephantDetailPage : ContentPage
{
    public string Name
    {
        set
        {
            LoadAnimal(value);
        }
    }
    ...

    void LoadAnimal(string name)
    {
        try
        {
            Animal animal = ElephantData.Elephants.FirstOrDefault(a => a.Name == name);
            BindingContext = animal;
        }
        catch (Exception)
        {
            Console.WriteLine("Failed to load animal.");
        }
    }    
}

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 zapytania. W związku z tym w QueryPropertyAttribute powyższym przykładzie określa, że Name właściwość będzie odbierać dane przekazane w parametrze name zapytania z identyfikatora URI w wywołaniu GoToAsync metody. Inicjator Name właściwości wywołuje metodę LoadAnimal , aby pobrać Animal obiekt dla nameelementu i ustawić go jako BindingContext stronę.

Uwaga

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

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, string>, który zawiera wszystkie dane przekazywane podczas nawigacji. Każdy klucz w słowniku jest identyfikatorem parametru zapytania, a jego wartością jest wartość parametru zapytania. 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, string> query)
    {
        // The query parameter requires URL decoding.
        string name = HttpUtility.UrlDecode(query["name"]);
        LoadAnimal(name);
    }

    void LoadAnimal(string name)
    {
        try
        {
            Monkey = MonkeyData.Monkeys.FirstOrDefault(a => a.Name == name);
            OnPropertyChanged("Monkey");
        }
        catch (Exception)
        {
            Console.WriteLine("Failed to load animal.");
        }
    }
    ...
}

W tym przykładzie ApplyQueryAttributes metoda pobiera wartość parametru name zapytania z identyfikatora URI w wywołaniu GoToAsync metody. Następnie metoda jest wywoływana LoadAnimal w celu pobrania Animal obiektu, gdzie jego zestaw jako wartość Monkey właściwości, która jest powiązana z danymi.

Ważne

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

Przekazywanie i przetwarzanie wielu parametrów zapytania

Wiele parametrów zapytania 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 przechodzi, lub klasę dla strony BindingContext, można ozdobić elementem QueryPropertyAttribute dla każdego parametru zapytania:

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

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, string> query)
    {
        string name = HttpUtility.UrlDecode(query["name"]);
        string location = HttpUtility.UrlDecode(query["location"]);
        ...        
    }
    ...
}

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

Zachowanie przycisku Wstecz

Wygląd i zachowanie przycisku Wstecz można ponownie zdefiniować, ustawiając dołączoną BackButtonBehaviorBackButtonBehavior 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.
  • 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.

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>

Równoważny kod języka C# to:

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

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 przesłonięć ikonę przycisku Wstecz powłoki w systemach iOS i Android