Ressourcen und Code
Aktualisiert: November 2007
In dieser Übersicht wird erläutert, wie auf Windows Presentation Foundation (WPF)-Ressourcen zugegriffen wird und wie sie mit Code anstelle der Extensible Application Markup Language (XAML)-Syntax erstellt werden. Weitere Informationen über die allgemeine Ressourcenverwendung und Ressourcen aus einer XAML-Syntaxperspektive finden Sie unter Übersicht über Ressourcen.
Dieses Thema enthält folgende Abschnitte.
- Zugreifen auf Ressourcen mit Code
- Erstellen von Ressourcen mit Code
- Verwenden von Objekten als Schlüssel
- Verwandte Abschnitte
Zugreifen auf Ressourcen mit Code
Wenn die Schlüssel, die Ressourcen identifizieren, mit XAML definiert sind, werden sie auch zum Abrufen spezifischer Ressourcen verwendet, wenn Sie die Ressource im Code abrufen. Der einfachste Weg, eine Ressource aus Code abzurufen, besteht darin, entweder die FindResource-Methode oder die TryFindResource-Methode aus Objekten auf Frameworkebene in Ihrer Anwendung aufzurufen. Diese Methoden unterscheiden sich in ihrem Verhalten, 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. Typischerweise handelt es sich bei einem Ressourcenschlüssel um eine Zeichenfolge. In seltenen Fällen werden sie auch nicht als Zeichenfolge verwendet. Weitere Informationen finden Sie im Abschnitt Objekte als Schlüssel verwenden. In der Regel wandeln Sie das zurückgegebene Objekt in den Typ um, der für die Eigenschaft erforderlich ist, die Sie beim Anfordern der Ressourcen festlegen. Die Suchlogik für die Coderessourcenauflösung ist mit dem dynamischen Ressourcenverweis für XAML identisch. Die Suche nach Ressourcen beginnt beim aufrufenden Element und wird dann bei darauf folgenden übergeordneten Elementen in der logischen Struktur fortgesetzt. Die Suche wird ggf. in den Anwendungsressourcen, Designs und Systemressourcen fortgesetzt. Eine Codeanforderung für eine Ressource wird entsprechend für Laufzeitänderungen in Ressourcenwörterbüchern berücksichtigt, die möglicherweise nach dem Laden des Ressourcenwörterbuchs aus XAML vorgenommen wurden, sowie für Echtzeitänderungen an Systemressourcen.
Im Folgenden finden Sie ein kurzes Codebeispiel, in dem eine Ressource nach Schlüssel gesucht und der zurückgegebene Wert zum Festlegen einer Eigenschaft verwendet wird, die als Click-Ereignishandler implementiert wird.
void SetBGByResource(object sender, RoutedEventArgs e)
{
Button b = sender as Button;
b.Background = (Brush)this.FindResource("RainbowBrush");
}
Eine alternative Methode zum Zuweisen eines Ressourcenverweises besteht in SetResourceReference. Für diese Methode sind zwei Parameter erforderlich: der Schlüssel der Ressource und der Bezeichner für eine bestimmte Abhängigkeitseigenschaft, die in der Elementinstanz vorhanden ist, der Sie den Ressourcenwert zuweisen möchten. Funktionell ist die Methode mit der anderen identisch. Sie hat den Vorteil, dass keine Umwandlungen von Rückgabewerten erforderlich sind.
Eine weitere Möglichkeit, programmgesteuert auf Ressourcen zuzugreifen, besteht im Zugriff auf die Inhalte der Resources-Eigenschaft als Wörterbuch. Durch den Zugriff auf das Wörterbuch, das in dieser Eigenschaft enthalten ist, können Sie auch neue Ressourcen zu vorhandenen Auflistungen hinzufügen oder überprüfen, ob ein bestimmter Schlüssel bereits in der Auflistung vorhanden ist, und auch andere Wörterbuch-/Auflistungsvorgänge ausführen. Wenn Sie eine WPF-Anwendung komplett in Code schreiben, können Sie auch die vollständige Auflistung in Code erstellen und die fertige Auflistung dann der Resources-Eigenschaft eines eingerichteten Elements hinzufügen. Dies wird im nächsten Abschnitt ausführlich beschrieben.
Sie können in einer beliebigen Resources-Auflistung einen Index erstellen und dazu einen bestimmten Schlüssel als Index verwenden. Wenn Sie auf diese Weise auf die Ressource zugreifen, befolgen Sie jedoch die normalen Laufzeitregeln der Ressourcenauflösung nicht. Sie greifen auf nur diese bestimmte Auflistung zu. Bei der Ressourcensuche wird nicht der Bereich bis zum Stamm oder zur Anwendung durchlaufen, wenn beim angeforderten Schlüssel kein gültiges Objekt gefunden wurde. Dieser Ansatz kann jedoch in manchen Fällen auch Vorteile hinsichtlich der Leistung mit sich bringen, gerade weil der Suchbereich für den Schlüssel eingeschränkt ist. Weitere Informationen zum direkten Arbeiten mit dem Ressourcenwörterbuch finden Sie in der ResourceDictionary-Klasse.
Erstellen von Ressourcen mit Code
Wenn Sie eine vollständige WPF-Anwendung in Code erstellen, können Sie beliebige Ressourcen in dieser Anwendung ebenfalls in Code erstellen. Erstellen Sie dazu eine neue ResourceDictionary-Instanz, und fügen Sie dann alle Ressourcen mit wiederholten Aufrufen von ResourceDictionary.Add dem Wörterbuch hinzu. Legen Sie anschließend mit dem auf diese Weise erstellten ResourceDictionary die Resources-Eigenschaft für ein Element fest, das in einem Seitenbereich oder in Application.Resources vorhanden ist. Sie können ResourceDictionary auch als eigenständiges Objekt beibehalten, ohne es einem Element hinzuzufügen. In diesem Fall müssen Sie jedoch wie bei einem allgemeinen Wörterbuch mit einem Elementschlüssel auf die darin enthaltenen Ressourcen zugreifen. Ein ResourceDictionary, das nicht an eine Resources-Elementeigenschaft angefügt wird, ist nicht als Teil der Elementstruktur vorhanden und besitzt keinen Bereich in einer Suchsequenz, die von FindResource und zugehörigen Methoden verwendet werden kann.
Verwenden von Objekten als Schlüssel
Die meisten Ressourcenverwendungen legen den Schlüssel der Ressource als Zeichenfolge fest. Verschiedene WPF-Features verwenden jedoch absichtlich keinen Zeichenfolgetyp zur Angabe von Schlüsseln. Stattdessen befindet sich dieser Parameter in einem Objekt. Die Fähigkeit, die Ressource nach Objekt zu sortieren, wird von der Unterstützung für WPF-Stil und -Design verwendet. Die Stile in Designs, die als Standardstil für ein ansonsten nicht formatiertes Steuerelement verwendet werden, werden jeweils nach Type des Steuerelements sortiert, auf das sie angewendet werden sollen. Die Sortierung nach Typ bietet einen zuverlässigen Suchmechanismus, der in den Standardinstanzen jedes Steuerelementtyps funktioniert. Der Typ kann durch Reflektion erkannt und für abgeleitete Stilklassen verwendet werden, auch wenn der abgeleitete Typ keinen anderen Standardstil aufweist. Sie können einen Type-Schlüssel für eine Ressource angeben, die in XAML mit x:Type-Markuperweiterung definiert ist. Ähnliche Erweiterungen sind für andere Verwendungen, in denen der Schlüssel keine Zeichenfolge darstellt, vorhanden, und die WPF-Features wie ComponentResourceKey-Markuperweiterung unterstützen.