Настройка элемента управления Entry
Элемент управления Xamarin.Forms Entry допускает редактирование одной строки текста. В этой статье показано, как создать пользовательский отрисовщик для элемента управления Entry, чтобы переопределить собственный способ отрисовки по умолчанию с помощью настройки для конкретной платформы.
Каждый элемент управления Xamarin.Forms имеет сопутствующий отрисовщик для каждой платформы, который создает экземпляр собственного элемента управления. Когда элемент управления Entry
отображается в приложении Xamarin.Forms, в iOS создается экземпляр класса EntryRenderer
, который, в свою очередь, создает собственный элемент управления UITextField
. На платформе Android класс EntryRenderer
создает элемент управления EditText
. На универсальной платформе Windows (UWP) класс EntryRenderer
создает элемент управления TextBox
. Дополнительные сведения об отрисовщике и классах собственных элементов управления, с которыми сопоставляются элементы управления Xamarin.Forms, см. в статье Базовые классы и собственные элементы управления отрисовщика.
На следующей схеме показана связь между элементом управления Entry
и соответствующими собственными элементами управления, которые его реализуют:
Процесс отрисовки можно использовать для реализации настроек для конкретных платформ путем создания пользовательского отрисовщика для элемента управления Entry
на каждой платформе. Этот процесс выглядит следующим образом:
- Создание пользовательского элемента управления Xamarin.Forms.
- Использование пользовательского элемента управления в Xamarin.Forms.
- Создание пользовательского отрисовщика для элемента управления на каждой платформе.
Мы рассмотрим каждый пункт по порядку, чтобы реализовать элемент управления Entry
с разным цветом фона на каждой платформе.
Внимание
В этой статье описывается, как создать простой пользовательский отрисовщик. Однако чтобы реализовать элемент управления Entry
с разным цветом фона на каждой платформе, создавать пользовательский отрисовщик необязательно. Проще будет воспользоваться классом Device
или расширением разметки OnPlatform
, указав значения для конкретных платформ. Дополнительные сведения см. в разделах Указание значений для конкретных платформ и Расширение разметки OnPlatform.
Создание пользовательского элемента управления Entry
Пользовательский элемент управления Entry
можно создать путем создания подкласса элемента управления Entry
, как показано в следующем примере кода.
public class MyEntry : Entry
{
}
Элемент управления MyEntry
создается в проекте библиотеки .NET Standard и представляет собой попросту элемент управления Entry
. Настройка элемента управления будет осуществляться в пользовательском отрисовщике, поэтому дополнительная реализация в элементе управления MyEntry
не требуется.
Использование пользовательского элемента управления
На элемент управления MyEntry
можно ссылаться в XAML в проекте библиотеки .NET Standard, объявив пространство имен для его расположения и используя префикс пространства имен в элементе управления. В следующем примере кода показано, как элемент управления MyEntry
может использоваться страницей XAML.
<ContentPage ...
xmlns:local="clr-namespace:CustomRenderer;assembly=CustomRenderer"
...>
...
<local:MyEntry Text="In Shared Code" />
...
</ContentPage>
Префикс пространства имен local
может иметь любое имя. Тем не менее значения clr-namespace
и assembly
должны соответствовать данным пользовательского элемента управления. После объявления пространства имен префикс используется для ссылки на пользовательский элемент управления.
В следующем примере кода показано, как элемент управления MyEntry
может использоваться страницей C#:
public class MainPage : ContentPage
{
public MainPage ()
{
Content = new StackLayout {
Children = {
new Label {
Text = "Hello, Custom Renderer !",
},
new MyEntry {
Text = "In Shared Code",
}
},
VerticalOptions = LayoutOptions.CenterAndExpand,
HorizontalOptions = LayoutOptions.CenterAndExpand,
};
}
}
Этот код создает объект ContentPage
, который отображает элементы управления Label
и MyEntry
, размещаемые в центре страницы как по вертикали, так и по горизонтали.
Теперь в каждый проект приложения можно добавить пользовательский отрисовщик для настройки внешнего вида элемента управления на каждой платформе.
Создание пользовательского отрисовщика на каждой платформе
Процесс создания класса пользовательского отрисовщика выглядит следующим образом:
- Создайте подкласс класса
EntryRenderer
, который отрисовывает собственный элемент управления. - Переопределите метод
OnElementChanged
, который отрисовывает собственный элемент управления, и напишите логику для его настройки. Этот метод вызывается при создании соответствующего элемента управления Xamarin.Forms. - Добавьте атрибут
ExportRenderer
в класс настраиваемого отрисовщика, чтобы указать, что он будет использоваться для отрисовки элемента управления Xamarin.Forms. Этот атрибут используется для регистрации пользовательского отрисовщика в Xamarin.Forms.
Примечание.
Предоставлять пользовательский отрисовщик в проекте для каждой платформы не обязательно. Если пользовательский отрисовщик не зарегистрирован, будет использоваться отрисовщик по умолчанию для базового класса элемента управления.
На следующей схеме показаны обязанности каждого проекта в примере приложения, а также связи между ними:
Элемент управления MyEntry
отрисовывается с помощью зависящих от платформы классов MyEntryRenderer
, которые являются производными от класса EntryRenderer
для каждой платформы. Это приводит к тому, что каждый элемент управления MyEntry
отрисовывается с использованием цвета фона для конкретной платформы, как показано на следующих снимках экрана.
Класс EntryRenderer
предоставляет метод OnElementChanged
, который вызывается при создании элемента управления Xamarin.Forms для отрисовки соответствующего собственного элемента управления. Этот метод принимает параметр ElementChangedEventArgs
, содержащий свойства OldElement
и NewElement
. Эти свойства представляют элемент Xamarin.Forms, к которому был присоединен отрисовщик, и элемент Xamarin.Forms, к которому присоединен отрисовщик, соответственно. В примере приложения свойство OldElement
будет иметь значение null
, а свойство NewElement
будет содержать ссылку на элемент управления MyEntry
.
Настройка собственного элемента управления выполняется в переопределенной версии метода OnElementChanged
в классе MyEntryRenderer
. Типизированную ссылку на собственный элемент управления, используемый на платформе, можно получить через свойство Control
. Кроме того, ссылку на отрисовываемый элемент управления Xamarin.Forms можно получить с помощью свойства Element
, хотя оно не используется в примере приложения.
Каждый класс пользовательского отрисовщика дополняется атрибутом ExportRenderer
, который регистрирует отрисовщик в Xamarin.Forms. Атрибут принимает два параметра — имя типа отрисовываемого элемента управления Xamarin.Forms и имя типа пользовательского отрисовщика. Префикс assembly
в атрибуте указывает, что атрибут применяется ко всей сборке.
В следующих разделах рассматривается реализация класса пользовательского отрисовщика MyEntryRenderer
для каждой платформы.
Создание пользовательского отрисовщика в iOS
В следующем примере кода показан пользовательский отрисовщик для платформы iOS:
using Xamarin.Forms.Platform.iOS;
[assembly: ExportRenderer (typeof(MyEntry), typeof(MyEntryRenderer))]
namespace CustomRenderer.iOS
{
public class MyEntryRenderer : EntryRenderer
{
protected override void OnElementChanged (ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged (e);
if (Control != null) {
// do whatever you want to the UITextField here!
Control.BackgroundColor = UIColor.FromRGB (204, 153, 255);
Control.BorderStyle = UITextBorderStyle.Line;
}
}
}
}
В результате вызова метода OnElementChanged
базового класса создается элемент управления iOS UITextField
со ссылкой на элемент управления, присваиваемый свойству Control
отрисовщика. Затем с помощью метода UIColor.FromRGB
задается светло-сиреневый цвет фона.
Создание пользовательского отрисовщика в Android
В следующем примере кода показан пользовательский отрисовщик для платформы Android:
using Xamarin.Forms.Platform.Android;
[assembly: ExportRenderer(typeof(MyEntry), typeof(MyEntryRenderer))]
namespace CustomRenderer.Android
{
class MyEntryRenderer : EntryRenderer
{
public MyEntryRenderer(Context context) : base(context)
{
}
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
if (Control != null)
{
Control.SetBackgroundColor(global::Android.Graphics.Color.LightGreen);
}
}
}
}
В результате вызова метода OnElementChanged
базового класса создается элемент управления Android EditText
со ссылкой на элемент управления, присваиваемый свойству Control
отрисовщика. Затем с помощью метода Control.SetBackgroundColor
задается светло-зеленый цвет фона.
Создание пользовательского отрисовщика на универсальной платформе Windows
В следующем примере кода показан пользовательский отрисовщик для платформы UWP:
[assembly: ExportRenderer(typeof(MyEntry), typeof(MyEntryRenderer))]
namespace CustomRenderer.UWP
{
public class MyEntryRenderer : EntryRenderer
{
protected override void OnElementChanged(ElementChangedEventArgs<Entry> e)
{
base.OnElementChanged(e);
if (Control != null)
{
Control.Background = new SolidColorBrush(Colors.Cyan);
}
}
}
}
В результате вызова метода OnElementChanged
базового класса создается элемент управления TextBox
со ссылкой на элемент управления, присваиваемый свойству Control
отрисовщика. Затем путем создания экземпляра SolidColorBrush
задается голубой цвет фона.
Итоги
В этой статье показано, как создать пользовательский отрисовщик элементов управления для Xamarin.FormsEntry
элемента управления, что позволяет разработчикам переопределить встроенную отрисовку по умолчанию с помощью собственной отрисовки для конкретной платформы. Пользовательские отрисовщики обеспечивают удобный подход к настройке внешнего вида элементов управления Xamarin.Forms. Они могут использоваться для незначительных изменений стиля или сложной настройки макетов и поведения в зависимости от платформы.