Perubahan perilaku tata letak dari Xamarin.Forms
Anda mungkin melihat saat menjalankan aplikasi .NET Multi-platform App UI (.NET MAUI) yang ditingkatkan bahwa perilaku tata letak berbeda. Beberapa di antaranya adalah hasil perubahan pada nilai penspasian tata letak. Untuk informasi selengkapnya, lihat Perubahan nilai default dari Xamarin.Forms.
Tabel berikut ini memperlihatkan perubahan perilaku tambahan antara tata letak di Xamarin.Forms dan .NET MAUI:
Tata letak | Xamarin.Forms | .NET MAUI | Rekomendasi |
---|---|---|---|
Semua | Dalam kasus tertentu, permintaan ukuran tidak dihormati. | Permintaan ukuran dihormati. | |
Grid | Kolom dan baris dapat disimpulkan dari XAML. | Kolom dan baris harus dideklarasikan secara eksplisit. | Tambahkan ColumnDefinitions dan RowDefinitions. |
HorizontalStackLayout | *AndExpand tidak berpengaruh. |
||
RelativeLayout | Memerlukan namespace kompatibilitas. | Gunakan Grid sebagai gantinya xmlns , atau tambahkan untuk namespace kompatibilitas. |
|
StackLayout | Anak-anak dapat mengisi ruang ke arah tumpukan. | Anak-anak ditumpuk dan akan melampaui ruang yang tersedia. | Jika Anda memerlukan tampilan anak untuk mengisi ruang, ubah ke Grid. |
VerticalStackLayout | *AndExpand tidak berpengaruh. |
Kontrol MAUI .NET umumnya menghormati permintaan ukuran eksplisit. Jika Anda meminta kontrol menjadi 200 unit independen perangkat, maka .NET MAUI akan membuat kontrol tersebut lebar 200 unit, bahkan jika kontainer kontrol hanya lebar 100 unit.
Perubahan nilai tata letak default dari Xamarin.Forms
Xamarin.Forms menggunakan nilai default arbitrer untuk beberapa nilai properti, seperti padding, margin, dan spasi. .NET MAUI mengubah nilai properti arbitrer ini menjadi nol.
Untuk mempertahankan nilai default Xamarin.Forms dalam proyek yang tidak mengatur nilai eksplisit, tambahkan gaya implisit ke proyek Anda. Untuk informasi selengkapnya tentang gaya implisit, lihat Gaya implisit.
Catatan
Templat proyek .NET MAUI menyertakan kamus sumber daya yang menyediakan gaya default untuk sebagian besar kontrol. Sebaiknya Anda mengambil pendekatan serupa di aplikasi Anda, dengan memodifikasi atau mewarisi dari kamus sumber daya ini.
Tabel berikut mencantumkan nilai properti tata letak yang telah berubah antara Xamarin.Forms dan .NET MAUI:
Properti | Nilai Xamarin.Forms | Nilai .NET MAUI |
---|---|---|
Grid.ColumnSpacing |
6 | 0 |
Grid.RowSpacing |
6 | 0 |
StackLayout.Spacing |
6 | 0 |
Gaya berikut mempertahankan default Xamarin.Forms:
<!-- Forms defaults -->
<Style TargetType="Grid">
<Setter Property="ColumnSpacing" Value="6"/>
<Setter Property="RowSpacing" Value="6"/>
</Style>
<Style TargetType="StackLayout">
<Setter Property="Spacing" Value="6"/>
</Style>
<Style TargetType="Frame">
<Setter Property="Padding" Value="{OnPlatform 20,iOS=19}"/>
</Style>
Menengah
Frame telah diganti dalam .NET MAUI oleh Border. Namun, ini termasuk untuk memudahkan migrasi dari Xamarin.Forms. Tata letak MAUI .NET mengukur Frame Padding
dengan benar di semua platform, sedangkan Xamarin.Forms memiliki beberapa perbedaan di seluruh platform. Ini dapat mengakibatkan aplikasi Anda tidak terlihat sama di .NET MAUI. Contoh di atas memperkirakan hal ini jika Anda menggunakan nilai default.
Kisi
Perubahan terbesar dalam Grid perilaku antara Xamarin.Forms dan .NET MAUI adalah bahwa kisi tidak secara otomatis menambahkan baris dan kolom yang hilang untuk Anda. Misalnya, di Xamarin.Forms Anda dapat menambahkan kontrol ke Grid tanpa menentukan perilaku barisnya:
<Grid>
<Label Text="Hello"/>
<Label Grid.Row="1" Text="World"/>
</Grid>
Dalam Xamarin.Forms, meskipun tidak menyatakan bahwa Grid berisi dua baris, baris kedua akan secara otomatis ditambahkan untuk Anda. .NET MAUI tidak melakukan ini. Sebagai gantinya, Anda harus secara eksplisit menentukan berapa banyak baris yang ada di Grid dengan RowDefinitions
properti .
Penting
Secara default, .NET MAUI membuat Grid dengan satu kolom dan satu baris. Oleh karena itu, tidak perlu mengatur ColumnDefinitions
properti dan RowDefinitions
jika ini adalah niat Anda.
Dalam Xamarin.Forms, ketika berada Label
di kolom tempat lebarnya ColumnDefinition
diatur ke Auto
, pemisah baris seperti pembungkus kata dan pemotongan ekor secara implisit terjadi. Di .NET MAUI, dalam skenario ini hentian baris tidak secara implisit terjadi karena kolom meluas melewati lebar layar untuk mengakomodasi konten anak. Jika Anda ingin Label membungkus di tepi Grid , Anda harus mengatur yang sesuai ColumnDefinition
ke salah satu *
atau nilai.
StackLayout
Ada beberapa perbedaan antara tata letak tumpukan di .NET MAUI (StackLayout, VerticalStackLayout, dan HorizontalStackLayout) dan StackLayout
dalam Xamarin.Forms.
Perbedaan utamanya adalah tata letak tumpukan .NET MAUI sangat sederhana. Mereka menumpuk tampilan anak mereka ke satu arah sampai semuanya telah ditumpuk. Mereka akan terus berjalan sampai anak terakhir ditumpuk, bahkan jika itu membawanya melampaui ruang yang tersedia ke arah tumpukan. Oleh karena itu, tata letak tumpukan .NET MAUI mengatur kontrol ke arah tertentu. Mereka tidak membahayakan ruang. Ini sama sekali berbeda dengan Xamarin.Forms StackLayout
, yang mengubah perilaku tata letaknya berdasarkan keadaan dan adanya opsi tata letak apa pun *AndExpand
, seperti FillAndExpand
atau CenterAndExpand
. Xamarin.Forms StackLayout
terkadang membagi ruang, memperluas ke atau berhenti di tepi kontainernya. Dalam kasus lain, ia memperluas di luar kontainernya.
Tata letak tumpukan baru di .NET MAUI, HorizontalStackLayout dan VerticalStackLayout, tidak mengenali *AndExpand
opsi tata letak. Jika mereka menemukan anak dengan opsi tata letak seperti itu, mereka hanya memperlakukannya seolah-olah AndExpand
tidak ada. Misalnya, FillAndExpand
menjadi Fill
. Namun, untuk kesederhanaan migrasi dari Xamarin.Forms, .NET MAUI StackLayout menghormati *AndExpand
opsi tata letak, meskipun telah ditandai sebagai usang. Untuk menghindari peringatan tentang menggunakan anggota usang, Anda harus mengonversi tata letak yang menggunakan *AndExpand
opsi tata letak ke jenis tata letak yang sesuai. dapat dicapai sebagai berikut:
Jika tata letak Anda adalah apa pun selain StackLayout, hapus semua penggunaan
AndExpand
. Sama seperti dalam Xamarin.Forms, di .NET MAUIAndExpand
opsi tata letak tidak berpengaruh pada tata letak apa pun selain StackLayout.Hapus properti apa pun
AndExpand
yang ortogonal ke arah tumpukan. Misalnya, jika Anda memiliki StackLayout denganOrientation
,Vertical
dan memiliki anak denganHorizontalAligment="CenterAndExpand"
- opsi tata letak tersebut tidak berpengaruh dan dapat dihapus.Jika Anda memiliki properti yang tersisa
AndExpand
pada , Anda harus mengonversinya StackLayout menjadi GridStackLayout. A Grid dirancang untuk membahayakan ruang, dan akan menyediakan tata letak yangAndExpand
disediakan dalam Xamarin.Forms. Contoh berikut menunjukkan Xamarin.FormsStackLayout
yang menggunakanAndExpand
properti:<StackLayout> <Label Text="Hello world!"/> <Image VerticalOptions="FillAndExpand" Source="dotnetbot.png"/> </StackLayout>
Ini dapat dikonversi ke Grid dalam .NET MAUI:
<Grid RowDefinitions="Auto, *"> <Label Text="Hello world!"/> <Image Grid.Row="1" Source="dotnetbot.png"/> </Grid>
Saat melakukan konversi ini, apa pun yang ditandai
AndExpand
dalamStackLayout
harus masuk ke baris atau kolomnya sendiri dengan ukuran*
dalam Grid.
Penting
Berlanjut StackLayout ke arah tumpukannya sampai kehabisan konten. Ini tidak membagi kontainernya di sepanjang sumbu tersebut. Jika Anda ingin membatasi konten Anda ke ruang terbatas ke arah, Anda harus menggunakan tata letak lain seperti Grid.
RelativeLayout
Penggunaan RelativeLayout tidak disarankan dalam .NET MAUI. Sebagai gantinya, gunakan sedapat Grid mungkin.
Jika Anda benar-benar memerlukan RelativeLayout, itu dapat ditemukan di Microsoft.Maui.Controls.Compatibility
namespace:
<ContentPage xmlns="http://schemas.microsoft.com/dotnet/2021/maui"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:compat="clr-namespace:Microsoft.Maui.Controls.Compatibility;assembly=Microsoft.Maui.Controls"
x:Class="MyMauiApp.MyPage"
Title="MyPage">
<compat:RelativeLayout>
<!-- Your code goes here -->
</compat:RelativeLayout>
</ContentPage>
ScrollView
Meskipun ScrollView sering kali tidak dianggap sebagai tata letak, tata letak dapat dianggap sebagai tata letak seperti yang digunakan untuk menggulir konten anaknya. Dalam Xamarin.Forms, ScrollView
tidak bertingkah konsisten saat menumpuk. Ini memiliki beberapa batas arbitrer pada ukuran minimum yang bergantung sebagian pada kontennya, dan kadang-kadang akan memadatkan untuk memungkinkan item lain agar pas di halaman di dalam StackLayout
dengan cara yang tidak konsisten dan kadang-kadang mengejutkan.
Di .NET MAUI, ScrollView meluas ke ukuran apa pun yang diinginkannya kecuali dibatasi. Ini berarti bahwa di dalam VerticalStackLayout, yang dapat berkembang tanpa batas, ScrollView akan meluas ke tinggi konten lengkapnya dan tidak menggulir. Perilaku ini bisa membingungkan jika Anda adalah pengguna Xamarin.Forms.