Ressourcen und Code

Diese Übersicht konzentriert sich darauf, wie auf WPF-Ressourcen (Windows Presentation Foundation) zugegriffen wird oder wie diese mit Code anstelle von XAML-Syntax (Extensible Application Markup Language) erstellt werden können. Weitere Informationen zur allgemeine Ressourcenverwendung und Ressourcen aus XAML-Syntaxperspektive finden Sie unter XAML-Ressourcen.

Zugreifen auf Ressourcen aus dem Code

Die Schlüssel, die Ressourcen identifizieren, wenn sie über XAML festgelegt sind, werden auch verwendet, um bestimmte Ressourcen abrufen, wenn Sie die Ressource im Code anfordern. Der einfachste Weg, eine Ressource aus dem Code abzurufen, besteht darin, entweder die FindResource- oder die TryFindResource-Methode von Objekten auf Framework-Ebene in Ihrer Anwendung aufzurufen. Der Verhaltensunterschiede zwischen diesen Methoden ist: Was geschieht, wenn der angeforderte Schlüssel nicht gefunden wird. FindResource löst eine Ausnahme aus; TryFindResource löst keine Ausnahme aus, gibt jedoch null zurück. Jede Methode verwendet den Ressourcenschlüssel als Eingabeparameter und gibt ein lose typisiertes Objekt zurück. In der Regel ist der Ressourcenschlüssel eine Zeichenfolge, aber es gibt gelegentlich Objektressourcenverwendungen; mehr dazu finden Sie unter dem Abschnitt Verwendung von Objekten als Schlüssel. In der Regel wandeln Sie das zurückgegebene Objekt, durch die Eigenschaft, die Sie beim Anfordern der Ressourcen festlegen, in den erforderlichen Typ um. Die Suchlogik für die Coderessourcenauflösung entspricht dem XAML-Fall des dynamischen Ressourcenverweiss. Die Suche nach Ressourcen beginnt beim aufrufenden Element und wird anschließend bei aufeinanderfolgenden, übergeordneten Elementen in der logischen Struktur fortgesetzt. Die Suche wird in den Anwendungsressourcen, Designs und bei Bedarf in den Systemressourcen fortgesetzt. Eine Codeanforderung für eine Ressource wird Laufzeitänderungen in Ressourcenwörterbüchern ordnungsgemäß erfassen, die möglicherweise anschließend von diesem Ressourcenverzeichnis erfolgen, das von XAML aus geladen wurde, und auch für die Echtzeit-Systemressourcenänderungen.

Im Folgenden finden Sie ein kurzes Codebeispiel, das eine Ressource anhand eines Schlüssels sucht und den zurückgegebenen Wert verwendet, um eine Eigenschaft zu setzen, die als Click-Ereignishandler implementiert ist.

