Nawigacja w powłoce MAUI platformy .NET
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
, typuShellItem
, aktualnie wybranego elementu.CurrentPage
, typu Page, aktualnie prezentowana strona.CurrentState
, typuShellNavigationState
, bieżący stan nawigacji .ShellCurrent
, typu Shell, który zapewnia dostęp do bieżącej powłoki.
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 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 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 FlyoutItemwyś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 TabStack
. 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 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:
Page1
przechodzi doPage2
metody GoToAsync , przekazując obiekt o nazwieMyData
.Page2
następnie otrzymujeMyData
jako parametr zapytania.Page2
przechodzi doPage3
metody bez GoToAsync przekazywania żadnych danych.Page3
przechodzi do tyłu za pomocą GoToAsync metody .Page2
następnie otrzymujeMyData
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:
- 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. - 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
, typuobject
, który jest parametrem przekazanym do .Command
IconOverride
, typu ImageSource, ikona użyta dla przycisku Wstecz.IsEnabled
, typuboolean
, wskazuje, czy przycisk Wstecz jest włączony. Domyślna wartość totrue
.IsVisible
, typuboolean
, wskazuje, czy przycisk Wstecz jest widoczny. 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. 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
, , IconOveride
CommandParameter
i 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: