Bagikan melalui


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:

  1. Buat kelas yang mewarisi dari Behavior kelas atau Behavior<T> , di mana T adalah jenis kontrol yang harus diterapkan perilaku.
  2. Ambil alih OnAttachedTo metode untuk melakukan penyiapan yang diperlukan.
  3. Ambil alih OnDetachingFrom metode untuk melakukan pembersihan yang diperlukan.
  4. 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:

Aplikasi Sampel dengan Xamarin.Forms Perilaku

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:

  1. 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.
  2. Buat getter static dan setter untuk properti terlampir.
  3. 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> .