Ringkasan Bab 27. Perender kustom
Catatan
Buku ini diterbitkan pada musim semi 2016, dan belum diperbarui sejak saat itu. Ada banyak dalam buku yang tetap berharga, tetapi beberapa materi sudah kedaluarsa, dan beberapa topik tidak lagi sepenuhnya benar atau lengkap.
Xamarin.Forms Elemen seperti Button
dirender dengan tombol khusus platform yang dienkapsulasi di kelas bernama ButtonRenderer
. Berikut adalah versi iOS dariButtonRenderer
, versi Android dari ButtonRenderer
, dan versi UWP dari ButtonRenderer
.
Bab ini membahas bagaimana Anda dapat menulis perender Anda sendiri untuk membuat tampilan kustom yang memetakan ke objek khusus platform.
Hierarki kelas lengkap
Ada empat rakitan yang berisi Xamarin.Forms kode khusus platform. Anda dapat melihat sumber di GitHub menggunakan tautan ini:
- Xamarin.Forms. Platform (sangat kecil)
- Xamarin.Forms. Platform.iOS
- Xamarin.Forms. Platform.Android
- Xamarin.Forms. Platform.UAP
Catatan
WinRT
Rakitan yang disebutkan dalam buku tidak lagi menjadi bagian dari solusi ini.
Sampel PlatformClassHierarchy menampilkan hierarki kelas untuk rakitan yang valid untuk platform yang mengeksekusi.
Anda akan melihat kelas penting bernama ViewRenderer
. Ini adalah kelas yang Anda dapatkan saat membuat perender khusus platform. Ini ada dalam tiga versi yang berbeda, karena terikat dengan sistem tampilan platform target:
iOS ViewRenderer<TView, TNativeView>
memiliki argumen generik:
TView
dibatasi keXamarin.Forms.View
TNativeView
dibatasi keUIKit.UIView
Android ViewRenderer<TView, TNativeView>
memiliki argumen generik:
TView
dibatasi keXamarin.Forms.View
TNativeView
dibatasi keAndroid.Views.View
UWP ViewRenderer<TElement, TNativeElement>
memiliki argumen generik bernama berbeda:
TElement
dibatasi keXamarin.Forms.View
TNativeElement
dibatasi keWindows.UI.Xaml.FrameworkElement
Saat menulis perender, Anda akan mendapatkan kelas dari View
, dan kemudian menulis beberapa ViewRenderer
kelas, satu untuk setiap platform yang didukung. Setiap implementasi khusus platform akan mereferensikan kelas asli yang berasal dari jenis yang Anda tentukan sebagai TNativeView
parameter atau TNativeElement
.
Halo, penyaji kustom!
Program HelloRenderers mereferensikan tampilan kustom bernama HelloView
di kelasnya App
.
Kelas HelloView
ini termasuk dalam proyek HelloRenderers dan hanya berasal dari View
.
Kelas HelloViewRenderer
dalam proyek HelloRenderers.iOS berasal dari ViewRenderer<HelloView, UILabel>
. Dalam penimpaan OnElementChanged
, ini membuat iOS UILabel
asli dan memanggil SetNativeControl
.
Kelas HelloViewRenderer
dalam proyek HelloRenderers.Droid berasal dari ViewRenderer<HelloView, TextView>
. Dalam penimpaan OnElementChanged
, ia membuat Android TextView
dan memanggil SetNativeControl
.
Kelas HelloViewRenderer
di HelloRenderers.UWP dan proyek Windows lainnya berasal dari ViewRenderer<HelloView, TextBlock>
. Dalam penimpaan OnElementChanged
, ia membuat Windows TextBlock
dan memanggil SetNativeControl
.
Semua turunan ViewRenderer
berisi ExportRenderer
atribut pada tingkat perakitan yang mengaitkan HelloView
kelas dengan kelas tertentu HelloViewRenderer
. Ini adalah cara Xamarin.Forms menemukan perender dalam proyek platform individual:
Perender dan properti
Set perender berikutnya mengimplementasikan gambar elips, dan terletak di berbagai proyek Xamarin.Formssolusi Book.Platform.
Kelas EllipseView
berada di Xamarin.Formsplatform Book.Platform . Kelas ini mirip BoxView
dengan dan hanya mendefinisikan satu properti: Color
dari jenis Color
.
Perender dapat mentransfer nilai properti yang View
diatur pada ke objek asli dengan mengambil alih OnElementPropertyChanged
metode dalam perender. Dalam metode ini (dan di sebagian besar perender), dua properti tersedia:
Element
Xamarin.Forms, elemenControl
, tampilan asli atau widget atau objek kontrol
Jenis properti ini ditentukan oleh parameter generik ke ViewRenderer
. Dalam contoh ini, Element
berjenis EllipseView
.
Oleh karena ituOnElementPropertyChanged
, penimpaan Element
dapat mentransfer Color
nilai ke objek asliControl
, mungkin dengan semacam konversi. Ketiga perender tersebut adalah:
- iOS:
EllipseViewRenderer
, yang menggunakanEllipseUIView
kelas untuk elips. - Android:
EllipseViewRenderer
, yang menggunakanEllipseDrawableView
kelas untuk elips. - UWP:
EllipseViewRenderer
, yang dapat menggunakan kelas WindowsEllipse
asli.
Kelas EllipseDemo menampilkan beberapa objek ini EllipseView
:
BouncingBall memantul EllipseView
dari sisi layar.
Perender dan peristiwa
Dimungkinkan juga bagi perender untuk secara tidak langsung menghasilkan peristiwa. Kelas StepSlider
ini mirip dengan normal Xamarin.FormsSlider
tetapi memungkinkan menentukan sejumlah langkah diskrit antara Minimum
nilai dan Maximum
.
Ketiga perender tersebut adalah:
- iOS:
StepSliderRenderer
- Android:
StepSliderRenderer
- UWP:
StepSliderRenderer
Perender mendeteksi perubahan pada kontrol asli, lalu memanggil SetValueFromRenderer
, yang mereferensikan properti yang dapat diikat yang ditentukan dalam StepSlider
, perubahan yang menyebabkan StepSlider
peristiwa diaktifkan ValueChanged
.
Sampel StepSliderDemo menunjukkan slider baru ini.