Сводная информация о Главе 27. Пользовательские отрисовщики

Примечание.

Эта книга была опубликована весной 2016 года и с тех пор не обновлялась. Многое в этой книге остается ценным, но некоторые материалы устарели, а некоторые разделы перестали быть полностью верными или полными.

Элемент Xamarin.Forms, например Button, преобразуется для просмотра с помощью платформенной кнопки, инкапсулированной в класс с именем ButtonRenderer. Ниже приведены версии для iOSButtonRenderer, AndroidButtonRenderer и UWPButtonRenderer.

В этой главе рассматривается создание собственных отрисовщиков для создания пользовательских представлений, сопоставленных с платформенными объектами.

Полная иерархия классов

Существует четыре сборки, содержащих платформенный код Xamarin.Forms. Вы можете просмотреть исходный код на сайте GitHub этим ссылкам:

Примечание.

Сборки WinRT, упомянутые в книге, больше не являются частью этого решения.

В примере PlatformClassHierarchy показана иерархия классов для сборок, которые являются допустимыми для исполняющей платформы.

Обратите внимание на важный класс с именем ViewRenderer. Это класс, от которого производят наследование при создании платформенного отрисовщика. Он существует в трех разных версиях, так как он привязан к системе представления целевой платформы:

В iOS ViewRenderer<TView, TNativeView> использует универсальные аргументы:

В Android ViewRenderer<TView, TNativeView> использует универсальные аргументы:

В UWP ViewRenderer<TElement, TNativeElement> использует универсальные аргументы:

При написании отрисовщика вы получите производный класс от 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 находит отрисовщики в отдельных проектах платформы:

Тройной снимок экрана Hello View

Отрисовщики и свойства

Следующий набор отрисовщиков рисует эллипс и находится в различных проектах решения Xamarin.FormsBook.Platform.

Класс EllipseView принадлежит платформе Xamarin.FormsBook.Platform. Класс похож на BoxView и определяет только одно свойство: Color типа Color.

Отрисовщики могут передавать значения свойств, заданные для View, в собственный объект, переопределяя метод OnElementPropertyChanged в отрисовщике. В этом методе (и в большей части отрисовщиков) доступны два свойства:

  • Element, элемент Xamarin.Forms
  • Control, собственное представление, мини-приложение или управляющий объект

Типы этих свойств определяются универсальными параметрами для ViewRenderer. В этом примере Element имеет тип EllipseView.

Таким образом, переопределение OnElementPropertyChanged может переносить значение Color из Element в собственный объект Control, возможно, с какого-то рода преобразованием. Три отрисовщика:

Класс EllipseDemo отображает несколько таких объектов EllipseView:

Тройной снимок экрана с демонстрацией эллипсов

BouncingBall заставляет EllipseView отскакивать от краев экрана.

Отрисовщики и события

Кроме того, отрисовщики могут создавать события неявно. Класс StepSlider похож на обычный Xamarin.FormsSlider , но позволяет указать ряд дискретных шагов между Minimum и Maximum значениями.

Три отрисовщика:

Отрисовщики обнаруживают изменения в собственном элементе управления, а затем вызывают SetValueFromRenderer, который ссылается на свойство с привязкой, определенное в StepSlider, изменение которого заставляет StepSlider запускать событие ValueChanged.

В примере StepSliderDemo демонстрируется такой новый ползунок.