Erstellen und Verwenden von anwendungsweiten Ressourcen

Abgeschlossen

Das Definieren von Ressourcen und Stilen auf einer XAML-Seite ist eine hervorragende Möglichkeit, Wiederholungen im Code zu reduzieren. Allerdings gibt es ein Problem. Diese Ressourcen und Stile sind nur auf dieser bestimmten XAML-Seite verfügbar. Ressourcenverzeichnisse auf Seitenebene sind nicht ausreichend, um Codewiederholungen in einer Anwendung zu vermeiden, wenn Sie über mehrere Seiten verfügen. In dieser Lerneinheit erfahren Sie, wie Sie Ressourcen und Stile für alle Seiten in Ihrer Anwendung gemeinsam nutzen können.

Wo sind Ressourcenverzeichnisse verfügbar?

Die VisualElement-Klasse definiert die Resources-Eigenschaft. Steuerelemente, Seiten und Layouts erben von VisualElement, sodass alle über eine Resources-Eigenschaft verfügen, die ein Ressourcenverzeichnis enthalten kann.

Die Application-Klasse definiert ebenfalls eine Resources-Eigenschaft. Application erbt nicht von VisualElement, daher wird die Eigenschaft als Teil dieser Klasse definiert.

Die folgende Abbildung zeigt die Struktur einer typischen Anwendung. Jedes der angezeigten Elemente besitzt eine Resources-Eigenschaft, die ein Ressourcenverzeichnis enthalten kann.

Hinweis

Dieses Diagramm zeigt eine stark vereinfachte Darstellung der Organisation der Elemente in einer Anwendung. In diesem Diagramm bezieht sich der Begriff Ansicht auf ein Singleton-Steuerelement wie Schaltfläche oder Bezeichnung, das nicht als Container für untergeordnete Steuerelemente fungiert. Außerdem impliziert der Begriff Layout einen Container, der für das Organisieren des Layouts seiner untergeordneten Steuerelemente verantwortlich ist. Ein Layout kann geschachtelt werden. Ein Grid-Steuerelement kann z. B. in einem StackLayout-Steuereleement gehalten werden.

Diagramm der allgemeinen Struktur einer typischen .NET MAUI-Anwendung.

Definieren von Ressourcen und Stilen auf Anwendungsebene

Sie definieren Ressourcen und Stile auf Anwendungsebene in der XAML-Datei, die Ihrer Application-Klasse zugeordnet ist. Der folgende Code zeigt, wie sie eine Color-Ressource im Anwendungsressourcenverzeichnis deklarieren.

<Application.Resources>
    <Color x:Key="MyTextColor">Blue</Color>
</Application.Resources>

So findet .NET MAUI Ressourcen oder Stile

Angenommen, Sie wenden wie im folgenden Code gezeigt eine Ressource auf eines Ihrer Steuerelemente an.

<Label TextColor="{StaticResource MyTextColor}" ... />

.NET MAUI muss die Definition dieser Ressource suchen, um den Wert anwenden zu können. Eine Anwendung kann viele Verzeichnisse umfassen. Welche Verzeichnisse werden von .NET MAUI durchsucht und in welcher Reihenfolge? Um diese Fragen zu beantworten, können Sie sich die VisualElement-Instanzen auf Seiten als Baumstruktur vorstellen. Die Anwendung befindet sich an der Wurzel, unter der sich Seiten, Layouts und Ansichten ausbreiten. Diese Struktur wird häufig als visuelle Struktur bezeichnet. Jedes Element in der Struktur kann über ein eigenes Verzeichnis mit vielen Ressourcen verfügen. Der Stilsuchalgorithmus in .NET MAUI durchläuft die visuelle Struktur nach oben:

  1. Die Suche beginnt beim Verzeichnis in der VisualElement-Instanz, auf die die Ressource angewendet wird. Im vorherigen Beispiel beginnt die Suche beim Label-Typ. Falls es kein Ressourcenverzeichnis gibt oder ein Verzeichnis vorhanden ist, die Ressource jedoch nicht existiert, wird Suche beim nächsten Element fortgesetzt.

  2. Die Suche wechselt zum übergeordneten Element des Steuerelements und wird wiederholt. In der Regel ist die nächste Stelle, an der gesucht wird, ein Layout.

  3. Das übergeordnete Element des Layouts wird überprüft. In der Regel ist die nächste Stelle, an der gesucht wird, die Seite. Wenn ein Layout jedoch in einem anderen Layout (z. B. ein Grid in einem StackLayout) geschachtelt ist, bewegt sich die Suche in der Struktur weiter nach oben zum übergeordneten Layout.

  4. Das Verzeichnis wird nach der Application-Klasse durchsucht.

Die Suche gibt das erste Element zurück, das mit einem übereinstimmenden x:Key-Wert gefunden wird. Die folgende Abbildung fasst die Ressourcensuchsequenz zusammen.

Darstellung der Suche nach Ressourcen durch .NET. Sie beginnt bei der Ansicht, dann bei den Layouts, dann auf den Seiten und schließlich in der Anwendung.

In der Praxis ignorieren die meisten Entwickler die Resources-Eigenschaft in Ansichten und Layouts. Sie verwenden die Verzeichnisse auf Seitenebene für Elemente, die sie auf einer einzelnen Seite verwenden. Ressourcen und Stile, die sie auf mehreren Seiten gemeinsam nutzen möchten, werden auf Anwendungsebene definiert. Der Suchprozess muss dann nur zwei Verzeichnisse überprüfen: das Verzeichnis in der aktuellen Seiteninstanz und das Verzeichnis in der Anwendung.

Hinweis

Wenn keine Ressource mit dem angegebenen Schlüssel gefunden wird, verwendet die App Standardwerte für die Formatierung.

Doppelte Schlüssel

Jede ResourceDictionary-Instanz ist unabhängig, was bedeutet, dass ein und derselbe x:Key-Wert in mehr als einem Verzeichnis verwendet werden kann. Wenn derselbe x:Schlüssel-Bezeichner in mehreren Dictionarys im Suchpfad vorkommt, führt dies nicht zu einem Fehler. Es wird die Ressource verwendet, die mit dem ersten übereinstimmenden x:Schlüssel-Wert im Pfad verknüpft ist.

Nehmen Sie beispielsweise an, Sie haben die folgende Ressource in Ihrer Application-Klasse definiert:

<Application.Resources>
    <x:String x:Key="msg">Two</x:String>
</Application.Resources>

Dann definieren Sie die folgende Ressource in einem ContentPage-Element und wenden sie auf ein Label-Element auf derselben Seite an:

<ContentPage.Resources>
    <x:String x:Key="msg">One</x:String>
</ContentPage.Resources>
...
<Label Text="{StaticResource msg}">

Da der erste übereinstimmende x:Schlüssel-Wert verwendet wird, wird die Eigenschaft Text auf Eins gesetzt.