Bagikan melalui


Navigasi .NET MAUI Shell

Telusuri sampel. Telusuri sampel

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 jenis ShellItem, item yang dipilih saat ini.
  • CurrentPage, jenis Page, halaman yang saat ini diperlihatkan.
  • CurrentState, jenis ShellNavigationState, 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.

Cuplikan layar debugger.

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.

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, mengembalikan IReadOnlyList<Page>, tumpukan navigasi saat ini.
  • OnInsertPageBefore, yang dipanggil ketika INavigation.InsertPageBefore dipanggil.
  • OnPopAsync, mengembalikan Task<Page>, dan dipanggil ketika INavigation.PopAsync dipanggil.
  • OnPopToRootAsync, mengembalikan Task, dan dipanggil ketika INavigation.OnPopToRootAsync dipanggil.
  • OnPushAsync, mengembalikan Task, dan dipanggil ketika INavigation.PushAsync dipanggil.
  • OnRemovePage, yang dipanggil saat INavigation.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.

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();
    }
}

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:

  1. Page1 menavigasi ke Page2 menggunakan metode GoToAsync, meneruskan objek bernama MyData. Page2 kemudian menerima MyData sebagai parameter kueri.
  2. Page2 menavigasi ke Page3 menggunakan GoToAsync metode , tanpa meneruskan data apa pun.
  3. Page3 menavigasi mundur dengan GoToAsync metode . Page2 kemudian menerima MyData 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:

  1. 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.
  2. 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 jenis object, yang merupakan parameter yang diteruskan ke Command.
  • IconOverride, merupakan jenis ImageSource, ikon yang digunakan untuk tombol kembali.
  • IsEnabled, berjenis boolean, menunjukkan apakah tombol kembali diaktifkan atau tidak. Nilai defaultnya adalah true.
  • IsVisible, bertipe boolean, menunjukkan apakah tombol kembali terlihat. Nilai defaultnya adalah true.
  • TextOverride, dari jenis string, 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 TextOverideBindableProperty memiliki OneTime mode pengikatan, yang berarti bahwa data beralih dari sumber ke target tetapi hanya ketika BindingContext berubah. Objek IsEnabled dan IsVisibleBindableProperty 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.

Cuplikan layar penggantian ikon tombol kembali pada Shell.