Сводная информация о Главе 27. Пользовательские отрисовщики
Примечание.
Эта книга была опубликована весной 2016 года и с тех пор не обновлялась. Многое в этой книге остается ценным, но некоторые материалы устарели, а некоторые разделы перестали быть полностью верными или полными.
Элемент Xamarin.Forms, например Button
, преобразуется для просмотра с помощью платформенной кнопки, инкапсулированной в класс с именем ButtonRenderer
. Ниже приведены версии для iOSButtonRenderer
, AndroidButtonRenderer
и UWPButtonRenderer
.
В этой главе рассматривается создание собственных отрисовщиков для создания пользовательских представлений, сопоставленных с платформенными объектами.
Полная иерархия классов
Существует четыре сборки, содержащих платформенный код Xamarin.Forms. Вы можете просмотреть исходный код на сайте GitHub этим ссылкам:
- Xamarin.Forms.Platform (очень короткий)
- Xamarin.Forms.Platform.iOS
- Xamarin.Forms.Platform.Android
- Xamarin.Forms.Platform.UAP
Примечание.
Сборки WinRT
, упомянутые в книге, больше не являются частью этого решения.
В примере PlatformClassHierarchy показана иерархия классов для сборок, которые являются допустимыми для исполняющей платформы.
Обратите внимание на важный класс с именем ViewRenderer
. Это класс, от которого производят наследование при создании платформенного отрисовщика. Он существует в трех разных версиях, так как он привязан к системе представления целевой платформы:
В iOS ViewRenderer<TView, TNativeView>
использует универсальные аргументы:
TView
, связанный сXamarin.Forms.View
TNativeView
, связанный сUIKit.UIView
В Android ViewRenderer<TView, TNativeView>
использует универсальные аргументы:
TView
, связанный сXamarin.Forms.View
TNativeView
, связанный сAndroid.Views.View
В UWP ViewRenderer<TElement, TNativeElement>
использует универсальные аргументы:
TElement
, связанный сXamarin.Forms.View
TNativeElement
, связанный сWindows.UI.Xaml.FrameworkElement
При написании отрисовщика вы получите производный класс от View
, а затем запишете несколько ViewRenderer
классов, по одному для каждой поддерживаемой платформы. Каждая платформенная реализация будет ссылаться на собственный класс, производный от типа, указанного в качестве параметра TNativeView
или TNativeElement
.
Пользовательские отрисовщики
Программа HelloRenderers ссылается на пользовательское представление с именем HelloView
в своем классе App
.
Класс HelloView
включен в проект HelloRenderers и просто является производным от View
.
Класс HelloViewRenderer
в проекте HelloRenderers.iOS является производным от ViewRenderer<HelloView, UILabel>
. В переопределении OnElementChanged
создается собственная iOS UILabel
и вызывается SetNativeControl
.
Класс HelloViewRenderer
в проекте HelloRenderers.Droid является производным от ViewRenderer<HelloView, TextView>
. В переопределении OnElementChanged
создается Android TextView
и вызывается SetNativeControl
.
Класс HelloViewRenderer
в HelloRenderers.UWP и других проектах Windows является производным от ViewRenderer<HelloView, TextBlock>
. В переопределении OnElementChanged
создается Windows TextBlock
и вызывается SetNativeControl
.
Все производные от ViewRenderer
содержат атрибут ExportRenderer
на уровне сборки, связывающий класс HelloView
с определенным классом HelloViewRenderer
. Таким образом Xamarin.Forms находит отрисовщики в отдельных проектах платформы:
Отрисовщики и свойства
Следующий набор отрисовщиков рисует эллипс и находится в различных проектах решения Xamarin.FormsBook.Platform.
Класс EllipseView
принадлежит платформе Xamarin.FormsBook.Platform. Класс похож на BoxView
и определяет только одно свойство: Color
типа Color
.
Отрисовщики могут передавать значения свойств, заданные для View
, в собственный объект, переопределяя метод OnElementPropertyChanged
в отрисовщике. В этом методе (и в большей части отрисовщиков) доступны два свойства:
Element
, элемент Xamarin.FormsControl
, собственное представление, мини-приложение или управляющий объект
Типы этих свойств определяются универсальными параметрами для ViewRenderer
. В этом примере Element
имеет тип EllipseView
.
Таким образом, переопределение OnElementPropertyChanged
может переносить значение Color
из Element
в собственный объект Control
, возможно, с какого-то рода преобразованием. Три отрисовщика:
- iOS —
EllipseViewRenderer
, который для отрисовки эллипса использует классEllipseUIView
. - Android —
EllipseViewRenderer
, который использует классEllipseDrawableView
для отрисовки эллипса. - UWP —
EllipseViewRenderer
, который может использовать собственный класс WindowsEllipse
.
Класс EllipseDemo отображает несколько таких объектов EllipseView
:
BouncingBall заставляет EllipseView
отскакивать от краев экрана.
Отрисовщики и события
Кроме того, отрисовщики могут создавать события неявно. Класс StepSlider
похож на обычный Xamarin.FormsSlider
, но позволяет указать ряд дискретных шагов между Minimum
и Maximum
значениями.
Три отрисовщика:
- iOS:
StepSliderRenderer
- Android:
StepSliderRenderer
- UWP:
StepSliderRenderer
Отрисовщики обнаруживают изменения в собственном элементе управления, а затем вызывают SetValueFromRenderer
, который ссылается на свойство с привязкой, определенное в StepSlider
, изменение которого заставляет StepSlider
запускать событие ValueChanged
.
В примере StepSliderDemo демонстрируется такой новый ползунок.