Bagaimana Anda beralih antar halaman dalam Formulir Xamarin?
Halaman utama saya adalah ContentPage dan saya tidak ingin beralih ke sesuatu seperti Halaman Tab.
Saya dapat melakukan pseudo-melakukannya dengan menemukan orang tua dari kontrol yang harus memicu halaman baru sampai saya menemukan ContentPage dan kemudian menukar Konten dengan kontrol untuk halaman baru. Tapi ini sepertinya sangat ceroboh.
xamarin
xamarin.forms
Eric
sumber
sumber
Jawaban:
Xamarin.Forms
mendukung beberapa host navigasi built-in:NavigationPage
, di mana halaman berikutnya meluncur masuk,TabbedPage
, yang tidak Anda sukaiCarouselPage
, yang memungkinkan untuk beralih dari kiri dan kanan ke halaman berikutnya / sebelumnya.Di atas ini, semua halaman juga mendukung
PushModalAsync()
yang hanya mendorong halaman baru di atas yang sudah ada.Pada akhirnya, jika Anda ingin memastikan pengguna tidak dapat kembali ke halaman sebelumnya (menggunakan isyarat atau tombol perangkat keras belakang), Anda dapat tetap menampilkan yang sama
Page
dan menggantinya.Content
.Opsi yang disarankan untuk mengganti halaman root juga berfungsi, tetapi Anda harus menanganinya secara berbeda untuk setiap platform.
sumber
Di kelas App, Anda dapat menyetel MainPage ke Halaman Navigasi dan menyetel halaman root ke ContentPage:
Kemudian di panggilan ContentPage pertama Anda:
sumber
Android.Content.Res
untuk navigasi. Sepertinya tidak benar, dari mana saya harus mengimpornya?Jika proyek Anda telah disiapkan sebagai proyek formulir PCL (dan sangat mungkin sebagai Formulir Bersama juga tetapi saya belum mencobanya) ada kelas App.cs yang terlihat seperti ini:
Anda dapat memodifikasi file
GetMainPage
metode untuk mengembalikan TabbedPaged baru atau halaman lain yang telah Anda tetapkan dalam proyekDari sana Anda dapat menambahkan perintah atau penangan kejadian untuk mengeksekusi kode dan melakukan
sumber
Navigation
contoh ini? - Apakah itu benda yang kamu buat di suatu tempat? - Saya tidak melihatnya dalam contoh kode ini.PushAsync()
tidak bekerja untuk saya, sementaraPushModalAsync()
berhasilDorong halaman baru ke tumpukan, lalu hapus halaman saat ini. Ini menghasilkan peralihan.
Anda harus berada di Halaman Navigasi terlebih dahulu:
Mengalihkan konten tidak ideal karena Anda hanya memiliki satu halaman besar dan satu rangkaian acara halaman seperti OnAppearing ect.
sumber
Navigation.RemovePage();
tidak didukung di Android.await Navigation.PushAsync(new SecondPage(),false);
Jika Anda tidak ingin membuka halaman sebelumnya yaitu jangan biarkan pengguna kembali ke layar login setelah otorisasi selesai, maka Anda dapat menggunakan;
Jika Anda ingin mengaktifkan fungsionalitas kembali, gunakan saja
sumber
Sepertinya utas ini sangat populer dan akan menyedihkan untuk tidak menyebutkan di sini bahwa ada cara alternatif -
ViewModel First Navigation
. Sebagian besar kerangka kerja MVVM di luar sana menggunakannya, namun jika Anda ingin memahami tentang apa itu, lanjutkan membaca.Semua dokumentasi resmi Xamarin.Forms mendemonstrasikan solusi murni MVVM yang sederhana, namun sedikit tidak. Itu karena
Page
(View) seharusnya tidak tahu apa-apa tentang theViewModel
dan sebaliknya. Berikut adalah contoh bagus dari pelanggaran ini:Jika Anda memiliki aplikasi 2 halaman, pendekatan ini mungkin baik untuk Anda. Namun jika Anda bekerja pada solusi perusahaan besar, Anda lebih baik menggunakan
ViewModel First Navigation
pendekatan. Ini sedikit lebih rumit tetapi pendekatan yang jauh lebih bersih yang memungkinkan Anda untuk menavigasi di antaraViewModels
alih-alih navigasi di antaraPages
(Tampilan). Salah satu keuntungan di samping pemisahan perhatian yang jelas adalah Anda dapat dengan mudah meneruskan parameter ke parameter berikutnyaViewModel
atau menjalankan kode inisialisasi asinkron tepat setelah navigasi. Sekarang untuk detailnya.(Saya akan mencoba menyederhanakan semua contoh kode sebanyak mungkin).
1. Pertama-tama kita membutuhkan tempat di mana kita bisa mendaftarkan semua objek kita dan secara opsional menentukan masa pakainya. Untuk masalah ini kita dapat menggunakan container IOC, Anda dapat memilihnya sendiri. Dalam contoh ini saya akan menggunakan Autofac (ini adalah salah satu yang tercepat yang tersedia). Kami dapat menyimpan referensi tentangnya
App
agar tersedia secara global (bukan ide yang baik, tetapi diperlukan untuk penyederhanaan):2. Kita akan membutuhkan objek yang bertanggung jawab untuk mengambil
Page
(View) untuk spesifikViewModel
dan sebaliknya. Kasus kedua mungkin berguna dalam kasus pengaturan root / halaman utama aplikasi. Untuk itu kita harus menyetujui konvensi sederhana bahwa semuaViewModels
harus ada diViewModels
direktori danPages
(Views) harus ada diViews
direktori. Dengan kata lainViewModels
harus hidup di[MyApp].ViewModels
namespace danPages
(Views) di[MyApp].Views
namespace. Selain itu, kita harus setuju bahwaWelcomeView
(Halaman) harus memilikiWelcomeViewModel
dan dll. Berikut adalah contoh kode mapper:3. Untuk kasus pengaturan halaman root kita memerlukan semacam
ViewModelLocator
yang akan mengaturBindingContext
secara otomatis:4. Akhirnya kita membutuhkan pendekatan
NavigationService
yang akan mendukungViewModel First Navigation
:Seperti yang Anda lihat, ada
BaseViewModel
- kelas dasar abstrak untuk semuaViewModels
tempat Anda dapat mendefinisikan metode sepertiInitializeAsync
itu yang akan dieksekusi tepat setelah navigasi. Dan berikut adalah contoh navigasi:Seperti yang Anda pahami, pendekatan ini lebih rumit, lebih sulit untuk di-debug, dan mungkin membingungkan. Namun ada banyak keuntungan plus Anda sebenarnya tidak harus menerapkannya sendiri karena sebagian besar kerangka kerja MVVM mendukungnya di luar kotak. Contoh kode yang ditunjukkan di sini tersedia di github .
Ada banyak artikel bagus tentang
ViewModel First Navigation
pendekatan dan ada Pola Aplikasi Perusahaan gratis menggunakan eBook Xamarin.Forms yang menjelaskan hal ini dan banyak topik menarik lainnya secara rinci.sumber
Dengan menggunakan metode PushAsync () Anda dapat mendorong dan PopModalAsync () Anda dapat memunculkan halaman ke dan dari tumpukan navigasi. Dalam contoh kode saya di bawah ini, saya memiliki halaman Navigasi (Halaman Root) dan dari halaman ini saya mendorong halaman konten yang merupakan halaman login setelah saya selesai dengan halaman login saya, saya kembali ke halaman root
~~~ Navigasi dapat dianggap sebagai tumpukan objek Halaman yang terakhir masuk, keluar pertama. Untuk berpindah dari satu halaman ke halaman lain, aplikasi akan mendorong halaman baru ke tumpukan ini. Untuk kembali ke halaman sebelumnya, aplikasi akan memunculkan halaman saat ini dari tumpukan. Navigasi di Xamarin.Forms ini ditangani oleh antarmuka INavigation
Xamarin.Forms memiliki kelas NavigationPage yang mengimplementasikan antarmuka ini dan akan mengelola tumpukan Halaman. Kelas NavigationPage juga akan menambahkan bilah navigasi ke bagian atas layar yang menampilkan judul dan juga akan memiliki platform tombol Kembali yang sesuai yang akan kembali ke halaman sebelumnya. Kode berikut menunjukkan cara membungkus NavigationPage di sekitar halaman pertama dalam aplikasi:
Referensi ke konten yang tercantum di atas dan tautan yang harus Anda tinjau untuk informasi lebih lanjut tentang Formulir Xamarin, lihat bagian Navigasi:
http://developer.xamarin.com/guides/cross-platform/xamarin-forms/introduction-to-xamarin-forms/
~~~
// Kode yang dihapus untuk kesederhanaan hanya pop yang ditampilkan
sumber
Navigasi satu halaman ke halaman lain di Xamarin.forms menggunakan properti Navigasi Di bawah kode sampel
Untuk menavigasi satu halaman ke halaman lain dengan dalam sel tampilan Di bawah kode Xamrian.forms
Contohnya seperti di bawah ini
sumber
Panggilan:
Buat metode ini di dalam App.xaml.cs:
sumber
Ketika Anda ingin menavigasi dari YourPage ke halaman berikutnya, Anda melakukannya:
Anda dapat membaca lebih lanjut tentang navigasi Formulir Xamarin di sini: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/navigation/hierarchical
Microsoft memiliki dokumen yang cukup bagus tentang ini.
Ada juga konsep yang lebih baru dari
Shell
. Ini memungkinkan cara baru untuk menyusun aplikasi Anda dan menyederhanakan navigasi dalam beberapa kasus.Pendahuluan: https://devblogs.microsoft.com/xamarin/shell-xamarin-forms-4-0-getting-started/
Video tentang dasar-dasar Shell: https://www.youtube.com/watch?v=0y1bUAcOjZY&t=3112s
Dokumen: https://docs.microsoft.com/en-us/xamarin/xamarin-forms/app-fundamentals/shell/
sumber
Halaman XAML menambahkan ini
di halaman CS
sumber
Setelah
PushAsync
digunakanPopAsync
(denganthis
) untuk menghapus halaman ini.sumber
Di Xamarin kami memiliki halaman bernama NavigationPage. Ini menyimpan tumpukan ContentPages. NavigationPage memiliki metode seperti PushAsync () dan PopAsync (). PushAsync menambahkan halaman di bagian atas tumpukan, pada saat itu halaman tersebut akan menjadi halaman yang sedang aktif. Metode PopAsync () menghapus halaman dari atas tumpukan.
Di App.Xaml.Cs kita bisa mengatur like.
MainPage = new NavigationPage (new YourPage ());
menunggu Navigation.PushAsync (newPage ()); metode ini akan menambahkan newPage di bagian atas tumpukan. Saat ini nePage akan menjadi halaman aktif.
sumber