Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Примечание.
Эта книга была опубликована весной 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.ViewTNativeView, связанный сUIKit.UIView
В Android ViewRenderer<TView, TNativeView> использует универсальные аргументы:
TView, связанный сXamarin.Forms.ViewTNativeView, связанный сAndroid.Views.View
В UWP ViewRenderer<TElement, TNativeElement> использует универсальные аргументы:
TElement, связанный сXamarin.Forms.ViewTNativeElement, связанный с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 демонстрируется такой новый ползунок.

