Navigasi .NET MAUI Shell
Shell .NET Multi-platform App UI (.NET MAUI) menyertakan pengalaman navigasi berbasis URI yang menggunakan rute untuk menavigasi ke halaman mana saja dalam aplikasi, tanpa harus mengikuti hierarki navigasi yang ditetapkan. Selain itu, aplikasi ini juga menyediakan kemampuan untuk menavigasi kembali tanpa harus mengunjungi semua halaman di tumpukan navigasi.
Kelas Shell menentukan properti terkait navigasi berikut:
- BackButtonBehavior, jenis BackButtonBehavior, properti terlampir yang menentukan perilaku tombol kembali.
CurrentItem
, jenisShellItem
, item yang saat ini dipilih.CurrentPage
, jenis Page, halaman yang saat ini dipilih.CurrentState
, jenisShellNavigationState
, status navigasi saat ini dari Shell.Current
, tipe Shell, alias yang dikonversikan untukApplication.Current.MainPage
.
Properti BackButtonBehavior, CurrentItem
, dan CurrentState
didukung oleh BindableProperty objek, yang berarti bahwa properti ini dapat menjadi target pengikatan data.
Navigasi dijalankan dengan memanggil metode GoToAsync, dari kelas Shell. Saat navigasi akan dilakukan, Navigating
peristiwa ditembakkan, dan Navigated
peristiwa ditembakkan saat navigasi selesai.
Catatan
Navigasi masih dapat dilakukan di antara halaman di aplikasi Shell dengan menggunakan Navigation
properti . Untuk informasi selengkapnya, lihat Melakukan navigasi tanpa mode.
Rute
Navigasi dijalankan dalam aplikasi Shell dengan menentukan URI untuk dinavigasi. URI navigasi dapat memiliki tiga komponen:
- Rute, yang menentukan jalur ke konten yang ada sebagai bagian dari hierarki visual Shell.
- Halaman. Halaman yang tidak ada dalam hierarki visual Shell dapat didorong ke tumpukan navigasi dari mana saja dalam aplikasi Shell. Misalnya, halaman detail tidak akan ditentukan dalam hierarki visual Shell, tetapi dapat didorong ke tumpukan navigasi sesuai keperluan.
- Satu atau beberapa parameter kueri. Parameter kueri adalah parameter yang bisa diteruskan ke halaman tujuan saat menavigasi.
Saat URI navigasi menyertakan ketiga komponen, strukturnya adalah: //route/page?queryParameters
Mendaftarkan rute
Rute dapat didefinisikan pada FlyoutItemobjek , , TabBarTab, dan ShellContent , melalui propertinyaRoute
:
<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>
Catatan
Semua item dalam hierarki Shell memiliki rute yang terkait dengannya. Jika Anda tidak mengatur rute, rute dibuat saat runtime. Namun, rute yang dihasilkan tidak dijamin konsisten di berbagai sesi aplikasi.
Contoh di atas membuat hierarki rute berikut, yang dapat digunakan dalam navigasi terprogram:
animals
domestic
cats
dogs
monkeys
elephants
bears
about
Untuk menavigasi ke ShellContent objek untuk dogs
rute, URI rute absolut adalah //animals/domestic/dogs
. Demikian pula, untuk menavigasi ke ShellContent objek untuk about
rute, URI rute absolut adalah //about
.
Peringatan
ArgumentException
Akan dilemparkan pada startup aplikasi jika rute duplikat terdeteksi. Pengecualian ini juga akan dilemparkan jika dua rute atau lebih pada tingkat yang sama dalam hierarki berbagi nama rute.
Mendaftarkan rute halaman detail
Di konstruktor subkelas Shell, atau lokasi lain yang berjalan sebelum rute dipanggil, rute tambahan dapat didaftarkan secara eksplisit untuk halaman detail apa pun yang tidak dinyatakan dalam hierarki visual Shell. Hal ini dicapai dengan metode Routing.RegisterRoute
:
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));
Contoh ini mendaftarkan halaman detail, yang tidak ditentukan dalam Shell subkelas, sebagai rute. Halaman detail ini kemudian dapat dinavigasi menggunakan navigasi berbasis URI, dari mana saja dalam aplikasi. Rute untuk halaman tersebut dikenal sebagai rute global.
Peringatan
Akan ArgumentException
dilemparkan jika Routing.RegisterRoute
metode mencoba mendaftarkan rute yang sama ke dua atau beberapa jenis yang berbeda.
Atau, halaman dapat didaftarkan di hierarki rute yang berbeda jika diperlukan:
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));
Contoh ini memungkinkan navigasi halaman kontekstual, di mana menavigasi ke details
rute dari halaman untuk monkeys
rute menampilkan MonkeyDetailPage
. Demikian pula, menavigasi ke details
rute dari halaman untuk elephants
rute menampilkan ElephantDetailPage
. Untuk informasi selengkapnya, lihat Navigasi kontekstual.
Catatan
Halaman yang rutenya telah didaftarkan dengan Routing.RegisterRoute
metode dapat didaftarkan dengan metode , Routing.UnRegisterRoute
jika diperlukan.
Melakukan navigasi
Untuk melakukan navigasi, referensi ke Shell subkelas harus terlebih dahulu diperoleh. Referensi ini dapat diperoleh dengan mentransmisikan properti ke App.Current.MainPage
Shell objek, atau melalui Shell.Current
properti . Navigasi kemudian dapat dilakukan dengan memanggil GoToAsync metode pada Shell objek. Metode ini menavigasi ke ShellNavigationState
dan mengembalikan Task
yang akan selesai setelah animasi navigasi selesai. Objek ShellNavigationState
dibangun oleh GoToAsync metode , dari string
, atau Uri
, dan memiliki properti yang Location
diatur ke string
argumen atau Uri
.
Penting
Saat rute dari hierarki visual Shell dinavigasi, tumpukan navigasi tidak dibuat. Namun, ketika halaman yang tidak ada dalam hierarki visual Shell dinavigasi, tumpukan navigasi dibuat.
Status navigasi Shell objek saat ini dapat diambil melalui Shell.Current.CurrentState
properti , yang mencakup URI rute yang ditampilkan di Location
properti .
Rute absolut
Navigasi dapat dilakukan dengan menentukan URI absolut yang valid sebagai argumen ke GoToAsync metode :
await Shell.Current.GoToAsync("//animals/monkeys");
Contoh ini menavigasi ke halaman untuk monkeys
rute, dengan rute yang ditentukan pada ShellContent objek. Objek ShellContent yang mewakili monkeys
rute adalah anak dari FlyoutItem objek, yang rutenya adalah animals
.
Rute relatif
Navigasi juga dapat dilakukan dengan menentukan URI relatif yang valid sebagai argumen ke GoToAsync metode . Sistem perutean akan mencoba mencocokkan URI dengan ShellContent objek. Oleh karena itu, jika semua rute dalam aplikasi unik, navigasi dapat dilakukan dengan hanya menentukan nama rute unik sebagai URI relatif.
Format rute relatif berikut didukung:
Format | Deskripsi |
---|---|
rute | Hierarki rute akan dicari untuk rute yang ditentukan, ke atas dari posisi saat ini. Halaman yang cocok akan didorong ke tumpukan navigasi. |
/rute | Hierarki rute akan dicari dari rute yang ditentukan, ke bawah dari posisi saat ini. Halaman yang cocok akan didorong ke tumpukan navigasi. |
//rute | Hierarki rute akan dicari untuk rute yang ditentukan, ke atas dari posisi saat ini. Halaman yang cocok akan menggantikan tumpukan navigasi. |
///rute | Hierarki rute akan dicari untuk rute yang ditentukan, ke bawah dari posisi saat ini. Halaman yang cocok akan menggantikan tumpukan navigasi. |
Contoh berikut menavigasi ke halaman untuk monkeydetails
rute:
await Shell.Current.GoToAsync("monkeydetails");
Dalam contoh ini, monkeyDetails
rute dicari hingga halaman yang cocok ditemukan. Ketika halaman ditemukan, halaman didorong ke tumpukan navigasi.
Navigasi kontekstual
Rute relatif memungkinkan navigasi kontekstual. Misalnya, pertimbangkan hierarki rute berikut:
monkeys
details
bears
details
Ketika halaman terdaftar untuk monkeys
rute ditampilkan, menavigasi ke details
rute akan menampilkan halaman terdaftar untuk monkeys/details
rute. Demikian pula, ketika halaman terdaftar untuk bears
rute ditampilkan, menavigasi ke details
rute akan menampilkan halaman terdaftar untuk bears/details
rute. Untuk informasi tentang cara mendaftarkan rute dalam contoh ini, lihat Mendaftarkan rute halaman.
Navigasi mundur
Navigasi mundur dapat dijalankan dengan menentukan ".." sebagai argumen untuk metode GoToAsync:
await Shell.Current.GoToAsync("..");
Navigasi mundur dengan ".." juga dapat dikombinasikan dengan rute:
await Shell.Current.GoToAsync("../route");
Dalam contoh ini, navigasi mundur dilakukan, lalu navigasi ke rute yang ditentukan.
Penting
Menavigasi mundur dan ke rute tertentu hanya dimungkinkan jika navigasi mundur menempatkan Anda di lokasi saat ini dalam hierarki rute untuk menavigasi ke rute yang ditentukan.
Demikian pula, Anda dapat menavigasi mundur beberapa kali, lalu menavigasi ke rute tertentu:
await Shell.Current.GoToAsync("../../route");
Dalam contoh ini, navigasi mundur dilakukan dua kali, lalu navigasi ke rute yang ditentukan.
Selain itu, data dapat diteruskan melalui properti kueri saat menavigasi mundur:
await Shell.Current.GoToAsync($"..?parameterToPassBack={parameterValueToPassBack}");
Dalam contoh ini, navigasi mundur dilakukan, dan nilai parameter kueri diteruskan ke parameter kueri di halaman sebelumnya.
Catatan
Parameter kueri dapat ditambahkan ke permintaan navigasi mundur apa pun.
Untuk informasi selengkapnya tentang meneruskan data saat menavigasi, lihat Meneruskan data.
Rute tidak valid
Format rute berikut tidak valid:
Format | Penjelasan |
---|---|
//halaman atau ///page | Rute global saat ini tidak dapat menjadi satu-satunya halaman pada tumpukan navigasi. Oleh karena itu, perutean absolut ke rute global tidak didukung. |
Penggunaan format rute ini menghasilkan yang Exception
dilemparkan.
Peringatan
Mencoba menavigasi ke rute yang tidak ada menghasilkan pengecualian yang ArgumentException
dilemparkan.
Navigasi penelusuran kesalahan
Beberapa kelas Shell dihiasi dengan DebuggerDisplayAttribute
, yang menentukan bagaimana kelas atau bidang ditampilkan oleh debugger. Ini dapat membantu men-debug permintaan navigasi dengan menampilkan data yang terkait dengan permintaan navigasi. Misalnya, cuplikan layar berikut menunjukkan CurrentItem
properti Shell.Current
dan CurrentState
objek:
Dalam contoh ini, CurrentItem
properti, jenis FlyoutItem, menampilkan judul dan rute FlyoutItem objek. Demikian pula, CurrentState
properti, dari jenis ShellNavigationState
, menampilkan URI rute yang ditampilkan dalam aplikasi Shell.
Tumpukan navigasi
Kelas Tab menentukan Stack
properti, jenis IReadOnlyList<Page>
, yang mewakili tumpukan navigasi saat ini dalam Tab. Kelas ini juga menyediakan metode navigasi yang dapat diganti berikut:
GetNavigationStack
, mengembalikanIReadOnlyList<Page>
, tumpukan navigasi saat ini.OnInsertPageBefore
, yang dipanggil ketikaINavigation.InsertPageBefore
dipanggil.OnPopAsync
, mengembalikanTask<Page>
, dan dipanggil ketikaINavigation.PopAsync
dipanggil.OnPopToRootAsync
, mengembalikanTask
, dan dipanggil ketikaINavigation.OnPopToRootAsync
dipanggil.OnPushAsync
, mengembalikanTask
, dan dipanggil ketikaINavigation.PushAsync
dipanggil.OnRemovePage
, yang dipanggil ketikaINavigation.RemovePage
dipanggil.
Contoh berikut menunjukkan cara mengambil alih OnRemovePage
metode:
public class MyTab : Tab
{
protected override void OnRemovePage(Page page)
{
base.OnRemovePage(page);
// Custom logic
}
}
Dalam contoh ini, MyTab
objek harus digunakan dalam hierarki visual Shell Anda alih-alih Tab objek.
Peristiwa navigasi
Kelas Shell mendefinisikan Navigating
peristiwa, yang diaktifkan saat navigasi akan dilakukan, baik karena navigasi terprogram atau interaksi pengguna. Objek ShellNavigatingEventArgs
yang menyertai Navigating
peristiwa menyediakan properti berikut:
Properti | Tipe | Deskripsi |
---|---|---|
Current |
ShellNavigationState |
URI halaman saat ini. |
Source |
ShellNavigationSource |
Jenis navigasi yang terjadi. |
Target |
ShellNavigationState |
URI yang mewakili tempat navigasi ditujukan. |
CanCancel |
bool |
Nilai yang menunjukkan apakah mungkin untuk membatalkan navigasi. |
Cancelled |
bool |
Nilai yang menunjukkan apakah navigasi dibatalkan. |
Selain itu, ShellNavigatingEventArgs
kelas menyediakan Cancel
metode yang dapat digunakan untuk membatalkan navigasi, dan GetDeferral
metode yang mengembalikan ShellNavigatingDeferral
token yang dapat digunakan untuk menyelesaikan navigasi. Untuk informasi selengkapnya tentang penolakan navigasi, lihat Penolakan navigasi.
Kelas Shell juga mendefinisikan Navigated
peristiwa, yang diaktifkan ketika navigasi telah selesai. Objek ShellNavigatedEventArgs
yang menyertai Navigated
peristiwa menyediakan properti berikut:
Properti | Tipe | Deskripsi |
---|---|---|
Current |
ShellNavigationState |
URI halaman saat ini. |
Previous |
ShellNavigationState |
URI halaman sebelumnya. |
Source |
ShellNavigationSource |
Jenis navigasi yang terjadi. |
Penting
Metode OnNavigating
ini dipanggil ketika peristiwa terjadi Navigating
. Demikian pula, OnNavigated
metode ini dipanggil ketika peristiwa terjadi Navigated
. Kedua metode dapat ditimpa di subkelas Anda Shell untuk mencegat permintaan navigasi.
Kelas ShellNavigatedEventArgs
dan ShellNavigatingEventArgs
keduanya memiliki Source
properti, dari jenis ShellNavigationSource
. Enumerasi ini menyediakan nilai berikut:
Unknown
Push
Pop
PopToRoot
Insert
Remove
ShellItemChanged
ShellSectionChanged
ShellContentChanged
Oleh karena itu, navigasi dapat dicegat dalam OnNavigating
penimpaan dan tindakan dapat dilakukan berdasarkan sumber navigasi. Misalnya, kode berikut menunjukkan cara membatalkan navigasi mundur jika data di halaman tidak disimpan:
protected override void OnNavigating(ShellNavigatingEventArgs args)
{
base.OnNavigating(args);
// Cancel any back navigation.
if (args.Source == ShellNavigationSource.Pop)
{
args.Cancel();
}
}
Penangguh navigasi
Navigasi shell dapat dicegat dan diselesaikan atau dibatalkan berdasarkan pilihan pengguna. Ini dapat dicapai dengan mengesampingkan OnNavigating
GetDeferral
metode di subkelas AndaShell, dan dengan memanggil metode pada ShellNavigatingEventArgs
objek. Metode ini mengembalikan ShellNavigatingDeferral
token yang memiliki Complete
metode, yang dapat digunakan untuk menyelesaikan permintaan navigasi:
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();
}
}
Dalam contoh ini, lembar tindakan ditampilkan yang mengundang pengguna untuk menyelesaikan permintaan navigasi, atau membatalkannya. Navigasi dibatalkan dengan memanggil Cancel
metode pada ShellNavigatingEventArgs
objek. Navigasi selesai dengan memanggil Complete
metode pada ShellNavigatingDeferral
token yang diambil oleh GetDeferral
metode pada ShellNavigatingEventArgs
objek.
Peringatan
Metode ini GoToAsync akan melempar InvalidOperationException
jika pengguna mencoba menavigasi saat ada penundaan navigasi yang tertunda.
Meneruskan data
Data dasar dapat diteruskan sebagai parameter kueri berbasis string saat menjalankan navigasi terprogram berbasis URI. Hal ini dicapai dengan menambahkan ?
setelah rute, lalu diikuti dengan id parameter kueri, =
, dan nilai:
async void OnCollectionViewSelectionChanged(object sender, SelectionChangedEventArgs e)
{
string elephantName = (e.CurrentSelection.FirstOrDefault() as Animal).Name;
await Shell.Current.GoToAsync($"elephantdetails?name={elephantName}");
}
Contoh ini mengambil gajah yang saat ini dipilih di CollectionView, dan menavigasi ke elephantdetails
rute, melewati elephantName
sebagai parameter kueri.
Meneruskan beberapa data navigasi berbasis objek penggunaan
Beberapa penggunaan data navigasi berbasis objek dapat diteruskan dengan GoToAsync kelebihan beban yang menentukan IDictionary<string, object>
argumen:
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);
}
Contoh ini mengambil beruang yang saat ini dipilih di CollectionView, sebagai Animal
. Objek Animal
ditambahkan ke dengan Dictionary
kunci Bear
. Kemudian, navigasi ke beardetails
rute dilakukan, dengan yang Dictionary
diteruskan sebagai parameter navigasi.
Data apa pun yang diteruskan sebagai IDictionary<string, object>
argumen disimpan dalam memori selama masa pakai halaman, dan tidak dirilis hingga halaman dihapus dari tumpukan navigasi. Ini bisa bermasalah, seperti yang ditunjukkan dalam skenario berikut:
Page1
menavigasi kePage2
menggunakan GoToAsync metode , meneruskan objek yang disebutMyData
.Page2
kemudian menerimaMyData
sebagai parameter kueri.Page2
menavigasi kePage3
menggunakan GoToAsync metode , tanpa meneruskan data apa pun.Page3
menavigasi mundur dengan GoToAsync metode .Page2
kemudian menerimaMyData
lagi sebagai parameter kueri.
Meskipun ini diinginkan dalam banyak skenario, jika tidak diinginkan, Anda harus menghapus IDictionary<string, object>
argumen dengan Clear
metode setelah pertama kali diterima oleh halaman.
Meneruskan data navigasi berbasis objek penggunaan tunggal
Data navigasi berbasis objek penggunaan tunggal dapat diteruskan dengan GoToAsync kelebihan beban yang menentukan ShellNavigationQueryParameters argumen. Objek ShellNavigationQueryParameters ditujukan untuk data navigasi penggunaan tunggal yang dibersihkan setelah navigasi terjadi. Contoh berikut menunjukkan menavigasi saat meneruskan data penggunaan tunggal:
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);
}
Contoh ini mengambil beruang yang saat ini dipilih di CollectionView, sebagai Animal
yang ditambahkan ke ShellNavigationQueryParameters objek. Kemudian, navigasi ke beardetails
rute dilakukan, dengan ShellNavigationQueryParameters objek diteruskan sebagai parameter navigasi. Setelah navigasi terjadi, data dalam ShellNavigationQueryParameters objek dibersihkan.
Menerima data navigasi
Ada dua pendekatan untuk menerima data navigasi:
- Kelas yang mewakili halaman yang dinavigasi, atau kelas untuk halaman
BindingContext
, dapat dihiasi dengan QueryPropertyAttribute untuk setiap parameter kueri. Untuk informasi selengkapnya, lihat Memproses data navigasi menggunakan atribut properti kueri. - Kelas yang mewakili halaman yang dinavigasi, atau kelas untuk halaman
BindingContext
, dapat mengimplementasikan IQueryAttributable antarmuka. Untuk informasi selengkapnya, lihat Memproses data navigasi menggunakan satu metode.
Memproses data navigasi menggunakan atribut properti kueri
Data navigasi dapat diterima dengan mendekorasi kelas penerima dengan QueryPropertyAttribute untuk setiap parameter kueri berbasis string, parameter navigasi berbasis objek, atau ShellNavigationQueryParameters objek:
[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;
}
}
Dalam contoh ini argumen pertama untuk QueryPropertyAttribute menentukan nama properti yang akan menerima data, dengan argumen kedua yang menentukan id parameter. Oleh karena itu, QueryPropertyAttribute dalam contoh di atas menentukan bahwa Bear
properti akan menerima data yang diteruskan dalam Bear
parameter navigasi dalam GoToAsync panggilan metode.
Penting
Nilai parameter kueri berbasis string yang diterima melalui QueryPropertyAttribute URL secara otomatis didekodekan.
Peringatan
Menerima data navigasi menggunakan QueryPropertyAttribute tidak dipangkas dengan aman dan tidak boleh digunakan dengan pemangkasan penuh atau NativeAOT. Sebagai gantinya IQueryAttributable , Anda harus menerapkan antarmuka pada jenis yang perlu menerima parameter kueri. Untuk informasi selengkapnya, lihat Memproses data navigasi menggunakan satu metode, Memangkas aplikasi .NET MAUI, dan penyebaran AOT Asli.
Memproses data navigasi menggunakan satu metode
Data navigasi dapat diterima dengan menerapkan IQueryAttributable antarmuka pada kelas penerima. Antarmuka IQueryAttributable menentukan bahwa kelas penerapan harus menerapkan ApplyQueryAttributes
metode . Metode ini memiliki query
argumen, jenis IDictionary<string, object>
, yang berisi data apa pun yang diteruskan selama navigasi. Setiap kunci dalam kamus adalah id parameter kueri, dengan nilainya yang sesuai dengan objek yang mewakili data. Keuntungan menggunakan pendekatan ini adalah bahwa data navigasi dapat diproses menggunakan satu metode, yang dapat berguna ketika Anda memiliki beberapa item data navigasi yang memerlukan pemrosesan secara keseluruhan.
Contoh berikut menunjukkan kelas model tampilan yang mengimplementasikan IQueryAttributable antarmuka:
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");
}
...
}
Dalam contoh ini, ApplyQueryAttributes
metode mengambil objek yang sesuai dengan kunci dalam query
kamusMonkey
, yang diteruskan sebagai argumen ke GoToAsync panggilan metode.
Penting
Nilai parameter kueri berbasis string yang diterima melalui IQueryAttributable antarmuka tidak didekodekan URL secara otomatis.
Meneruskan dan memproses beberapa item data
Beberapa parameter kueri berbasis string dapat diteruskan dengan menghubungkannya dengan &
. Misalnya, kode berikut meneruskan dua item data:
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}");
}
Contoh kode ini mengambil gajah yang saat ini dipilih di CollectionView, dan menavigasi ke elephantdetails
rute, meneruskan elephantName
dan elephantLocation
sebagai parameter kueri.
Untuk menerima beberapa item data, kelas yang mewakili halaman yang dinavigasi, atau kelas untuk halaman BindingContext
, dapat dihiasi dengan QueryPropertyAttribute untuk setiap parameter kueri berbasis string:
[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
}
}
...
}
Dalam contoh ini, kelas dihiasi dengan QueryPropertyAttribute untuk setiap parameter kueri. Yang pertama QueryPropertyAttribute menentukan bahwa properti akan menerima data yang Name
diteruskan dalam name
parameter kueri, sementara yang kedua QueryPropertyAttribute menentukan bahwa properti akan menerima data yang Location
diteruskan dalam location
parameter kueri. Dalam kedua kasus, nilai parameter kueri ditentukan dalam URI dalam GoToAsync panggilan metode.
Peringatan
Menerima data navigasi menggunakan QueryPropertyAttribute tidak dipangkas dengan aman dan tidak boleh digunakan dengan pemangkasan penuh atau NativeAOT. Sebagai gantinya IQueryAttributable , Anda harus menerapkan antarmuka pada jenis yang perlu menerima parameter kueri. Untuk informasi selengkapnya, lihat Memangkas aplikasi .NET MAUI dan penyebaran AOT Asli.
Atau, data navigasi dapat diproses dengan satu metode dengan menerapkan IQueryAttributable antarmuka pada kelas yang mewakili halaman yang dinavigasi, atau kelas untuk halaman 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());
...
}
...
}
Dalam contoh ini, ApplyQueryAttributes
metode mengambil nilai name
parameter kueri dan location
dari URI dalam GoToAsync panggilan metode.
Catatan
Parameter kueri berbasis string dan parameter navigasi berbasis objek dapat diteruskan secara bersamaan saat melakukan navigasi berbasis rute.
Perilaku tombol kembali
Tampilan dan perilaku tombol kembali dapat ditentukan ulang dengan mengatur BackButtonBehavior properti terlampir ke BackButtonBehavior objek. Kelas BackButtonBehavior menentukan properti berikut:
Command
, dari jenis ICommand, yang dijalankan ketika tombol kembali ditekan.CommandParameter
, dari jenisobject
, yang merupakan parameter yang diteruskan keCommand
.IconOverride
, dari jenis ImageSource, ikon yang digunakan untuk tombol kembali.IsEnabled
, dari jenisboolean
, menunjukkan apakah tombol kembali diaktifkan. Nilai defaultnya adalahtrue
.IsVisible
, dari jenisboolean
, menunjukkan apakah tombol kembali terlihat. Nilai defaultnya adalahtrue
.TextOverride
, dari jenisstring
, teks yang digunakan untuk tombol kembali.
Semua properti ini didukung oleh BindableProperty objek, yang berarti bahwa properti dapat menjadi target pengikatan data. Masing-masing BindableProperty memiliki OneTime
mode pengikatan, yang berarti bahwa data beralih dari sumber ke target tetapi hanya ketika BindingContext
perubahan.
Semua properti ini didukung oleh BindableProperty objek, yang berarti bahwa properti dapat menjadi target pengikatan data. Objek Command
, CommandParameter
, IconOveride
, dan TextOveride
BindableProperty memiliki OneTime
mode pengikatan, yang berarti bahwa data beralih dari sumber ke target tetapi hanya ketika BindingContext
berubah. Objek IsEnabled
dan IsVisible
BindableProperty memiliki OneWay
mode pengikatan, yang berarti bahwa data beralih dari sumber ke target.
Kode berikut menunjukkan contoh menentukan ulang tampilan dan perilaku tombol kembali:
<ContentPage ...>
<Shell.BackButtonBehavior>
<BackButtonBehavior Command="{Binding BackCommand}"
IconOverride="back.png" />
</Shell.BackButtonBehavior>
...
</ContentPage>
Properti Command
diatur ke yang ICommand akan dijalankan ketika tombol kembali ditekan, dan IconOverride
properti diatur ke ikon yang digunakan untuk tombol kembali: