Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
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, adalah properti yang melekat yang menentukan perilaku tombol kembali.
-
CurrentItem
, dengan jenisShellItem
, item yang dipilih saat ini. -
CurrentPage
, jenis Page, halaman yang saat ini diperlihatkan. -
CurrentState
, jenisShellNavigationState
, status navigasi saat ini dari Shell. -
Current
, dari jenis Shell, yang menyediakan akses ke Shell yang sedang berjalan.
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 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 objek FlyoutItem, TabBar, Tab, dan ShellContent, melalui properti Route
mereka.
<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 suatu rute dipanggil, rute tambahan dapat didaftarkan secara eksplisit untuk halaman detail apa pun yang tidak terwakili 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
ArgumentException
akan dilemparkan jika metode Routing.RegisterRoute
mencoba mendaftarkan rute yang sama ke dua atau lebih 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 berpindah ke details
dari halaman untuk monkeys
akan menampilkan MonkeyDetailPage
. Demikian pula, menavigasi ke rute details
dari halaman untuk rute elephants
akan menampilkan ElephantDetailPage
. Untuk informasi selengkapnya, lihat Navigasi kontekstual.
Catatan
Halaman yang rutenya telah didaftarkan dengan metode Routing.RegisterRoute
dapat dihapuskan dengan metode Routing.UnRegisterRoute
jika diperlukan.
Melakukan navigasi
Untuk melakukan navigasi, referensi ke Shell subkelas harus terlebih dahulu diperoleh. Referensi ini dapat diperoleh 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 menggunakan metode GoToAsync, dari string
, atau Uri
, dan memiliki properti Location
yang diatur kepada argumen string
atau Uri
.
Penting
Saat sebuah rute dari hierarki visual Shell dijalankan, tidak ada tumpukan navigasi yang dibuat. Namun, ketika halaman yang tidak berada dalam hierarki visual Shell dinavigasikan, akan dibuat tumpukan navigasi.
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 mengarah ke halaman rute monkeys
, di mana rute didefinisikan pada objek ShellContent. Objek ShellContent yang mewakili monkeys
rute adalah anak dari FlyoutItem objek, yang rutenya adalah animals
.
Peringatan
Rute absolut tidak berfungsi pada halaman yang terdaftar menggunakan metode Routing.RegisterRoute
.
Rute relatif
Navigasi juga dapat dilakukan dengan menentukan URI relatif yang valid sebagai argumen ke GoToAsync metode . Sistem perutean akan mencoba mencocokkan URI dengan objek ShellContent. Oleh karena itu, jika semua rute dalam aplikasi unik, navigasi dapat dilakukan dengan hanya menentukan nama rute unik sebagai URI relatif.
Contoh berikut menavigasi ke halaman untuk jalur monkeydetails
.
await Shell.Current.GoToAsync("monkeydetails");
Dalam contoh ini, rute monkeyDetails
dicari hingga halaman yang cocok ditemukan. Ketika halaman ditemukan, halaman tersebut dimasukkan ke dalam tumpukan navigasi.
Peringatan
Rute relatif tidak berfungsi dengan halaman yang didefinisikan dalam kelas subkelas Shell, yang umumnya AppShell.xaml. Sebaliknya, hanya halaman yang telah terdaftar dengan metode Routing.RegisterRoute
yang bisa ditambahkan ke tumpukan navigasi menggunakan rute relatif. Untuk informasi selengkapnya, lihat Halaman detail rute pendaftaran.
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 menyebabkan Exception
muncul.
Peringatan
Mencoba menavigasi ke rute yang tidak ada menghasilkan pengecualian yang ArgumentException
dilemparkan.
Navigasi Pemecahan Masalah
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 properti CurrentItem
dan CurrentState
dari objek Shell.Current
.
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 mendefinisikan suatu properti Stack
, bertipe IReadOnlyList<Page>
, yang mewakili tumpukan navigasi saat ini dalam Tab. Kelas ini juga menyediakan metode navigasi berikut yang dapat dioverride:
-
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 saatINavigation.RemovePage
dipanggil.
Contoh berikut menunjukkan cara mengganti metode OnRemovePage
:
public class MyTab : Tab
{
protected override void OnRemovePage(Page page)
{
base.OnRemovePage(page);
// Custom logic
}
}
Dalam contoh ini, objek MyTab
sebaiknya digunakan dalam hierarki visual Shell Anda, bukan objek Tab.
Peristiwa navigasi
Kelas Shell mendefinisikan event Navigating
, yang dipicu 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 lokasi tujuan navigasi. |
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 penggubahan navigasi, lihat Penggubahan 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
dipanggil ketika peristiwa Navigating
terjadi. Demikian pula, metode OnNavigated
dipanggil ketika peristiwa Navigated
terjadi. Kedua metode dapat Anda timpa di subkelas 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 bergantung pada asal 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 mengganti metode OnNavigating
di subkelas Shell Anda, dan dengan memanggil metode GetDeferral
pada objek ShellNavigatingEventArgs
. 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();
}
}
public MyShell : Shell
{
// ...
protected override async void OnNavigating(ShellNavigatingEventArgs args)
{
base.OnNavigating(args);
ShellNavigatingDeferral token = args.GetDeferral();
var result = await DisplayActionSheetAsync("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 diselesaikan dengan metode Complete
dipanggil pada token ShellNavigatingDeferral
yang diperoleh dari metode GetDeferral
pada objek ShellNavigatingEventArgs
.
Peringatan
Metode GoToAsync ini akan melempar InvalidOperationException
jika pengguna mencoba menavigasi saat ada penundaan navigasi yang masih berlangsung.
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 jalur elephantdetails
, menggunakan elephantName
sebagai parameter kueri.
Meneruskan beberapa data navigasi berbasis objek penggunaan
Beberapa penggunaan data navigasi berbasis objek dapat diteruskan dengan GoToAsync overload yang menetapkan suatu 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, dalam bentuk Animal
. Objek Animal
ditambahkan ke dengan Dictionary
kunci Bear
. Kemudian, navigasi ke rute beardetails
dilakukan, dengan 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 metode GoToAsync, meneruskan objek bernamaMyData
.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.
Mengirim data navigasi berbasis objek yang hanya dapat digunakan sekali.
Data navigasi berbasis objek sekali pakai dapat diteruskan dengan GoToAsync muatan berlebih yang menentukan ShellNavigationQueryParameters argumen. Objek ShellNavigationQueryParameters dimaksudkan untuk data navigasi yang digunakan sekali dan dihapus setelah navigasi terjadi. Contoh berikut menunjukkan menavigasi ketika meneruskan data sekali pakai.
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 aman untuk pemangkasan dan tidak boleh digunakan dengan pemangkasan sepenuhnya atau NativeAOT. Sebagai gantinya, Anda harus menerapkan antarmuka IQueryAttributable pada tipe 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, metode ApplyQueryAttributes
mengambil objek yang sesuai dengan kunci Monkey
dalam kamus query
, yang diteruskan sebagai argumen ke panggilan metode GoToAsync.
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 aman untuk pemangkasan dan tidak boleh digunakan dengan pemangkasan total atau NativeAOT. Sebagai gantinya, Anda harus menerapkan antarmuka IQueryAttributable 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, metode ApplyQueryAttributes
mengambil nilai dari parameter kueri name
dan location
dari URI dalam panggilan metode GoToAsync.
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
, merupakan jenis ImageSource, ikon yang digunakan untuk tombol kembali. -
IsEnabled
, berjenisboolean
, menunjukkan apakah tombol kembali diaktifkan atau tidak. Nilai defaultnya adalahtrue
. -
IsVisible
, bertipeboolean
, 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 mode pengikatan OneTime
, yang berarti bahwa data mengalir dari sumber ke target tetapi hanya ketika BindingContext
berubah.
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 menjadi ICommand yang akan dijalankan ketika tombol kembali ditekan, dan properti IconOverride
diatur ke ikon yang digunakan untuk tombol kembali.