Bagikan melalui


Pengantar Perender Kustom

Perender kustom memberikan pendekatan yang kuat untuk menyesuaikan tampilan dan perilaku Xamarin.Forms kontrol. Mereka dapat digunakan untuk perubahan gaya kecil atau penyesuaian tata letak dan perilaku khusus platform yang canggih. Artikel ini menyediakan pengenalan perender kustom, dan menguraikan proses untuk membuat perender kustom.

Xamarin.FormsHalaman, Tata Letak, dan Kontrol menyajikan API umum untuk menjelaskan antarmuka pengguna seluler lintas platform. Setiap halaman, tata letak, dan kontrol dirender secara berbeda di setiap platform, menggunakan Renderer kelas yang pada gilirannya membuat kontrol asli (sesuai dengan Xamarin.Forms representasi), mengaturnya di layar, dan menambahkan perilaku yang ditentukan dalam kode bersama.

Pengembang dapat menerapkan kelas kustom Renderer mereka sendiri untuk menyesuaikan tampilan dan/atau perilaku kontrol. Perender kustom untuk jenis tertentu dapat ditambahkan ke satu proyek aplikasi untuk menyesuaikan kontrol di satu tempat sambil memungkinkan perilaku default pada platform lain; atau perender kustom yang berbeda dapat ditambahkan ke setiap proyek aplikasi untuk membuat tampilan dan nuansa yang berbeda di iOS, Android, dan Platform Windows Universal (UWP). Namun, menerapkan kelas perender kustom untuk melakukan penyesuaian kontrol sederhana sering kali merupakan respons berat. Efek menyederhanakan proses ini, dan biasanya digunakan untuk perubahan gaya kecil. Untuk informasi selengkapnya, lihat Efek.

Memeriksa Mengapa Perender Kustom Diperlukan

Mengubah tampilan Xamarin.Forms kontrol, tanpa menggunakan perender kustom, adalah proses dua langkah yang melibatkan pembuatan kontrol kustom melalui subkelas, lalu menggunakan kontrol kustom sebagai pengganti kontrol asli. Contoh kode berikut menunjukkan contoh subkelas Entry kontrol:

public class MyEntry : Entry
{
  public MyEntry ()
  {
    BackgroundColor = Color.Gray;
  }
}

Kontrol MyEntry adalah Entry kontrol di mana BackgroundColor diatur ke abu-abu, dan dapat direferensikan di Xaml dengan mendeklarasikan namespace untuk lokasinya dan menggunakan awalan namespace pada elemen kontrol. Contoh kode berikut menunjukkan bagaimana MyEntry kontrol kustom dapat dikonsumsi oleh ContentPage:

<ContentPage
    ...
    xmlns:local="clr-namespace:CustomRenderer;assembly=CustomRenderer"
    ...>
    ...
    <local:MyEntry Text="In Shared Code" />
    ...
</ContentPage>

Awalan local namespace bisa apa saja. Namun, namespace nilai dan assembly harus cocok dengan detail kontrol kustom. Setelah namespace dinyatakan, awalan digunakan untuk mereferensikan kontrol kustom.

Catatan

Menentukan xmlns jauh lebih sederhana dalam proyek pustaka .NET Standard daripada Proyek Bersama. Pustaka .NET Standard dikompilasi ke dalam rakitan sehingga mudah untuk menentukan nilainya assembly=CustomRenderer . Saat menggunakan Proyek Bersama, semua aset bersama (termasuk XAML) dikompilasi ke dalam setiap proyek referensi, yang berarti bahwa jika proyek iOS, Android, dan UWP memiliki nama rakitan mereka sendiri, tidak mungkin untuk menulis xmlns deklarasi karena nilainya harus berbeda untuk setiap aplikasi. Kontrol kustom di XAML untuk Proyek Bersama akan mengharuskan setiap proyek aplikasi dikonfigurasi dengan nama rakitan yang sama.

MyEntry Kontrol kustom kemudian dirender pada setiap platform, dengan latar belakang abu-abu, seperti yang ditunjukkan pada cuplikan layar berikut:

MyEntry Custom Control on each Platform

Mengubah warna latar belakang kontrol pada setiap platform telah dicapai murni melalui subkelas kontrol. Namun, teknik ini terbatas pada apa yang dapat dicapai karena tidak mungkin untuk memanfaatkan penyempurnaan dan penyesuaian khusus platform. Ketika diperlukan, perender kustom harus diimplementasikan.

Membuat Kelas Perender Kustom

Proses untuk membuat kelas perender kustom adalah sebagai berikut:

  1. Buat subkelas kelas perender yang merender kontrol asli.
  2. Ambil alih metode yang merender kontrol asli dan logika tulis untuk menyesuaikan kontrol. Seringkali, OnElementChanged metode ini digunakan untuk merender kontrol asli, yang dipanggil ketika kontrol yang Xamarin.Forms sesuai dibuat.
  3. ExportRenderer Tambahkan atribut ke kelas perender kustom untuk menentukan bahwa atribut tersebut akan digunakan untuk merender Xamarin.Forms kontrol. Atribut ini digunakan untuk mendaftarkan perender kustom dengan Xamarin.Forms.

Catatan

Untuk sebagian besar Xamarin.Forms elemen, adalah opsional untuk menyediakan perender kustom di setiap proyek platform. Jika perender kustom tidak terdaftar, maka perender default untuk kelas dasar kontrol akan digunakan. Namun, perender kustom diperlukan dalam setiap proyek platform saat merender elemen View atau ViewCell .

Topik dalam seri ini akan memberikan demonstrasi dan penjelasan tentang proses ini untuk elemen yang berbeda Xamarin.Forms .

Pemecahan Masalah

Jika kontrol kustom terkandung dalam proyek pustaka .NET Standard yang telah ditambahkan ke solusi (yaitu bukan pustaka .NET Standard yang dibuat oleh templat proyek Visual Studio untuk Mac/Visual Studio Xamarin.Forms App), pengecualian dapat terjadi di iOS saat mencoba mengakses kontrol kustom. Jika masalah ini terjadi, masalah ini dapat diselesaikan dengan membuat referensi ke kontrol kustom dari AppDelegate kelas:

var temp = new ClassInPCL(); // in AppDelegate, but temp not used anywhere

Ini memaksa pengkompilasi untuk mengenali ClassInPCL jenis dengan menyelesaikannya. Atau, Preserve atribut dapat ditambahkan ke AppDelegate kelas untuk mencapai hasil yang sama:

[assembly: Preserve (typeof (ClassInPCL))]

Ini membuat referensi ke ClassInPCL jenis , menunjukkan bahwa itu diperlukan pada runtime. Untuk informasi selengkapnya, lihat Mempertahankan Kode.

Ringkasan

Artikel ini telah memberikan pengenalan perender kustom, dan telah menguraikan proses untuk membuat perender kustom. Perender kustom memberikan pendekatan yang kuat untuk menyesuaikan tampilan dan perilaku Xamarin.Forms kontrol. Mereka dapat digunakan untuk perubahan gaya kecil atau penyesuaian tata letak dan perilaku khusus platform yang canggih.