void SetBGByResource(object sender, RoutedEventArgs e)
{
  Button b = sender as Button;
  b.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub SetBGByResource(ByVal sender As Object, ByVal e As RoutedEventArgs)
  Dim b As Button = TryCast(sender, Button)
  b.Background = CType(Me.FindResource("RainbowBrush"), Brush)
End Sub

Eine alternative Methode für die Zuweisung einer Ressourcenreferenz ist SetResourceReference. Diese Methode akzeptiert zwei Parameter: Den Schlüssel der Ressource und den Bezeichner für eine bestimmte Abhängigkeitseigenschaft, die in der Elementinstanz vorhanden ist, der der Wert zugewiesen werden soll. Konkret ist diese Methode die Gleiche und hat den Vorteil, dass keine Umwandlung von Rückgabewerten erforderlich ist.

Eine weitere Möglichkeit, programmatisch auf Ressourcen zuzugreifen, ist der Zugriff auf den Inhalt der Resources-Eigenschaft in Form eines Wörterbuchs. Durch das Zugreifen auf das Wörterbuch, das in dieser Eigenschaft enthalten ist, können Sie auch neue Ressourcen zu vorhandenen Auflistungen hinzufügen. Überprüfen Sie, ob ein angegebener Schlüsselname in der Auflistung vergeben ist, und überprüfen Sie auch andere Vorgänge im Wörterbuch bzw. in der Auflistung. Wenn Sie eine WPF-Anwendung komplett in Code schreiben, können Sie auch die gesamte Sammlung in Code erstellen, ihr Schlüssel zuweisen und dann die fertige Sammlung der Resources-Eigenschaft eines etablierten Elements zuweisen. Dies wird im nächsten Abschnitt erläutert.

Sie können in einer beliebigen Resources-Auflistung indizieren, indem Sie einen bestimmten Schlüssel als Index verwenden. Aber Sie sollten Bedenken, dass der Zugriff auf die Ressource auf diese Weise nicht den normalen Laufzeitegeln der Ressourcenauflösung folgt. Sie greifen nur auf diese bestimmte Auflistung zu. Die Ressourcensuche wird nicht den Geltungsbereich bis zum Stamm oder der Anwendung durchlaufen, wenn kein gültiges Objekt beim angeforderten Schlüssel gefunden wurde. Dieser Ansatz hat jedoch Leistungsvorteile in einigen Fällen, möglicherweise gerade weil der Suchbereich für den Schlüssel eingeschränkter ist. In der ResourceDictionary-Klasse finden Sie weitere Informationen darüber, wie Sie direkt mit dem Ressourcenwörterbuch arbeiten können.

Erstellen von Ressourcen mit Code

Wenn Sie eine gesamte WPF-Anwendung im Code erstellen möchten, können Sie auch alle Ressourcen in dieser Anwendung im Code erstellen. Um dies zu erreichen, erstellen Sie eine neue ResourceDictionary-Instanz und fügen dann alle Ressourcen zum Wörterbuch hinzu, indem Sie nacheinander ResourceDictionary.Add aufrufen. Verwenden Sie dann die so erstellte ResourceDictionary zum Festlegen der Resources-Eigenschaft, um sie auf ein Element zu setzen, das sich in einem Seitenbereich oder in der Application.Resources befindet. Sie können das ResourceDictionary auch als eigenständiges Objekt pflegen, ohne es einem Element hinzuzufügen. Wenn Sie dies jedoch tun, müssen Sie mit einem Elementschlüssel auf die darin enthaltenen Ressourcen zugreifen, als handele es sich um ein generisches Wörterbuch. Ein ResourceDictionary, das nicht an ein Resources-Eigenschaftselement angefügt ist, wird nicht als Teil der Elementstruktur vorhanden sein und besitzt keinen Geltungsbereich in einer Suchsequenz, die von FindResource und verwandten Methoden verwendet werden kann.

Verwendung von Objekten als Schlüssel

Die meisten Ressourcenverwendungen werden den Schlüssel der Ressource als eine Zeichenfolge festlegen. Verschiedene WPF-Funktionen verwenden jedoch absichtlich keinen Zeichenfolgetyp, um Schlüssel anzugeben, stattdessen ist dieser Parameter ein Objekt. Die Fähigkeit, die Ressource mit einem Objekt zu verschlüsseln, wird vom WPF-Stil und der Designunterstützung verwendet. Die Stile in Designs, die als Standardstil für ein ansonsten nicht formatiertes Steuerelement dienen, werden jeweils durch den Type des Steuerelements verschlüsselt, auf den sie angewendet werden sollen. Die Verschlüsselung nach dem Typ bietet einen zuverlässigen Suchmechanismus, der in den Standardinstanzen jedes Steuerelementtyps funktioniert, und der Typ kann durch Reflektion ermittelt und für die Formatierung abgeleiteter Klassen verwendet werden, obwohl der abgeleitete Typ andernfalls kein Standardformat hat. Sie können einen Type-Schlüssel für eine in XAML definierte Ressource angeben, indem Sie die x:Type Markup Extension verwenden. Ähnliche Erweiterungen sind für andere Schlüsselverwendungen vorhanden, die WPF-Funktionen, wie z. B. ComponentResourceKey-Markuperweiterungen, unterstützen.

Siehe auch