Xamarin.Forms FlyoutPage
Halaman flyout biasanya menampilkan daftar item, seperti yang ditunjukkan pada cuplikan layar berikut:
Lokasi daftar item identik di setiap platform, dan memilih salah satu item akan menavigasi ke halaman detail yang sesuai. Selain itu, halaman flyout juga menampilkan bilah navigasi yang berisi tombol yang dapat digunakan untuk menavigasi ke halaman detail aktif:
- Di iOS, bilah navigasi ada di bagian atas halaman dan memiliki tombol yang menavigasi ke halaman detail. Selain itu, halaman detail aktif dapat dinavigasi dengan menggesekkan flyout ke kiri.
- Di Android, bilah navigasi ada di bagian atas halaman dan menampilkan judul, ikon, dan tombol yang menavigasi ke halaman detail. Ikon didefinisikan dalam
[Activity]
atribut yang menghiasiMainActivity
kelas dalam proyek khusus platform Android. Selain itu, halaman detail aktif dapat dinavigasi dengan menggesek halaman flyout ke kiri, dengan mengetuk halaman detail di ujung kanan layar, dan dengan mengetuk tombol Kembali di bagian bawah layar. - Pada Platform Windows Universal (UWP), bilah navigasi ada di bagian atas halaman dan memiliki tombol yang menavigasi ke halaman detail.
Halaman detail menampilkan data yang sesuai dengan item yang dipilih di halaman flyout, dan komponen utama halaman detail ditampilkan dalam cuplikan layar berikut:
Halaman detail berisi bilah navigasi, yang kontennya bergantung pada platform:
- Di iOS, bilah navigasi ada di bagian atas halaman dan menampilkan judul, dan memiliki tombol yang kembali ke halaman flyout, asalkan instans halaman detail dibungkus dalam
NavigationPage
instans. Selain itu, halaman flyout dapat dikembalikan dengan menggesek halaman detail ke kanan. - Di Android, bilah navigasi ada di bagian atas halaman dan menampilkan judul, ikon, dan tombol yang kembali ke halaman flyout. Ikon didefinisikan dalam
[Activity]
atribut yang menghiasiMainActivity
kelas dalam proyek khusus platform Android. - Di UWP, bilah navigasi ada di bagian atas halaman dan menampilkan judul, dan memiliki tombol yang kembali ke halaman flyout.
Perilaku navigasi
Perilaku pengalaman navigasi antara flyout dan halaman detail bergantung pada platform:
- Di iOS, halaman detail meluncur ke kanan saat halaman flyout meluncur dari kiri, dan bagian kiri halaman detail masih terlihat.
- Di Android, halaman detail dan flyout dilapisi satu sama lain.
- Pada UWP, halaman flyout meluncur dari kiri di atas bagian halaman detail, asalkan
FlyoutLayoutBehavior
properti diatur kePopover
.
Perilaku serupa akan diamati dalam mode lanskap, kecuali bahwa halaman flyout di iOS dan Android memiliki lebar yang sama dengan halaman flyout dalam mode potret, sehingga lebih banyak halaman detail akan terlihat.
Untuk informasi tentang mengontrol perilaku navigasi, lihat Mengontrol perilaku tata letak halaman detail.
Membuat FlyoutPage
Berisi FlyoutPage
Flyout
dan Detail
properti yang merupakan jenis Page
, yang digunakan untuk mendapatkan dan mengatur flyout dan halaman detail masing-masing.
Penting
dirancang FlyoutPage
untuk menjadi halaman akar, dan menggunakannya sebagai halaman anak di jenis halaman lain dapat mengakibatkan perilaku yang tidak terduga dan tidak konsisten. Selain itu, disarankan agar halaman FlyoutPage
flyout dari harus selalu menjadi ContentPage
instans, dan bahwa halaman detail hanya boleh diisi dengan TabbedPage
instans , NavigationPage
, dan ContentPage
. Ini akan membantu memastikan pengalaman pengguna yang konsisten di semua platform.
Contoh kode XAML berikut menunjukkan FlyoutPage
yang mengatur Flyout
properti dan Detail
:
<FlyoutPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="clr-namespace:FlyoutPageNavigation;assembly=FlyoutPageNavigation"
x:Class="FlyoutPageNavigation.MainPage">
<FlyoutPage.Flyout>
<local:FlyoutMenuPage x:Name="flyoutPage" />
</FlyoutPage.Flyout>
<FlyoutPage.Detail>
<NavigationPage>
<x:Arguments>
<local:ContactsPage />
</x:Arguments>
</NavigationPage>
</FlyoutPage.Detail>
</FlyoutPage>
Contoh kode berikut menunjukkan setara FlyoutPage
yang dibuat di C#:
public class MainPageCS : FlyoutPage
{
FlyoutMenuPageCS flyoutPage;
public MainPageCS()
{
flyoutPage = new FlyoutMenuPageCS();
Flyout = flyoutPage;
Detail = new NavigationPage(new ContactsPageCS());
...
}
...
}
Properti Flyout
diatur ke ContentPage
instans. Properti Detail
diatur ke yang NavigationPage
berisi ContentPage
instans.
Membuat halaman flyout
Contoh kode XAML berikut menunjukkan deklarasi FlyoutMenuPage
objek, yang direferensikan melalui Flyout
properti :
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:local="using:FlyoutPageNavigation"
x:Class="FlyoutPageNavigation.FlyoutMenuPage"
Padding="0,40,0,0"
IconImageSource="hamburger.png"
Title="Personal Organiser">
<StackLayout>
<ListView x:Name="listView" x:FieldModifier="public">
<ListView.ItemsSource>
<x:Array Type="{x:Type local:FlyoutPageItem}">
<local:FlyoutPageItem Title="Contacts" IconSource="contacts.png" TargetType="{x:Type local:ContactsPage}" />
<local:FlyoutPageItem Title="TodoList" IconSource="todo.png" TargetType="{x:Type local:TodoListPage}" />
<local:FlyoutPageItem Title="Reminders" IconSource="reminders.png" TargetType="{x:Type local:ReminderPage}" />
</x:Array>
</ListView.ItemsSource>
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<Grid Padding="5,10">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="30"/>
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<Image Source="{Binding IconSource}" />
<Label Grid.Column="1" Text="{Binding Title}" />
</Grid>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentPage>
Halaman terdiri dari ListView
yang diisi dengan data di XAML dengan mengatur propertinya ItemsSource
ke array FlyoutPageItem
objek. Masing-masing FlyoutPageItem
mendefinisikan Title
properti , IconSource
, dan TargetType
.
DataTemplate
ditetapkan ke ListView.ItemTemplate
properti , untuk menampilkan masing-masing FlyoutPageItem
. DataTemplate
berisi ViewCell
yang terdiri dari Image
dan Label
. Image
menampilkan IconSource
nilai properti, dan Label
menampilkan Title
nilai properti, untuk setiap FlyoutPageItem
.
Halaman memiliki Title
properti dan IconImageSource
yang ditetapkan. Ikon akan muncul di halaman detail, asalkan halaman detail memiliki bilah judul. Ini harus diaktifkan di iOS dengan membungkus instans halaman detail dalam NavigationPage
instans.
Contoh kode berikut menunjukkan halaman yang setara yang dibuat di C#:
public class FlyoutMenuPageCS : ContentPage
{
ListView listView;
public ListView ListView { get { return listView; } }
public FlyoutMenuPageCS()
{
var flyoutPageItems = new List<FlyoutPageItem>();
flyoutPageItems.Add(new FlyoutPageItem
{
Title = "Contacts",
IconSource = "contacts.png",
TargetType = typeof(ContactsPageCS)
});
flyoutPageItems.Add(new FlyoutPageItem
{
Title = "TodoList",
IconSource = "todo.png",
TargetType = typeof(TodoListPageCS)
});
flyoutPageItems.Add(new FlyoutPageItem
{
Title = "Reminders",
IconSource = "reminders.png",
TargetType = typeof(ReminderPageCS)
});
listView = new ListView
{
ItemsSource = flyoutPageItems,
ItemTemplate = new DataTemplate(() =>
{
var grid = new Grid { Padding = new Thickness(5, 10) };
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = new GridLength(30) });
grid.ColumnDefinitions.Add(new ColumnDefinition { Width = GridLength.Star });
var image = new Image();
image.SetBinding(Image.SourceProperty, "IconSource");
var label = new Label { VerticalOptions = LayoutOptions.FillAndExpand };
label.SetBinding(Label.TextProperty, "Title");
grid.Children.Add(image);
grid.Children.Add(label, 1, 0);
return new ViewCell { View = grid };
}),
SeparatorVisibility = SeparatorVisibility.None
};
IconImageSource = "hamburger.png";
Title = "Personal Organiser";
Padding = new Thickness(0, 40, 0, 0);
Content = new StackLayout
{
Children = { listView }
};
}
}
Cuplikan layar berikut menunjukkan halaman flyout di setiap platform:
Membuat dan menampilkan halaman detail
FlyoutMenuPage
Instans berisi ListView
properti yang mengekspos instansnya ListView
sehinggaFlyoutPage
MainPage
instans dapat mendaftarkan penanganan aktivitas untuk menangani ItemSelected
peristiwa. Ini memungkinkan instans MainPage
untuk mengatur Detail
properti ke halaman yang mewakili item yang dipilih ListView
. Contoh kode berikut menunjukkan penanganan aktivitas:
public partial class MainPage : FlyoutPage
{
public MainPage()
{
...
flyoutPage.listView.ItemSelected += OnItemSelected;
}
void OnItemSelected(object sender, SelectedItemChangedEventArgs e)
{
var item = e.SelectedItem as FlyoutPageItem;
if (item != null)
{
Detail = new NavigationPage((Page)Activator.CreateInstance(item.TargetType));
flyoutPage.listView.SelectedItem = null;
IsPresented = false;
}
}
}
Metode ini OnItemSelected
melakukan tindakan berikut:
- Ini mengambil dari
ListView
instansSelectedItem
, dan asalkan bukannull
, mengatur halaman detail ke instans baru dari jenis halaman yang disimpan diTargetType
propertiFlyoutPageItem
. Jenis halaman dibungkus dalamNavigationPage
instans untuk memastikan bahwa ikon yang dirujuk melaluiIconImageSource
properti padaFlyoutMenuPage
ditampilkan pada halaman detail di iOS. - Item terpilih dalam
ListView
diatur kenull
untuk memastikan bahwa tidak adaListView
item yang akan dipilih saatFlyoutMenuPage
berikutnya disajikan. - Halaman detail disajikan kepada pengguna dengan mengatur
FlyoutPage.IsPresented
properti kefalse
. Properti ini mengontrol apakah flyout atau halaman detail disajikan. Ini harus diatur ketrue
untuk menampilkan halaman flyout, dan untukfalse
menampilkan halaman detail.
Cuplikan layar berikut menunjukkan ContactPage
halaman detail, yang ditampilkan setelah dipilih di halaman flyout:
Mengontrol perilaku tata letak halaman detail
FlyoutPage
Bagaimana mengelola flyout dan halaman detail tergantung pada apakah aplikasi berjalan pada ponsel atau tablet, orientasi perangkat, dan nilai FlyoutLayoutBehavior
properti. Properti ini menentukan bagaimana halaman detail akan ditampilkan. Nilai yang mungkin adalah:
Default
– Halaman ditampilkan menggunakan default platform.Popover
– Halaman detail mencakup, atau sebagian mencakup halaman flyout.Split
– Halaman flyout ditampilkan di sebelah kiri dan halaman detail berada di sebelah kanan.SplitOnLandscape
– Layar terpisah digunakan saat perangkat berada dalam orientasi lanskap.SplitOnPortrait
– Layar terpisah digunakan saat perangkat berada dalam orientasi potret.
Contoh kode XAML berikut menunjukkan cara mengatur FlyoutLayoutBehavior
properti pada FlyoutPage
:
<FlyoutPage xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
x:Class="FlyoutPageNavigation.MainPage"
FlyoutLayoutBehavior="Popover">
...
</FlyoutPage>
Contoh kode berikut menunjukkan setara FlyoutPage
yang dibuat di C#:
public class MainPageCS : FlyoutPage
{
FlyoutMenuPageCS flyoutPage;
public MainPageCS()
{
...
FlyoutLayoutBehavior = FlyoutLayoutBehavior.Popover;
}
}
Penting
Nilai properti hanya memengaruhi aplikasi yang FlyoutLayoutBehavior
berjalan pada tablet atau desktop. Aplikasi yang berjalan di ponsel selalu memiliki Popover
perilaku.