Dostosowywanie wpisu
Kontrolka Xamarin.Forms Wpis umożliwia edytowanie pojedynczego wiersza tekstu. W tym artykule pokazano, jak utworzyć niestandardowy moduł renderujący dla kontrolki Entry, umożliwiając deweloperom zastąpienie domyślnego renderowania natywnego własnym dostosowaniem specyficznym dla platformy.
Każda Xamarin.Forms kontrolka ma towarzyszący renderer dla każdej platformy, która tworzy wystąpienie kontrolki natywnej. Gdy kontrolka jest renderowana przez aplikacjęXamarin.Forms, w systemie iOS EntryRenderer
klasę Entry
tworzy wystąpienie, co z kolei tworzy wystąpienie kontrolki natywnejUITextField
. Na platformie EntryRenderer
Android klasa tworzy wystąpienie kontrolki EditText
. W platforma uniwersalna systemu Windows (UWP) EntryRenderer
klasa tworzy wystąpienie kontrolkiTextBox
. Aby uzyskać więcej informacji na temat klasy renderera i natywnych kontrolek mapowanych Xamarin.Forms na, zobacz Renderer Base Classes and Native Controls (Klasy bazowe modułu renderowania i kontrolki natywne).
Na poniższym diagramie przedstawiono relację między kontrolką Entry
a odpowiednimi natywnymi kontrolkami, które ją implementują:
Proces renderowania można wykorzystać w celu zaimplementowania dostosowań specyficznych dla platformy, tworząc niestandardowy moduł renderujący dla kontrolki Entry
na każdej platformie. Proces wykonywania tej czynności jest następujący:
- Utwórz kontrolkę niestandardową Xamarin.Forms .
- Zużyj kontrolkę niestandardową z poziomu Xamarin.Forms.
- Utwórz niestandardowy moduł renderowania dla kontrolki na każdej platformie.
Każdy element zostanie omówiony z kolei w celu zaimplementowania Entry
kontrolki, która ma inny kolor tła na każdej platformie.
Ważne
W tym artykule wyjaśniono, jak utworzyć prosty niestandardowy moduł renderowania. Nie jest jednak konieczne utworzenie niestandardowego modułu renderowania w celu zaimplementowania elementu Entry
, który ma inny kolor tła na każdej platformie. Można to łatwiej osiągnąć przy użyciu Device
klasy lub OnPlatform
rozszerzenia znaczników w celu zapewnienia wartości specyficznych dla platformy. Aby uzyskać więcej informacji, zobacz Zapewnianie wartości specyficznych dla platformy i OnPlatform Markup Extension.
Tworzenie niestandardowej kontrolki wprowadzania
Kontrolkę niestandardową Entry
można utworzyć przez podklasę kontrolki Entry
, jak pokazano w poniższym przykładzie kodu:
public class MyEntry : Entry
{
}
Kontrolka MyEntry
jest tworzona w projekcie biblioteki .NET Standard i jest po prostu kontrolką Entry
. Dostosowanie kontrolki zostanie przeprowadzone w niestandardowym rendererze, więc w kontrolce nie jest wymagana żadna dodatkowa implementacja MyEntry
.
Korzystanie z kontrolki niestandardowej
Kontrolkę MyEntry
można odwoływać w języku XAML w projekcie biblioteki .NET Standard, deklarując przestrzeń nazw dla swojej lokalizacji i używając prefiksu przestrzeni nazw w elemencie kontrolki. Poniższy przykład kodu pokazuje, jak kontrolka MyEntry
może być zużywana przez stronę XAML:
<ContentPage ...
xmlns:local="clr-namespace:CustomRenderer;assembly=CustomRenderer"
...>
...
<local:MyEntry Text="In Shared Code" />
...
</ContentPage>
Prefiks local
przestrzeni nazw może mieć nazwę dowolnych elementów. clr-namespace
Jednak wartości i assembly
muszą być zgodne ze szczegółami kontrolki niestandardowej. Po zadeklarowaniu przestrzeni nazw prefiks jest używany do odwołwania się do kontrolki niestandardowej.
Poniższy przykład kodu pokazuje, jak kontrolka MyEntry
może być zużywana przez stronę języka 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,
};
}
}
Ten kod tworzy wystąpienie nowego ContentPage
obiektu, który będzie wyświetlać kontrolkę Label
i MyEntry
wyśrodkowaną w pionie i poziomo na stronie.
Niestandardowy moduł renderowania można teraz dodać do każdego projektu aplikacji, aby dostosować wygląd kontrolki na każdej platformie.
Tworzenie niestandardowego modułu renderowania na każdej platformie
Proces tworzenia niestandardowej klasy renderera jest następujący:
- Utwórz podklasę
EntryRenderer
klasy, która renderuje kontrolkę natywną. - Zastąpi metodę
OnElementChanged
, która renderuje kontrolkę natywną i zapisuje logikę w celu dostosowania kontrolki. Ta metoda jest wywoływana po utworzeniu odpowiedniej Xamarin.Forms kontrolki. ExportRenderer
Dodaj atrybut do niestandardowej klasy renderera, aby określić, że będzie on używany do renderowania kontrolkiXamarin.Forms. Ten atrybut służy do rejestrowania niestandardowego modułu renderowania za pomocą Xamarin.Formspolecenia .
Uwaga
Opcjonalne jest udostępnienie niestandardowego modułu renderowania w każdym projekcie platformy. Jeśli niestandardowy moduł renderowania nie jest zarejestrowany, zostanie użyty domyślny moduł renderowania dla klasy bazowej kontrolki.
Na poniższym diagramie przedstawiono obowiązki każdego projektu w przykładowej aplikacji wraz z relacjami między nimi:
Kontrolka MyEntry
jest renderowana przez klasy specyficzne dla MyEntryRenderer
platformy, które pochodzą z EntryRenderer
klasy dla każdej platformy. Spowoduje to renderowanie każdej MyEntry
kontrolki z kolorem tła specyficznym dla platformy, jak pokazano na poniższych zrzutach ekranu:
Klasa EntryRenderer
uwidacznia metodę OnElementChanged
, która jest wywoływana podczas tworzenia kontrolki w Xamarin.Forms celu renderowania odpowiedniej kontrolki natywnej. Ta metoda przyjmuje ElementChangedEventArgs
parametr zawierający OldElement
właściwości i NewElement
. Te właściwości reprezentują Xamarin.Forms element dołączony do modułu renderowania, a Xamarin.Forms element, do którego jest dołączony moduł renderujący . W przykładowej aplikacji OldElement
właściwość będzie i null
NewElement
właściwość będzie zawierać odwołanie do kontrolki MyEntry
.
Zastępowana wersja OnElementChanged
metody w MyEntryRenderer
klasie to miejsce do wykonania dostosowania kontrolki natywnej. Za pośrednictwem właściwości można uzyskać dostęp do wpisanego odwołania do natywnej kontrolki używanej Control
na platformie. Ponadto odwołanie do Xamarin.Forms renderowanej kontrolki można uzyskać za pośrednictwem Element
właściwości , chociaż nie jest ono używane w przykładowej aplikacji.
Każda niestandardowa klasa modułu renderowania jest ozdobiona atrybutem ExportRenderer
, który rejestruje program renderujący za pomocą Xamarin.Formspolecenia . Atrybut przyjmuje dwa parametry — nazwę typu renderowanej kontrolki Xamarin.Forms i nazwę typu niestandardowego modułu renderowania. Prefiks assembly
atrybutu określa, że atrybut ma zastosowanie do całego zestawu.
W poniższych sekcjach omówiono implementację poszczególnych niestandardowych klas renderer specyficznych dla MyEntryRenderer
platformy.
Tworzenie niestandardowego modułu renderowania w systemie iOS
Poniższy przykład kodu przedstawia niestandardowy moduł renderowania dla platformy 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;
}
}
}
}
Wywołanie metody klasy bazowej OnElementChanged
tworzy wystąpienie kontrolki systemu iOS UITextField
z odwołaniem do kontrolki przypisanej do właściwości modułu renderowania Control
. Kolor tła jest następnie ustawiony na jasny purpurowy przy użyciu UIColor.FromRGB
metody .
Tworzenie niestandardowego modułu renderowania w systemie Android
W poniższym przykładzie kodu pokazano niestandardowy moduł renderowania dla platformy 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);
}
}
}
}
Wywołanie metody klasy bazowej OnElementChanged
tworzy wystąpienie kontrolki systemu Android EditText
z odwołaniem do kontrolki przypisanej do właściwości modułu renderowania Control
. Kolor tła jest następnie ustawiony na jasnozielony przy użyciu Control.SetBackgroundColor
metody .
Tworzenie niestandardowego modułu renderowania na platformie UWP
W poniższym przykładzie kodu pokazano niestandardowy moduł renderowania dla platformy 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);
}
}
}
}
Wywołanie metody klasy bazowej OnElementChanged
tworzy wystąpienie kontrolki TextBox
z odwołaniem do kontrolki przypisanej do właściwości modułu renderowania Control
. Kolor tła jest następnie ustawiany na cyjan, tworząc SolidColorBrush
wystąpienie.
Podsumowanie
W tym artykule pokazano, jak utworzyć niestandardowy moduł renderujący kontrolki dla Xamarin.FormsEntry
kontrolki, umożliwiając deweloperom zastąpienie domyślnego renderowania natywnego przy użyciu własnego renderowania specyficznego dla platformy. Niestandardowe programy renderujące zapewniają zaawansowane podejście do dostosowywania wyglądu Xamarin.Forms kontrolek. Mogą być one używane do niewielkich zmian stylów lub zaawansowanego dostosowania układu i zachowania specyficznego dla platformy.