Podsumowanie rozdziału 27. Niestandardowe programy renderujące
Uwaga
Ta książka została opublikowana wiosną 2016 roku i od tego czasu nie została zaktualizowana. Jest wiele w książce, która pozostaje cenna, ale niektóre materiały są nieaktualne, a niektóre tematy nie są już całkowicie poprawne ani kompletne.
Element Xamarin.Forms taki jak Button
jest renderowany za pomocą przycisku specyficznego dla platformy hermetyzowanego w klasie o nazwie ButtonRenderer
. Poniżej przedstawiono wersję systemu iOS systemu ButtonRenderer
, wersję systemu Android systemu ButtonRenderer
i wersję platformy UWP systemu ButtonRenderer
.
W tym rozdziale omówiono sposób pisania własnych modułów renderujących w celu utworzenia niestandardowych widoków mapowanych na obiekty specyficzne dla platformy.
Kompletna hierarchia klas
Istnieją cztery zestawy zawierające Xamarin.Forms kod specyficzny dla platformy. Źródło można wyświetlić w witrynie GitHub, korzystając z następujących linków:
- Xamarin.Forms. Platforma (bardzo mała)
- Xamarin.Forms. Platform.iOS
- Xamarin.Forms. Platform.Android
- Xamarin.Forms. Platform.UAP
Uwaga
Zestawy WinRT
wymienione w książce nie są już częścią tego rozwiązania.
Przykład PlatformClassHierarchy przedstawia hierarchię klas dla zestawów, które są prawidłowe dla platformy wykonawczej.
Zauważysz ważną klasę o nazwie ViewRenderer
. Jest to klasa, z której pochodzisz podczas tworzenia modułu renderowania specyficznego dla platformy. Istnieje w trzech różnych wersjach, ponieważ jest on powiązany z systemem wyświetlania platformy docelowej:
System iOS ViewRenderer<TView, TNativeView>
ma ogólne argumenty:
TView
ograniczone doXamarin.Forms.View
TNativeView
ograniczone doUIKit.UIView
System Android ViewRenderer<TView, TNativeView>
ma ogólne argumenty:
TView
ograniczone doXamarin.Forms.View
TNativeView
ograniczone doAndroid.Views.View
Platforma UWP ViewRenderer<TElement, TNativeElement>
ma inaczej nazwane argumenty ogólne:
TElement
ograniczone doXamarin.Forms.View
TNativeElement
ograniczone doWindows.UI.Xaml.FrameworkElement
Podczas pisania modułu renderowania będziesz wyprowadzać klasę z View
klasy , a następnie pisać wiele ViewRenderer
klas, po jednym dla każdej obsługiwanej platformy. Każda implementacja specyficzna dla platformy będzie odwoływać się do klasy natywnej pochodzącej z typu określonego jako parametru TNativeView
lub TNativeElement
.
Witaj, niestandardowe programy renderowania!
Program HelloRenderers odwołuje się do widoku niestandardowego o nazwie HelloView
w swojej App
klasie.
Klasa HelloView
jest uwzględniona w projekcie HelloRenderers i po prostu pochodzi z klasy View
.
Klasa HelloViewRenderer
w projekcie HelloRenderers.iOS pochodzi z klasy ViewRenderer<HelloView, UILabel>
. W zastąpieniu OnElementChanged
tworzy natywny system iOS UILabel
i wywołuje metodę SetNativeControl
.
Klasa HelloViewRenderer
w projekcie HelloRenderers.Droid pochodzi z klasy ViewRenderer<HelloView, TextView>
. W zastąpieniu OnElementChanged
tworzy system Android TextView
i wywołuje metodę SetNativeControl
.
Klasa HelloViewRenderer
w projektach HelloRenderers.UWP i innych projektach systemu Windows pochodzi z klasy ViewRenderer<HelloView, TextBlock>
. W zastąpieniu OnElementChanged
tworzy system Windows TextBlock
i wywołuje metodę SetNativeControl
.
ViewRenderer
Wszystkie pochodne zawierają atrybut na poziomie zestawu, który kojarzy HelloView
klasę ExportRenderer
z określoną HelloViewRenderer
klasą. W ten sposób Xamarin.Forms lokalizuje programy renderowane w poszczególnych projektach platformy:
Programy renderowania i właściwości
Następny zestaw modułów renderujących implementuje rysunek wielokropka i znajduje się w różnych projektach Xamarin.Formsrozwiązania Book.Platform.
Klasa EllipseView
znajduje się na Xamarin.Formsplatformie Book.Platform . Klasa jest podobna do BoxView
i definiuje tylko jedną właściwość: Color
typu Color
.
Programy renderujące mogą przenosić wartości właściwości ustawione na View
obiekt macierzysty przez zastąpienie OnElementPropertyChanged
metody w programie renderujący. W ramach tej metody (i w większości modułu renderowania) dostępne są dwie właściwości:
Element
Xamarin.Forms, elementControl
, widok macierzysty lub widżet lub obiekt sterujący
Typy tych właściwości są określane przez parametry ogólne do ViewRenderer
. W tym przykładzie Element
jest typu EllipseView
.
Przesłonięcia OnElementPropertyChanged
mogą zatem przenieść Color
wartość Element
obiektu natywnego Control
, prawdopodobnie z jakąś konwersją. Trzy programy renderowania to:
- iOS:
EllipseViewRenderer
, który używaEllipseUIView
klasy wielokropka. - Android:
EllipseViewRenderer
, który używaEllipseDrawableView
klasy wielokropka. - PLATFORMA UWP:
EllipseViewRenderer
, która może używać natywnej klasy systemu WindowsEllipse
.
Klasa EllipseDemo wyświetla kilka z tych EllipseView
obiektów:
BouncingBall odbija się EllipseView
od boków ekranu.
Programy renderowania i zdarzenia
Możliwe jest również, aby programy renderowane pośrednio generowały zdarzenia. Klasa jest podobna StepSlider
do normalnego Xamarin.FormsSlider
, ale umożliwia określenie kilku dyskretnych kroków między wartościami Minimum
i Maximum
.
Trzy programy renderowania to:
- Ios:
StepSliderRenderer
- Android:
StepSliderRenderer
- Platforma UWP:
StepSliderRenderer
Programy renderujące wykrywają zmiany w kontrolce natywnej, a następnie wywołują SetValueFromRenderer
metodę , która odwołuje się do właściwości możliwej do powiązania zdefiniowanej w elemencie StepSlider
, co powoduje StepSlider
wyzwolenie ValueChanged
zdarzenia.
Przykład StepSliderDemo pokazuje ten nowy suwak.