Definieren und Verwenden von Ressourcen
Eine Ressource ist wie eine symbolische Konstante in einer Programmiersprache. Sie definieren sie an einer Stelle und verweisen von überall dort darauf, wo Sie sie benötigen. Ihr Code ist besser lesbar, da Sie anstelle eines „magischen“ Werts einen beschreibenden Namen verwenden. Sie müssen einfach nur die Definition aktualisieren, um den Wert zu ändern.
In diesem Modul sehen Sie, wie Sie Ressourcen verwenden, um hartcodierte Werte aus Ihrer XAML zu verbannen.
Was ist eine Ressource?
Eine Ressource ist ein beliebiges Objekt, das auf der Benutzeroberfläche gemeinsam genutzt werden kann. Die häufigsten Beispiele sind Schriftarten, Farben und Schriftgrade. Sie können jedoch auch komplexe Objekte wie Style- und OnPlatform-Instanzen als Ressourcen speichern.
Sie definieren eine Ressource entweder in XAML oder im Code. Danach wenden Sie sie in XAML oder im Code an. In der Regel arbeiten Sie komplett in XAML. Allerdings werden wir später einige Fälle sehen, in denen Code nützlich ist.
Sehen Sie sich ein Beispiel an. Stellen Sie sich vor, Sie möchten die gleichen TextColor-Werte für alle Steuerelemente auf einer Seite verwenden. Wenn Sie hartcodierte Werte verwenden, sieht Ihre XAML in etwa wie folgt aus. Beachten Sie, dass der Wert für die Textfarbe in beiden Steuerelementen wiederholt wird.
<Label TextColor="Blue" FontSize="14">
<Button TextColor="Blue" FontSize="14">
Anstatt die Textfarbe zu wiederholen, können Sie sie als Ressource definieren. Die Definition sieht etwa wie diese XAML aus:
<Color x:Key="PageControlTextColor">Blue</Color>
Beachten Sie, dass das definierte Element über eine x:Key-Eigenschaft verfügt, die der Ressource einen Namen gibt. Sie verwenden diesen Schlüssel, um die Ressource in Ihrem XAML-Code nachzuschlagen.
Bevor Sie eine Ressource verwenden können, müssen Sie sie in einem Ressourcenverzeichnis speichern.
Was ist ResourceDictionary?
ResourceDictionary ist eine .NET MAUI-Bibliotheksklasse, die für die Verwendung mit UI-Ressourcen angepasst ist. Es handelt sich um ein Schlüsselverzeichnis, daher werden Schlüssel-Wert-Paare gespeichert. Der Schlüsseltyp ist auf String beschränkt, der Wert kann jedes beliebige Objekt sein.
Jede .NET MAUI-XAML-Seite verfügt über eine Eigenschaft mit dem Namen Resources, die ein ResourceDictionary-Objekt enthalten kann. Die Eigenschaft ist standardmäßig NULL, sodass Sie vor der Verwendung zunächst eine Instanz dieses Dictionary erstellen müssen. Der folgende Code zeigt, wie Sie ein ResourceDictionary-Objekt erstellen und es der Resourcen-Eigenschaft einer ContentPage zuweisen würden:
<ContentPage.Resources>
<ResourceDictionary>
...
</ResourceDictionary>
</ContentPage.Resources>
.NET MAUI XAML verfügt über eine integrierte Komfortsyntax, die die Wörterbuchinstanz automatisch erstellt, sobald Sie die Eigenschaft Ressourcen verwenden. Das oben stehende Beispiel kann zum folgenden Code vereinfacht werden:
<ContentPage.Resources>
...
</ContentPage.Resources>
Jede Seite in Ihrer App kann ihr eigenes Wörterbuch haben. Sie verwenden diese seitenspezifischen Dictionarys, um Ressourcen zu speichern, die ausschließlich auf dieser Seite verwendet werden.
Hinweis
Jedes Steuerelement auf einer Seite kann auch sein eigenes Ressourcenverzeichnis haben. So können Sie zum Beispiel ein Ressourcenverzeichnis zu einem Etiketten-Steuerelement hinzufügen:
<Label Text="Hello, World!"
...
<Label.Resources>
...
</Label.Resources>
</Label>
Abgesehen von Layouts und Ansichten, die untergeordnete Elemente enthalten können, ist es nicht üblich, dies auf Steuerelementebene zu tun.
Erstellen einer Ressource
Um eine Ressource zu erstellen, deklarieren Sie sie innerhalb der Resourcen-Eigenschaft für eine Seite. Im folgenden Beispiel wird die zuvor beschriebene Textfarbressource erstellt.
<ContentPage.Resources>
<Color x:Key="PageControlTextColor">Blue</Color>
</ContentPage.Resources>
Wenn Sie einen Schlüssel für Ihre Ressource auswählen, wählen Sie einen Namen aus, der die Verwendung und nicht den Wert der Ressource widerspiegelt. Wenn Sie z. B. den Hintergrund einer Bezeichnung auf „Rot“ festlegen möchten, verwenden Sie nicht RedColor als Schlüssel, sondern stattdessen BackgroundColor.
Anwenden einer Ressource mit StaticResource
StaticResource ist eine Markuperweiterung, die zum Suchen von Ressourcen in einem Ressourcenverzeichnis verwendet wird. Sie stellen den Schlüssel der Ressource bereit, und die Markuperweiterung gibt den entsprechenden Wert zurück. Das folgende XAML-Markup zeigt ein Beispiel, das eine Color
-Ressource mit dem Namen PageControlTextColor erstellt und verwendet. Das XAML-Markup für das Bezeichnungssteuerelement im Beispiel verwendet die StaticResource-Markuperweiterung, um den Wert abzurufen.
<ContentPage.Resources>
<Color x:Key="PageControlTextColor">Blue</Color>
</ContentPage.Resources>
...
<Label TextColor="{StaticResource PageControlTextColor}" ... />
Die Erweiterung wird staticResource genannt, da die Erweiterung nur einmal ausgewertet wird. Die Suche im Schlüsselverzeichnis erfolgt, wenn das Zielobjekt erstellt wird. Die Zieleigenschaft wird nicht aktualisiert, wenn sich der Wert der Ressource im Verzeichnis ändert.
Warnung
StaticResource löst zur Laufzeit eine Ausnahme aus, wenn der Schlüssel nicht gefunden wird.
Systeminterne XAML-Typen
Im ursprünglichen Beispiel, das zu Beginn dieser Einheit dargestellt wwurde, werden die TextColor-Eigenschaft und die FontSizet-Eigenschaft festgelegt:
<Label TextColor="Blue" FontSize="14">
<Button TextColor="Blue" FontSize="14">
FontSize hat den Typ Double. Zum Erstellen einer Ressource für diesen Wert verwenden Sie einen der in der XAML-Spezifikation definierten systeminternen XAML-Typen. Die XAML-Spezifikation definiert Typnamen für viele der einfachen C#-Typen. Der folgende Code zeigt Beispielressourcen für jeden der systeminternen Typen.
<ContentPage.Resources>
<x:String x:Key="...">Hello</x:String>
<x:Char x:Key="...">X</x:Char>
<x:Single x:Key="...">31.4</x:Single>
<x:Double x:Key="...">27.1</x:Double>
<x:Byte x:Key="...">8</x:Byte>
<x:Int16 x:Key="...">16</x:Int16>
<x:Int32 x:Key="...">32</x:Int32>
<x:Int64 x:Key="...">64</x:Int64>
<x:Decimal x:Key="...">12345</x:Decimal>
<x:TimeSpan x:Key="...">1.23:5959</x:TimeSpan>
<x:Boolean x:Key="...">True</x:Boolean>
</ContentPage.Resources>
Festlegen plattformspezifischer Werte für eine Ressource
In der Regel müssen Sie die Benutzeroberfläche Ihrer App für verschiedene Plattformen leicht anpassen. Die Standardmethode zum Definieren der plattformspezifischen Werte ist die Verwendung eines OnPlatform-Objekts beim Definieren einer Ressource. Der folgende Code zeigt beispielsweise, wie eine Ressource erstellt wird, die auf unterschiedliche Textfarben unter iOS, Android, macOS (Mac Catalyst) und Windows (WinUI) verweist.
<ContentPage.Resources>
<OnPlatform x:Key="textColor" x:TypeArguments="Color">
<On Platform="iOS" Value="Silver" />
<On Platform="Android" Value="Green" />
<On Platform="WinUI" Value="Yellow" />
<On Platform="MacCatalyst" Value="Pink" />
</OnPlatform>
</ContentPage.Resources>
...
<Label TextColor="{StaticResource textColor}" ... />