Membuat Xamarin.Forms perilaku
Xamarin.Forms perilaku dibuat dengan berasal dari kelas Perilaku atau Perilaku<T> . Artikel ini menunjukkan cara membuat dan menggunakan Xamarin.Forms perilaku.
Gambaran Umum
Proses untuk membuat Xamarin.Forms perilaku adalah sebagai berikut:
- Buat kelas yang mewarisi dari
Behavior
kelas atauBehavior<T>
, di manaT
adalah jenis kontrol yang harus diterapkan perilaku. - Ambil alih
OnAttachedTo
metode untuk melakukan penyiapan yang diperlukan. - Ambil alih
OnDetachingFrom
metode untuk melakukan pembersihan yang diperlukan. - Terapkan fungsionalitas inti perilaku.
Ini menghasilkan struktur yang ditunjukkan dalam contoh kode berikut:
public class CustomBehavior : Behavior<View>
{
protected override void OnAttachedTo (View bindable)
{
base.OnAttachedTo (bindable);
// Perform setup
}
protected override void OnDetachingFrom (View bindable)
{
base.OnDetachingFrom (bindable);
// Perform clean up
}
// Behavior implementation
}
Metode OnAttachedTo
ini ditembakkan segera setelah perilaku dilampirkan ke kontrol. Metode ini menerima referensi ke kontrol yang dilampirkan, dan dapat digunakan untuk mendaftarkan penanganan aktivitas atau melakukan penyiapan lain yang diperlukan untuk mendukung fungsionalitas perilaku. Misalnya, Anda dapat berlangganan peristiwa pada kontrol. Fungsionalitas perilaku kemudian akan diimplementasikan di penanganan aktivitas untuk peristiwa tersebut.
Metode OnDetachingFrom
ini diaktifkan ketika perilaku dihapus dari kontrol. Metode ini menerima referensi ke kontrol yang dilampirkan, dan digunakan untuk melakukan pembersihan yang diperlukan. Misalnya, Anda dapat berhenti berlangganan dari peristiwa pada kontrol untuk mencegah kebocoran memori.
Perilaku kemudian dapat dikonsumsi dengan melampirkannya ke Behaviors
kumpulan kontrol yang sesuai.
Membuat Xamarin.Forms Perilaku
Aplikasi sampel menunjukkan NumericValidationBehavior
, yang menyoroti nilai yang dimasukkan oleh pengguna ke dalam Entry
kontrol berwarna merah, jika bukan double
. Perilaku ditampilkan dalam contoh kode berikut:
public class NumericValidationBehavior : Behavior<Entry>
{
protected override void OnAttachedTo(Entry entry)
{
entry.TextChanged += OnEntryTextChanged;
base.OnAttachedTo(entry);
}
protected override void OnDetachingFrom(Entry entry)
{
entry.TextChanged -= OnEntryTextChanged;
base.OnDetachingFrom(entry);
}
void OnEntryTextChanged(object sender, TextChangedEventArgs args)
{
double result;
bool isValid = double.TryParse (args.NewTextValue, out result);
((Entry)sender).TextColor = isValid ? Color.Default : Color.Red;
}
}
Berasal NumericValidationBehavior
dari Behavior<T>
kelas , di mana T
adalah Entry
. Metode ini OnAttachedTo
mendaftarkan penanganan aktivitas untuk TextChanged
peristiwa, dengan OnDetachingFrom
metode membatalkan pendaftaran TextChanged
peristiwa untuk mencegah kebocoran memori. Fungsionalitas inti perilaku disediakan oleh OnEntryTextChanged
metode , yang menguraikan nilai yang dimasukkan oleh pengguna ke dalam Entry
, dan mengatur TextColor
properti menjadi merah jika nilainya bukan double
.
Catatan
Xamarin.Forms tidak mengatur BindingContext
perilaku, karena perilaku dapat dibagikan dan diterapkan ke beberapa kontrol melalui gaya.
Mengkonsumsi Xamarin.Forms Perilaku
Setiap Xamarin.Forms kontrol memiliki Behaviors
koleksi, di mana satu atau beberapa perilaku dapat ditambahkan, seperti yang ditunjukkan dalam contoh kode XAML berikut:
<Entry Placeholder="Enter a System.Double">
<Entry.Behaviors>
<local:NumericValidationBehavior />
</Entry.Behaviors>
</Entry>
Yang setara Entry
dalam C# ditunjukkan dalam contoh kode berikut:
var entry = new Entry { Placeholder = "Enter a System.Double" };
entry.Behaviors.Add (new NumericValidationBehavior ());
Pada runtime perilaku akan merespons interaksi dengan kontrol, sesuai dengan implementasi perilaku. Cuplikan layar berikut menunjukkan perilaku yang merespons input yang tidak valid:
Catatan
Perilaku ditulis untuk jenis kontrol tertentu (atau superkelas yang dapat berlaku untuk banyak kontrol), dan hanya boleh ditambahkan ke kontrol yang kompatibel. Mencoba melampirkan perilaku ke kontrol yang tidak kompatibel akan mengakibatkan pengecualian dilemparkan.
Mengkonsumsi Xamarin.Forms Perilaku dengan Gaya
Perilaku juga dapat dikonsumsi oleh gaya eksplisit atau implisit. Namun, membuat gaya yang mengatur Behaviors
properti kontrol tidak dimungkinkan karena properti bersifat baca-saja. Solusinya adalah menambahkan properti terlampir ke kelas perilaku yang mengontrol penambahan dan penghapusan perilaku. Prosesnya adalah sebagai berikut:
- Tambahkan properti terlampir ke kelas perilaku yang akan digunakan untuk mengontrol penambahan atau penghapusan perilaku ke kontrol tempat perilaku akan dilampirkan. Pastikan bahwa properti terlampir mendaftarkan
propertyChanged
delegasi yang akan dijalankan saat nilai properti berubah. - Buat getter
static
dan setter untuk properti terlampir. - Terapkan
propertyChanged
logika di delegasi untuk menambahkan dan menghapus perilaku.
Contoh kode berikut menunjukkan properti terlampir yang mengontrol penambahan dan penghapusan NumericValidationBehavior
:
public class NumericValidationBehavior : Behavior<Entry>
{
public static readonly BindableProperty AttachBehaviorProperty =
BindableProperty.CreateAttached ("AttachBehavior", typeof(bool), typeof(NumericValidationBehavior), false, propertyChanged: OnAttachBehaviorChanged);
public static bool GetAttachBehavior (BindableObject view)
{
return (bool)view.GetValue (AttachBehaviorProperty);
}
public static void SetAttachBehavior (BindableObject view, bool value)
{
view.SetValue (AttachBehaviorProperty, value);
}
static void OnAttachBehaviorChanged (BindableObject view, object oldValue, object newValue)
{
var entry = view as Entry;
if (entry == null) {
return;
}
bool attachBehavior = (bool)newValue;
if (attachBehavior) {
entry.Behaviors.Add (new NumericValidationBehavior ());
} else {
var toRemove = entry.Behaviors.FirstOrDefault (b => b is NumericValidationBehavior);
if (toRemove != null) {
entry.Behaviors.Remove (toRemove);
}
}
}
...
}
Kelas NumericValidationBehavior
berisi properti terlampir bernama AttachBehavior
dengan getter static
dan setter, yang mengontrol penambahan atau penghapusan perilaku ke kontrol yang akan dilampirkan. Properti terlampir ini mendaftarkan OnAttachBehaviorChanged
metode yang akan dijalankan ketika nilai properti berubah. Metode ini menambahkan atau menghapus perilaku ke kontrol, berdasarkan nilai AttachBehavior
properti terlampir.
Contoh kode berikut menunjukkan gaya eksplisit untuk NumericValidationBehavior
yang menggunakan AttachBehavior
properti terlampir, dan yang dapat diterapkan ke Entry
kontrol:
<Style x:Key="NumericValidationStyle" TargetType="Entry">
<Style.Setters>
<Setter Property="local:NumericValidationBehavior.AttachBehavior" Value="true" />
</Style.Setters>
</Style>
Style
dapat diterapkan ke kontrol dengan mengatur propertinya Style
ke Style
instans menggunakan StaticResource
ekstensi markup, seperti yang Entry
ditunjukkan dalam contoh kode berikut:
<Entry Placeholder="Enter a System.Double" Style="{StaticResource NumericValidationStyle}">
Untuk informasi selengkapnya tentang gaya, lihat Gaya.
Catatan
Meskipun Anda dapat menambahkan properti yang dapat diikat ke perilaku yang diatur atau dikueri di XAML, jika Anda membuat perilaku yang memiliki status, properti tersebut tidak boleh dibagi antara kontrol dalam Style
dalam ResourceDictionary
.
Menghapus Perilaku dari Kontrol
Metode OnDetachingFrom
ini diaktifkan ketika perilaku dihapus dari kontrol, dan digunakan untuk melakukan pembersihan yang diperlukan seperti berhenti berlangganan dari peristiwa untuk mencegah kebocoran memori. Namun, perilaku tidak secara implisit dihapus dari kontrol kecuali koleksi kontrol Behaviors
dimodifikasi oleh Remove
metode atau Clear
. Contoh kode berikut menunjukkan penghapusan perilaku tertentu dari koleksi kontrol Behaviors
:
var toRemove = entry.Behaviors.FirstOrDefault (b => b is NumericValidationBehavior);
if (toRemove != null) {
entry.Behaviors.Remove (toRemove);
}
Atau, koleksi kontrol Behaviors
dapat dibersihkan, seperti yang ditunjukkan dalam contoh kode berikut:
entry.Behaviors.Clear();
Selain itu, perhatikan bahwa perilaku tidak secara implisit dihapus dari kontrol ketika halaman dimunculkan dari tumpukan navigasi. Sebaliknya, halaman harus dihapus secara eksplisit sebelum halaman keluar dari cakupan.
Ringkasan
Artikel ini menunjukkan cara membuat dan mengonsumsi Xamarin.Forms perilaku. Xamarin.Forms perilaku dibuat dengan berasal dari Behavior
kelas atau Behavior<T>
.