Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Примечание.
Эта книга была опубликована весной 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 демонстрируется такой новый ползунок.

