Udostępnij za pośrednictwem


Wprowadzenie do niestandardowych modułów renderujących

Niestandardowe programy renderujące zapewniają zaawansowane podejście do dostosowywania wyglądu Xamarin.Forms i zachowania kontrolek. Mogą być one używane do niewielkich zmian stylów lub zaawansowanego dostosowania układu i zachowania specyficznego dla platformy. Ten artykuł zawiera wprowadzenie do niestandardowych modułów renderujących i przedstawia proces tworzenia niestandardowego modułu renderowania.

Xamarin.FormsStrony, układy i kontrolki przedstawiają wspólny interfejs API do opisywania międzyplatformowych interfejsów użytkownika mobilnych. Każda strona, układ i kontrolka są renderowane inaczej na każdej platformie przy użyciu Renderer klasy, która z kolei tworzy kontrolkę natywną (odpowiadającą Xamarin.Forms reprezentacji), rozmieszcza ją na ekranie i dodaje zachowanie określone w kodzie udostępnionym.

Deweloperzy mogą implementować własne, niestandardowe klasy Renderer, aby dostosowywać wygląd i/lub zachowanie kontrolki. Niestandardowe programy renderowania dla danego typu można dodać do jednego projektu aplikacji, aby dostosować kontrolkę w jednym miejscu, umożliwiając zachowanie domyślne na innych platformach; lub różne niestandardowe programy renderowane można dodać do każdego projektu aplikacji, aby utworzyć inny wygląd i działanie w systemach iOS, Android i platforma uniwersalna systemu Windows (UWP). Jednak zaimplementowanie niestandardowej klasy renderera w celu wykonania prostego dostosowania kontrolki jest często dużą odpowiedzią. Efekty upraszczają ten proces i są zwykle używane do niewielkich zmian stylu. Aby uzyskać więcej informacji, zobacz Efekty.

Sprawdzanie, dlaczego niestandardowe programy renderujące są niezbędne

Zmiana wyglądu kontrolki Xamarin.Forms bez użycia niestandardowego modułu renderowania jest procesem dwuetapowym, który obejmuje utworzenie niestandardowej kontrolki za pomocą podklasy, a następnie użycie kontrolki niestandardowej zamiast oryginalnej kontrolki. Poniższy przykład kodu przedstawia przykład podklasowania kontrolki Entry :

public class MyEntry : Entry
{
  public MyEntry ()
  {
    BackgroundColor = Color.Gray;
  }
}

Kontrolka MyEntry jest kontrolką Entry , w której BackgroundColor parametr jest ustawiony na szary i może być przywołyny w języku Xaml, deklarując przestrzeń nazw dla swojej lokalizacji i używając prefiksu przestrzeni nazw w elemencie kontrolnym. Poniższy przykład kodu pokazuje, jak kontrolka MyEntry niestandardowa może być zużywana przez element ContentPage:

<ContentPage
    ...
    xmlns:local="clr-namespace:CustomRenderer;assembly=CustomRenderer"
    ...>
    ...
    <local:MyEntry Text="In Shared Code" />
    ...
</ContentPage>

Prefiks local przestrzeni nazw może być dowolny. 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.

Uwaga

Definiowanie elementu xmlns jest znacznie prostsze w projektach biblioteki .NET Standard niż projekty udostępnione. Biblioteka .NET Standard jest kompilowana w zestawie, dzięki czemu można łatwo określić, assembly=CustomRenderer jaka wartość powinna być. W przypadku korzystania z projektów udostępnionych wszystkie udostępnione zasoby (w tym XAML) są kompilowane w każdym z projektów odwołujących się, co oznacza, że jeśli projekty systemów iOS, Android i UWP mają własne nazwy zestawów , nie można zapisać xmlns deklaracji, ponieważ wartość musi być inna dla każdej aplikacji. Kontrolki niestandardowe w języku XAML dla projektów udostępnionych będą wymagać skonfigurowania każdego projektu aplikacji o tej samej nazwie zestawu.

Kontrolka niestandardowa MyEntry jest następnie renderowana na każdej platformie z szarym tłem, jak pokazano na poniższych zrzutach ekranu:

MyEntry Custom Control on each Platform

Zmiana koloru tła kontrolki na każdej platformie została wykonana wyłącznie za pośrednictwem podklasy kontrolki. Jednak ta technika jest ograniczona w tym, co może osiągnąć, ponieważ nie jest możliwe korzystanie z ulepszeń i dostosowań specyficznych dla platformy. Jeśli są one wymagane, należy zaimplementować niestandardowe programy renderowania.

Tworzenie niestandardowej klasy renderera

Proces tworzenia niestandardowej klasy renderera jest następujący:

  1. Utwórz podklasę klasy renderera, która renderuje kontrolkę natywną.
  2. Zastąpi metodę, która renderuje kontrolkę natywną i zapisuje logikę w celu dostosowania kontrolki. OnElementChanged Często metoda jest używana do renderowania kontrolki natywnej, która jest wywoływana podczas tworzenia 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

W przypadku większości Xamarin.Forms elementów 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. Jednak niestandardowe programy renderowania są wymagane w każdym projekcie platformy podczas renderowania elementu View lub ViewCell .

Tematy z tej serii zawierają pokazy i wyjaśnienia tego procesu dla różnych Xamarin.Forms elementów.

Rozwiązywanie problemów

Jeśli kontrolka niestandardowa znajduje się w projekcie biblioteki .NET Standard, który został dodany do rozwiązania (tj. biblioteka .NET Standard utworzona przez szablon projektu Visual Studio dla komputerów Mac/Visual Studio Xamarin.Forms App), może wystąpić wyjątek w systemie iOS podczas próby uzyskania dostępu do kontrolki niestandardowej. Jeśli ten problem występuje, można go rozwiązać, tworząc odwołanie do kontrolki niestandardowej AppDelegate z klasy:

var temp = new ClassInPCL(); // in AppDelegate, but temp not used anywhere

Wymusza to rozpoznawanie typu przez ClassInPCL kompilator. Alternatywnie można dodać atrybut do AppDelegate klasy, Preserve aby osiągnąć ten sam wynik:

[assembly: Preserve (typeof (ClassInPCL))]

Spowoduje to utworzenie odwołania do typu wskazującego ClassInPCL , że jest on wymagany w czasie wykonywania. Aby uzyskać więcej informacji, zobacz Zachowywanie kodu.

Podsumowanie

W tym artykule przedstawiono wprowadzenie do niestandardowych modułów renderujących i przedstawiono proces tworzenia niestandardowego modułu renderowania. Niestandardowe programy renderujące zapewniają zaawansowane podejście do dostosowywania wyglądu Xamarin.Forms i zachowania kontrolek. Mogą być one używane do niewielkich zmian stylów lub zaawansowanego dostosowania układu i zachowania specyficznego dla platformy.