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, properti terlampir yang menentukan perilaku tombol kembali.
  • CurrentItem, jenis ShellItem, item yang saat ini dipilih.
  • CurrentPage, jenis Page, halaman yang saat ini dipilih.
  • CurrentState, jenis ShellNavigationState, status navigasi saat ini dari Shell.
  • Current, tipe Shell, alias yang dikonversikan untuk Application.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:

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 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, 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 ketika INavigation.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.

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

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:

  1. Page1 menavigasi ke Page2 menggunakan GoToAsync metode , meneruskan objek yang disebut 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.

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:

  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 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 jenis object, yang merupakan parameter yang diteruskan ke Command.
  • IconOverride, dari jenis ImageSource, ikon yang digunakan untuk tombol kembali.
  • IsEnabled, dari jenis boolean, menunjukkan apakah tombol kembali diaktifkan. Nilai defaultnya adalah true.
  • IsVisible, dari jenis 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 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:

Cuplikan layar penimpaan ikon tombol kembali Shell.