Udostępnij za pośrednictwem


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ą:

Relacja między kontrolką wejścia a implementacją kontrolek natywnych

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:

  1. Utwórz kontrolkę niestandardową Xamarin.Forms .
  2. Zużyj kontrolkę niestandardową z poziomu Xamarin.Forms.
  3. 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:

  1. Utwórz podklasę EntryRenderer klasy, która renderuje kontrolkę natywną.
  2. 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.
  3. 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:

Obowiązki projektu niestandardowego modułu renderowania MyEntry

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:

Kontrolka MyEntry na każdej platformie

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 nullNewElement 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.