Share via


Zusammenfassung von Kapitel 12. Stilarten

Hinweis

Dieses Buch wurde im Frühjahr 2016 veröffentlicht und seitdem nicht aktualisiert. Wenngleich ein großer Teil des Buchs weiterhin relevante Informationen liefert, sind einige Abschnitte veraltet, und einige Themen sind nicht mehr korrekt oder vollständig.

In Xamarin.Forms ermöglichen Stile die gemeinsame Nutzung einer Sammlung mit Eigenschaftseinstellungen durch mehrere Ansichten. Dadurch wird Markup verringert und die Aufrechterhaltung konsistenter visueller Designs ermöglicht.

Stile werden fast immer im Markup definiert und verbraucht. Ein Objekt vom Typ Style wird in einem Ressourcenverzeichnis instanziiert und dann mithilfe einer StaticResource- oder DynamicResource-Markuperweiterung auf die Style-Eigenschaft eines visuellen Elements festgelegt.

Der grundlegende Stil

A Style erfordert, dass sie TargetType auf den Typ des visuellen Objekts festgelegt wird, auf das es angewendet wird. Wenn ein Style in einem Ressourcenverzeichnis instanziiert wird (wie es üblich ist), erfordert er auch ein x:Key-Attribut.

Der Style besitzt eine Inhaltseigenschaft vom Typ Setters, bei der es sich um eine Sammlung von Setter-Objekten handelt. Jeder Setter ordnet einer Property einen Value zu.

In XAML ist die Property-Einstellung der Name einer CLR-Eigenschaft (z. B. die Text-Eigenschaft von Button), aber die über eine Vorlage formatierte Eigenschaft muss von einer bindbaren Eigenschaft unterstützt werden. Außerdem muss die Eigenschaft in der Klasse definiert werden, die durch die TargetType-Einstellung angegeben oder von dieser Klasse geerbt wird.

Sie können die Value-Eigenschaft mithilfe des Eigenschaftselements <Setter.Value> angeben. Dieses gestattet Ihnen das Festlegen von Value auf ein Objekt, das sich nicht in einer Textzeichenfolge ausdrücken lässt, oder auf ein OnPlatform-Objekt oder auf ein Objekt, das mithilfe von x:Arguments oder x:FactoryMethod instanziiert wurde. Die Value-Eigenschaft kann auch mit einem StaticResource-Ausdruck auf ein anderes Element im Verzeichnis festgelegt werden.

Das BasicStyle-Programm veranschaulicht die grundlegende Syntax und zeigt, wie Sie mit einer StaticResource-Markuperweiterung auf den Style verweisen:

Dreifacher Screenshot des grundlegenden Stils

Das Style-Objekt und jedes in dem Style-Objekt als Value-Einstellung erstellte Objekt werden von allen Ansichten gemeinsam genutzt, die auf den Style verweisen. Der Style kann nichts enthalten, das nicht freigegeben werden kann, wie z. B. eine View-Ableitung.

Ereignishandler können in einem Style nicht festgelegt werden. Die GestureRecognizers-Eigenschaft kann in einem Style nicht festgelegt werden, weil sie nicht von einer bindbaren Eigenschaft unterstützt wird.

Stile in Code

Es ist zwar nicht gängig, doch Sie können Style-Objekte in Code instanziieren und initialisieren. Dieser Vorgang wird im BasicStyleCode-Beispiel veranschaulicht.

Stilvererbung

Style besitzt eine BasedOn-Eigenschaft, die Sie auf eine StaticResource-Markuperweiterung festlegen können, die auf einen weiteren Stil verweist. Dies ermöglicht Stilen, von vorherigen Stilen zu erben und Eigenschaftseinstellungen hinzuzufügen oder zu ersetzen. Dies wird im StudentCardFile-Beispiel veranschaulicht.

Falls Style2 auf Style1 basiert, muss der TargetType von Style2 mit Style1 identisch oder von Style1 abgeleitet sein. Das Ressourcenverzeichnis, in dem Style1 gespeichert ist, muss mit dem Ressourcenverzeichnis von Style2 identisch sein oder ein Ressourcenverzeichnis, das sich höher in der visuellen Struktur befindet.

Implizite Stile

Wenn ein Style in einem Ressourcenverzeichnis keine x:Key-Attributeinstellung besitzt, wird ihm automatisch ein Verzeichnisschlüssel zugewiesen, und das Style-Objekt wird zu einem impliziten Stil. Eine Ansicht ohne eine Style-Einstellung deren Typ exakt mit dem TargetType übereinstimmt, findet diesen Stil, wie im ImplicitStyle-Beispiel gezeigt.

Ein impliziter Stil kann von einem Style mit einer x:Key-Einstellung abgeleitet werden, aber nicht umgekehrt. Sie können nicht explizit auf einen impliziten Stil verweisen.

Sie können drei Typen von Hierarchien mit Stilen und BasedOn implementieren:

  • Aus in Application und Page definierten Stilen bis hinunter zu Stilen, die in Layouts weiter unten in der visuellen Struktur definiert sind.
  • Aus für Basisklassen definierten Stilen wie VisualElement und View bis hin zu für bestimmte Klassen definierten Stilen.
  • Aus Stilen mit expliziten Verzeichnisschlüsseln bis hin zu impliziten Stilen.

Diese Hierarchien werden im StyleHierarchy-Beispiel veranschaulicht.

Dynamische Stile

Auf einen Stil in einem Ressourcenverzeichnis lässt sich eher mit DynamicResource als mit StaticResource verweisen. Hierdurch wird der Stil zu einem dynamischen Stil. Wenn dieser Stil im Ressourcenverzeichnis durch einen anderen Stil mit demselben Schlüssel ersetzt wird, ändern sich die Ansichten automatisch, die mit DynamicResource auf diesen Stil verweisen. Außerdem führt das Fehlen eines Verzeichniseintrags mit dem angegebenen Schlüssel dazu, dass StaticResource eine Ausnahme auslöst, DynamicResource aber nicht.

Sie können diese Methode verwenden, um Stile oder Designs dynamisch zu ändern, wie im DynamicStyles-Beispiel veranschaulicht wird.

Sie können jedoch nicht die BasedOn-Eigenschaft auf eine DynamicResource-Markuperweiterung festlegen, weil BasedOn nicht von einer bindbaren Eigenschaft unterstützt wird. Um einen Stil dynamisch abzuleiten, legen Sie BasedOn nicht fest. Legen Sie stattdessen die BaseResourceKey-Eigenschaft auf den Verzeichnisschlüssel des Stils fest, von dem Sie ableiten möchten. Diese Methode wird im DynamicStylesInheritance-Beispiel veranschaulicht.

Gerätestile

Die geschachtelte Device.Styles-Klasse definiert zwölf statische, schreibgeschützte Felder für sechs Stile mit einem TargetType von Label, das Sie für gängige Typen der Textverwendung verwenden können.

Sechs dieser Felder sind vom Typ Style, den Sie in Code direkt auf eine Style-Eigenschaft festlegen können:

Die anderen sechs Felder sind vom Typ string und können als Verzeichnisschlüssel für dynamische Stile verwendet werden:

Diese Stile werden im DeviceStylesList-Beispiel illustriert.