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:
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
undPage
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
undView
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:
BodyStyleKey
entspricht „BodyStyle“.TitleStyleKey
entspricht „TitleStyle“.SubtitleStyleKey
entspricht „SubtitleStyle“.CaptionStyleKey
entspricht „CaptionStyle“.ListItemTextStyleKey
entspricht „ListItemTextStyle“.ListItemDetailTextStyleKey
entspricht „ListItemDetailTextStyle“.
Diese Stile werden im DeviceStylesList-Beispiel illustriert.