Einführung in benutzerdefinierte Renderer
Benutzerdefinierte Renderer sind eine praktische Methode zum Anpassen der Darstellung und des Verhaltens von Xamarin.Forms-Steuerelementen. Sie können für geringfügige stilistische Änderungen oder für umfangreiche, plattformspezifische Anpassungen des Layouts und Verhaltens verwendet werden. In diesem Artikel werden benutzerdefinierte Renderer vorgestellt, und Sie erfahren, wie Sie einen benutzerdefinierten Renderer erstellen können.
Xamarin.FormsSeiten, Layouts und Steuerelemente stellen eine allgemeine API zur Beschreibung plattformübergreifender mobiler Benutzeroberflächen dar. Die einzelnen Seiten, Layouts und Steuerelemente werden auf jeder Plattform auf unterschiedliche Weise über eine Renderer
-Klasse gerendert. Diese erstellt ein natives Steuerelement (entsprechend der Xamarin.Forms-Darstellung), ordnet dieses auf dem Bildschirm an und fügt das im freigegebenen Code angegebene Verhalten hinzu.
Entwickler können ihre eigenen benutzerdefinierten Renderer
-Klassen implementieren, um die Darstellung und/oder das Verhalten eines Steuerelements anzupassen. Benutzerdefinierte Renderer für einen bestimmten Typ können einem Anwendungsprojekt hinzugefügt werden, um das Steuerelement an einer Stelle anzupassen, während auf anderen Plattformen das Standardverhalten zugelassen wird. Alternativ können jedem Anwendungsprojekt unterschiedliche benutzerdefinierte Renderer hinzugefügt werden, um ein unterschiedliches Erscheinungsbild unter iOS, Android und auf der Universellen Windows-Plattform (UWP) zu schaffen. Das Implementieren einer benutzerdefinierten Rendererklasse zum Ausführen einer einfachen Anpassung eines Steuerelements ist jedoch oft eine komplizierte Antwort. Die Auswirkungen vereinfachen diesen Prozess und werden in der Regel für geringfügige Formatierungsänderungen verwendet. Weitere Informationen finden Sie unter Effekte.
Untersuchen, warum benutzerdefinierte Renderer erforderlich sind
Das Ändern der Darstellung eines Xamarin.Forms-Steuerelements ist ohne benutzerdefinierten Renderer ein zweistufiger Prozess, bei dem ein benutzerdefiniertes Steuerelement durch Erstellen einer Unterklasse erstellt und dann das benutzerdefinierte Steuerelement anstelle des ursprünglichen Steuerelements verwendet wird. Das folgende Codebeispiel veranschaulicht das Erstellen einer Unterklasse des Entry
-Steuerelements beispielhaft:
public class MyEntry : Entry
{
public MyEntry ()
{
BackgroundColor = Color.Gray;
}
}
Das MyEntry
-Steuerelement ist ein Entry
-Steuerelement, bei dem BackgroundColor
auf Grau festgelegt ist und auf das in XAML verwiesen werden kann, indem Sie einen Namespace für seine Position deklarieren und das Namespacepräfix für das Steuerelement verwenden. Das folgende Codebeispiel veranschaulicht, wie das benutzerdefinierte Steuerelement MyEntry
von einer ContentPage
genutzt werden kann:
<ContentPage
...
xmlns:local="clr-namespace:CustomRenderer;assembly=CustomRenderer"
...>
...
<local:MyEntry Text="In Shared Code" />
...
</ContentPage>
Das local
-Namespacepräfix kann beliebig gewählt werden. Die Werte namespace
und assembly
müssen jedoch mit den Angaben des benutzerdefinierten Steuerelements übereinstimmen. Wenn der Namespace deklariert wurde, wird das Präfix verwendet, um auf das benutzerdefinierte Steuerelement zu verweisen.
Hinweis
Das Definieren des xmlns
ist in .NET Standard-Bibliotheksprojekten viel einfacher als in freigegebenen Projekten. Eine .NET Standard-Bibliothek wird in eine Assembly kompiliert, sodass der Wert assembly=CustomRenderer
einfach bestimmt werden kann. Beim Verwenden freigegebener Projekte werden alle freigegebenen Ressourcen (einschließlich der XAML) in jedes der verweisenden Projekte kompiliert. Wenn die iOS-, Android- und UWP-Projekte über eigene Assemblynamen verfügen, kann die xmlns
-Deklaration nicht geschrieben werden, da der Wert für jede Anwendung unterschiedlich sein muss. Für benutzerdefinierte Steuerelemente in XAML für freigegebene Projekte muss jedes Anwendungsprojekt mit dem gleichen Assemblynamen konfiguriert werden.
Das benutzerdefinierte Steuerelement MyEntry
wird dann auf jeder Plattform mit einem grauen Hintergrund gerendert, wie in den folgenden Screenshots gezeigt:
Das Ändern der Hintergrundfarbe des Steuerelements auf jeder Plattform wurde ausschließlich über das Erstellen von Unterklassen für das Steuerelement erreicht. Die Leistung dieses Verfahrens ist jedoch eingeschränkt, da plattformspezifische Erweiterungen und Anpassungen nicht genutzt werden können. Wenn sie benötigt werden, müssen benutzerdefinierte Renderer implementiert werden.
Erstellen einer benutzerdefinierten Renderer-Klasse
Gehen Sie folgendermaßen vor, um eine Klasse für einen benutzerdefinierten Renderer zu erstellen:
- Erstellen Sie eine Unterklasse der Renderer-Klasse, die das native Steuerelement rendert.
- Überschreiben Sie die -Methode, die die native Seite rendert, und schreiben Sie Logik, um das Steuerelement anzupassen. Häufig wird die
OnElementChanged
-Methode verwendet, um das native Steuerelement zu rendern, das bei der Erstellung des entsprechenden Xamarin.Forms-Steuerelements aufgerufen wird. - Fügen Sie der Klasse des benutzerdefinierten Renderers ein
ExportRenderer
-Attribut hinzu, um anzugeben, dass sie zum Rendern des Xamarin.Forms-Steuerelements verwendet werden soll. Dieses Attribut wird verwendet, um den benutzerdefinierten Renderer bei Xamarin.Forms zu registrieren.
Hinweis
Bei den meisten Xamarin.Forms-Elementen ist das Angeben eines benutzerdefinierten Renderers in jedem Plattformprojekt optional. Wenn kein benutzerdefinierter Renderer registriert wurde, wird der Standardrenderer für die Basisklasse des Steuerelements verwendet. Benutzerdefinierte Renderer sind jedoch in jedem Plattformprojekt erforderlich, wenn ein View- oder ViewCell-Element gerendert wird.
Die Themen in dieser Reihe bieten Demos und Erklärungen dieses Prozesses für verschiedene Xamarin.Forms-Elemente.
Problembehandlung
Wenn ein benutzerdefiniertes Steuerelement in einem .NET Standard-Bibliotheksprojekt enthalten ist, das der Projektmappe hinzugefügt wurde (d. h. nicht die .NET Standard-Bibliothek, die von der Xamarin.Forms-App-Projektvorlage in Visual Studio für Mac/Visual Studio erstellt wurde). Eine Ausnahme kann unter iOS auftreten, wenn versucht wird, auf das benutzerdefinierte Steuerelement zuzugreifen. Wenn dieses Problem auftritt, kann es durch Erstellen eines Verweises auf das benutzerdefinierte Steuerelement aus der Klasse AppDelegate
gelöst werden:
var temp = new ClassInPCL(); // in AppDelegate, but temp not used anywhere
Dies zwingt den Compiler, den Typ ClassInPCL
zu erkennen, indem er aufgelöst wird. Alternativ kann das Attribut Preserve
der Klasse AppDelegate
hinzugefügt werden, um das gleiche Ergebnis zu erzielen:
[assembly: Preserve (typeof (ClassInPCL))]
Dadurch wird ein Verweis auf den Typ ClassInPCL
erstellt, der angibt, dass er zur Laufzeit benötigt wird. Weitere Informationen finden Sie unter Beibehalten von Code.
Zusammenfassung
In diesem Artikel wurden benutzerdefinierte Renderer vorgestellt, und Sie haben erfahren, wie Sie einen benutzerdefinierten Renderer erstellen können. Benutzerdefinierte Renderer sind eine praktische Methode zum Anpassen der Darstellung und des Verhaltens von Xamarin.Forms-Steuerelementen. Sie können für geringfügige stilistische Änderungen oder für umfangreiche, plattformspezifische Anpassungen des Layouts und Verhaltens verwendet werden.