Xamarin.Forms Halaman Modal
Xamarin.Forms menyediakan dukungan untuk halaman modal. Halaman modal mendorong pengguna untuk menyelesaikan tugas mandiri yang tidak dapat dinavigasi jauh hingga tugas selesai atau dibatalkan. Artikel ini menunjukkan cara menavigasi ke halaman modal.
Artikel ini membahas topik berikut:
- Melakukan navigasi – mendorong halaman ke tumpukan modal, memunculkan halaman dari tumpukan modal, menonaktifkan tombol kembali, dan menganimasikan transisi halaman.
- Meneruskan data saat menavigasi - meneruskan data melalui konstruktor halaman, dan melalui
BindingContext
.
Gambaran Umum
Halaman modal bisa menjadi salah satu jenis Halaman yang didukung oleh Xamarin.Forms. Untuk menampilkan halaman modal, aplikasi akan mendorongnya ke tumpukan modal, di mana itu akan menjadi halaman aktif, seperti yang ditunjukkan dalam diagram berikut:
Untuk kembali ke halaman sebelumnya, aplikasi akan memunculkan halaman saat ini dari tumpukan modal, dan halaman paling atas baru menjadi halaman aktif, seperti yang ditunjukkan dalam diagram berikut:
Melakukan Navigasi
Metode navigasi modal diekspos oleh Navigation
properti pada jenis turunan apa pun Page
. Metode ini memberikan kemampuan untuk mendorong halaman modal ke tumpukan modal, dan halaman modal pop dari tumpukan modal.
Properti ini Navigation
juga mengekspos ModalStack
properti tempat halaman modal dalam tumpukan modal dapat diperoleh. Namun, tidak ada konsep untuk melakukan manipulasi tumpukan modal, atau muncul ke halaman akar di navigasi modal. Ini karena operasi ini tidak didukung secara universal pada platform yang mendasar.
Catatan
Instans NavigationPage
tidak diperlukan untuk melakukan navigasi halaman modal.
Mendorong Halaman ke Tumpukan Modal
Untuk menavigasi ke ModalPage
perlu untuk memanggil PushModalAsync
metode pada Navigation
properti halaman saat ini, seperti yang ditunjukkan dalam contoh kode berikut:
async void OnItemSelected (object sender, SelectedItemChangedEventArgs e)
{
if (listView.SelectedItem != null) {
var detailPage = new DetailPage ();
...
await Navigation.PushModalAsync (detailPage);
}
}
Ini menyebabkan instans ModalPage
didorong ke tumpukan modal, di mana instans tersebut menjadi halaman aktif, asalkan item telah dipilih dalam ListView
MainPage
instans. ModalPage
Instans ditampilkan dalam cuplikan layar berikut:
Ketika PushModalAsync
dipanggil, peristiwa berikut terjadi:
- Panggilan halaman
PushModalAsync
memilikiOnDisappearing
pengabaian yang dipanggil, asalkan platform yang mendasar bukan Android. - Halaman yang dinavigasi untuk meminta penggantiannya
OnAppearing
. - Tugas
PushAsync
selesai.
Namun, urutan yang tepat bahwa peristiwa ini terjadi tergantung pada platform. Untuk informasi selengkapnya, lihat Bab 24 buku Charles Petzold Xamarin.Forms .
Catatan
Panggilan ke penimpaan OnDisappearing
dan OnAppearing
tidak dapat diperlakukan sebagai indikasi navigasi halaman yang dijamin. Misalnya, di iOS, penimpaan OnDisappearing
dipanggil pada halaman aktif saat aplikasi berakhir.
Memunculkan Halaman dari Tumpukan Modal
Halaman aktif dapat dimunculkan dari tumpukan modal dengan menekan tombol Kembali pada perangkat, terlepas dari apakah ini adalah tombol fisik pada perangkat atau tombol di layar.
Untuk kembali ke halaman asli secara terprogram, ModalPage
instans harus memanggil PopModalAsync
metode , seperti yang ditunjukkan dalam contoh kode berikut:
async void OnDismissButtonClicked (object sender, EventArgs args)
{
await Navigation.PopModalAsync ();
}
Ini menyebabkan instans ModalPage
dihapus dari tumpukan modal, dengan halaman paling atas baru menjadi halaman aktif. Ketika PopModalAsync
dipanggil, peristiwa berikut terjadi:
- Panggilan halaman
PopModalAsync
memilikiOnDisappearing
pengabaian yang dipanggil. - Halaman yang dikembalikan untuk
OnAppearing
dipanggil, asalkan platform yang mendasar bukan Android. - Tugas
PopModalAsync
akan kembali.
Namun, urutan yang tepat bahwa peristiwa ini terjadi tergantung pada platform. Untuk informasi selengkapnya, lihat Bab 24 buku Charles Petzold Xamarin.Forms .
Menonaktifkan Tombol Kembali
Di Android, pengguna selalu dapat kembali ke halaman sebelumnya dengan menekan tombol Kembali standar pada perangkat. Jika halaman modal mengharuskan pengguna untuk menyelesaikan tugas mandiri sebelum meninggalkan halaman, aplikasi harus menonaktifkan tombol Kembali . Ini dapat dicapai dengan mengesampingkan Page.OnBackButtonPressed
metode pada halaman modal. Untuk informasi selengkapnya, lihat Bab 24 buku Charles Petzold Xamarin.Forms .
Menganimasikan Transisi Halaman
Properti Navigation
setiap halaman juga menyediakan metode pendorongan dan pop yang ditimpa yang menyertakan boolean
parameter yang mengontrol apakah akan menampilkan animasi halaman selama navigasi, seperti yang ditunjukkan dalam contoh kode berikut:
async void OnNextPageButtonClicked (object sender, EventArgs e)
{
// Page appearance not animated
await Navigation.PushModalAsync (new DetailPage (), false);
}
async void OnDismissButtonClicked (object sender, EventArgs args)
{
// Page appearance not animated
await Navigation.PopModalAsync (false);
}
boolean
Mengatur parameter untuk false
menonaktifkan animasi transisi halaman, sambil mengatur parameter untuk true
mengaktifkan animasi transisi halaman, asalkan didukung oleh platform yang mendasar. Namun, metode push dan pop yang tidak memiliki parameter ini mengaktifkan animasi secara default.
Meneruskan Data saat Menavigasi
Terkadang perlu halaman untuk meneruskan data ke halaman lain selama navigasi. Dua teknik untuk mencapai hal ini adalah dengan meneruskan data melalui konstruktor halaman, dan dengan mengatur halaman BindingContext
baru ke data. Masing-masing sekarang akan dibahas secara bergantian.
Meneruskan Data melalui Konstruktor Halaman
Teknik paling sederhana untuk meneruskan data ke halaman lain selama navigasi adalah melalui parameter konstruktor halaman, yang ditunjukkan dalam contoh kode berikut:
public App ()
{
MainPage = new MainPage (DateTime.Now.ToString ("u")));
}
Kode ini membuat instans MainPage
, melewati tanggal dan waktu saat ini dalam format ISO8601.
MainPage
Instans menerima data melalui parameter konstruktor, seperti yang ditunjukkan dalam contoh kode berikut:
public MainPage (string date)
{
InitializeComponent ();
dateLabel.Text = date;
}
Data kemudian ditampilkan di halaman dengan mengatur Label.Text
properti .
Meneruskan Data melalui BindingContext
Pendekatan alternatif untuk meneruskan data ke halaman lain selama navigasi adalah dengan mengatur halaman BindingContext
baru ke data, seperti yang ditunjukkan dalam contoh kode berikut:
async void OnItemSelected (object sender, SelectedItemChangedEventArgs e)
{
if (listView.SelectedItem != null) {
var detailPage = new DetailPage ();
detailPage.BindingContext = e.SelectedItem as Contact;
listView.SelectedItem = null;
await Navigation.PushModalAsync (detailPage);
}
}
Kode ini mengatur instans ke instans BindingContext
DetailPage
, lalu menavigasi ke DetailPage
.Contact
Kemudian DetailPage
menggunakan pengikatan data untuk menampilkan Contact
data instans, seperti yang ditunjukkan dalam contoh kode XAML berikut:
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="ModalNavigation.DetailPage">
<ContentPage.Padding>
<OnPlatform x:TypeArguments="Thickness">
<On Platform="iOS" Value="0,40,0,0" />
</OnPlatform>
</ContentPage.Padding>
<ContentPage.Content>
<StackLayout HorizontalOptions="Center" VerticalOptions="Center">
<StackLayout Orientation="Horizontal">
<Label Text="Name:" FontSize="Medium" HorizontalOptions="FillAndExpand" />
<Label Text="{Binding Name}" FontSize="Medium" FontAttributes="Bold" />
</StackLayout>
...
<Button x:Name="dismissButton" Text="Dismiss" Clicked="OnDismissButtonClicked" />
</StackLayout>
</ContentPage.Content>
</ContentPage>
Contoh kode berikut menunjukkan bagaimana pengikatan data dapat dicapai dalam C#:
public class DetailPageCS : ContentPage
{
public DetailPageCS ()
{
var nameLabel = new Label {
FontSize = Device.GetNamedSize (NamedSize.Medium, typeof(Label)),
FontAttributes = FontAttributes.Bold
};
nameLabel.SetBinding (Label.TextProperty, "Name");
...
var dismissButton = new Button { Text = "Dismiss" };
dismissButton.Clicked += OnDismissButtonClicked;
Thickness padding;
switch (Device.RuntimePlatform)
{
case Device.iOS:
padding = new Thickness(0, 40, 0, 0);
break;
default:
padding = new Thickness();
break;
}
Padding = padding;
Content = new StackLayout {
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.Center,
Children = {
new StackLayout {
Orientation = StackOrientation.Horizontal,
Children = {
new Label{ Text = "Name:", FontSize = Device.GetNamedSize (NamedSize.Medium, typeof(Label)), HorizontalOptions = LayoutOptions.FillAndExpand },
nameLabel
}
},
...
dismissButton
}
};
}
async void OnDismissButtonClicked (object sender, EventArgs args)
{
await Navigation.PopModalAsync ();
}
}
Data kemudian ditampilkan di halaman oleh serangkaian Label
kontrol.
Untuk informasi selengkapnya tentang pengikatan data, lihat Dasar-Dasar Pengikatan Data.
Ringkasan
Artikel ini menunjukkan cara menavigasi ke halaman modal. Halaman modal mendorong pengguna untuk menyelesaikan tugas mandiri yang tidak dapat dinavigasi jauh hingga tugas selesai atau dibatalkan.