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ą:
BackButtonBehavior
, typuBackButtonBehavior
, dołączona właściwość, która definiuje zachowanie przycisku Wstecz.CurrentItem
, typuShellItem
, aktualnie wybranego elementu.CurrentPage
, typuPage
, aktualnie prezentowana strona.CurrentState
, typuShellNavigationState
, bieżący stan nawigacji .Shell
Current
, typu , alias rzutowany na typShell
dla .Application.Current.MainPage
Właściwości BackButtonBehavior
, CurrentItem
i 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 FlyoutItem
obiektach , , TabBar
Tab
i 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 string
lub 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 :
W tym przykładzie CurrentItem
właściwość typu FlyoutItem
wyświetla tytuł i trasę FlyoutItem
obiektu. CurrentState
Podobnie właściwość typu ShellNavigationState
wyświetla identyfikator URI wyświetlanej trasy w aplikacji powłoki.
Stos nawigacji
Klasa Tab
definiuje właściwość typu IReadOnlyList<Page>
, która reprezentuje bieżący stos nawigacji w obiekcie Tab
Stack
. Klasa udostępnia również następujące metody nawigacji, które można zastąpić:
GetNavigationStack
, zwracaIReadOnlyList<Page>
bieżący stos nawigacji.OnInsertPageBefore
, który jest wywoływany, gdyINavigation.InsertPageBefore
jest wywoływany.OnPopAsync
, zwracaTask<Page>
element , i jest wywoływany, gdyINavigation.PopAsync
jest wywoływany.OnPopToRootAsync
, zwracaTask
element , i jest wywoływany, gdyINavigation.OnPopToRootAsync
jest wywoływany.OnPushAsync
, zwracaTask
element , i jest wywoływany, gdyINavigation.PushAsync
jest wywoływany.OnRemovePage
, który jest wywoływany, gdyINavigation.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.
Zdarzenia nawigacji
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();
}
// }
Odroczenie nawigacji
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 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 CollectionView
obiekcie i przechodzi do elephantdetails
trasy, przekazując elephantName
jako parametr zapytania.
Istnieją dwa podejścia do odbierania danych nawigacji:
- Klasa reprezentująca stronę, do którego jest przechodzina, lub klasa dla strony
BindingContext
, może być ozdobiona elementemQueryPropertyAttribute
dla każdego parametru zapytania. Aby uzyskać więcej informacji, zobacz Przetwarzanie danych nawigacji przy użyciu atrybutów właściwości zapytania. - 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 name
elementu 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 CollectionView
obiekcie 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ą BackButtonBehavior
BackButtonBehavior
właściwość do obiektu. Klasa BackButtonBehavior
definiuje następujące właściwości:
Command
, typuICommand
, który jest wykonywany po naciśnięciu przycisku Wstecz.CommandParameter
, typuobject
, który jest parametrem przekazanym do .Command
IconOverride
, typuImageSource
, ikona użyta dla przycisku Wstecz.IsEnabled
, typuboolean
, wskazuje, czy przycisk Wstecz jest włączony. Domyślna wartość totrue
.TextOverride
, typustring
, 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: