Freigeben über


Ressourcen im Code

Diese Übersicht konzentriert sich darauf, wie auf Windows Presentation Foundation (WPF)-Ressourcen mithilfe von Code und nicht mithilfe von XAML-Syntax zugegriffen oder erstellt werden kann. Weitere Informationen zur allgemeinen Ressourcennutzung und Ressourcen aus xaml-Syntaxperspektive finden Sie unter Übersicht über XAML-Ressourcen.

Zugreifen auf Ressourcen aus Code

Die Schlüssel, mit denen XAML-definierte Ressourcen identifiziert werden, werden auch verwendet, um bestimmte Ressourcen abzurufen, wenn Sie die Ressource im Code anfordern. Die einfachste Möglichkeit, eine Ressource aus Code abzurufen, besteht darin, entweder die FindResource- oder die TryFindResource-Methode von Objekten auf Framework-Ebene in Ihrer Anwendung aufzurufen. Der Verhaltensunterschied 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 zurück null. Jede Methode verwendet den Ressourcenschlüssel als Eingabeparameter und gibt ein lose typiertes Objekt zurück.

In der Regel ist ein Ressourcenschlüssel eine Zeichenfolge, es gibt jedoch gelegentliche nicht-zeichenfolgenartige Verwendungen. Die Nachschlagelogik für die Coderessourcenauflösung entspricht dem XAML-Fall für dynamische Ressourcenreferenzen. Die Suche nach Ressourcen beginnt mit dem aufrufenden Element und wird dann durch übergeordnete Elemente in der logischen Struktur fortgesetzt. Die Suche wird bei Bedarf weiter in Anwendungsressourcen, Themen und Systemressourcen fortgesetzt. Eine Codeanforderung für eine Ressource berücksichtigt ordnungsgemäß Änderungen an den Ressourcen, die während der Laufzeit aufgetreten sind.

Das folgende Codebeispiel veranschaulicht einen Click Ereignishandler, der eine Ressource nach Schlüssel findet, und verwendet den zurückgegebenen Wert, um eine Eigenschaft festzulegen.

private void myButton_Click(object sender, RoutedEventArgs e)
{
    Button button = (Button)sender;
    button.Background = (Brush)this.FindResource("RainbowBrush");
}
Private Sub myButton_Click(sender As Object, e As RoutedEventArgs)
    Dim buttonControl = DirectCast(sender, Button)
    buttonControl.Background = DirectCast(Me.FindResource("RainbowBrush"), Brush)
End Sub

Eine alternative Methode zum Zuweisen eines Ressourcenverweises ist SetResourceReference. Diese Methode verwendet zwei Parameter: den Schlüssel der Ressource und den Bezeichner für eine bestimmte Abhängigkeitseigenschaft, die in der Elementinstanz vorhanden ist, der der Ressourcenwert zugewiesen werden soll. Funktionell ist diese Methode identisch und hat den Vorteil, dass keine Umwandlung von Rückgabewerten erforderlich ist.

Eine weitere Möglichkeit, programmgesteuert auf Ressourcen zuzugreifen, besteht darin, auf den Inhalt der Resources Eigenschaft als Wörterbuch zuzugreifen. Ressourcenwörterbücher werden verwendet, um vorhandenen Sammlungen neue Ressourcen hinzuzufügen, zu überprüfen, ob ein bestimmter Schlüsselname bereits von der Sammlung verwendet wird, und für andere Vorgänge. Wenn Sie eine WPF-Anwendung vollständig im Code schreiben, können Sie auch die gesamte Sammlung im Code erstellen und ihm Ressourcen zuweisen. Die Auflistung kann dann der Resources Eigenschaft eines Elements zugewiesen werden. Dies wird im nächsten Abschnitt beschrieben.

Sie können in jeder beliebigen Resources-Sammlung einen bestimmten Schlüssel als Index verwenden. Ressourcen, auf die auf diese Weise zugegriffen wird, entsprechen nicht den normalen Laufzeitregeln der Ressourcenauflösung. Sie greifen nur auf diese bestimmte Sammlung zu. Die Ressourcensuche geht nicht durch den Ressourcen-Scope bis zur Wurzel oder Anwendungen, wenn beim angeforderten Schlüssel kein gültiges Objekt gefunden wurde. Dieser Ansatz kann jedoch in einigen Fällen Leistungsvorteile haben, weil der Umfang der Suche nach dem Schlüssel eingeschränkter ist. Weitere Informationen zum direkten Arbeiten mit einem Ressourcenwörterbuch finden Sie in der ResourceDictionary Klasse.

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 Sie dann alle Ressourcen mithilfe aufeinander folgender Aufrufe ResourceDictionary.Addzum Wörterbuch hinzu. Weisen Sie dann das erstellte ResourceDictionary zu, um die Resources-Eigenschaft eines Elements festzulegen, das in einem Seitenbereich oder im Application.Resources vorhanden ist. Sie können das ResourceDictionary Objekt auch als eigenständiges Objekt verwalten, ohne es einem Element hinzuzufügen. Wenn Sie dies tun, müssen Sie jedoch nach Elementschlüssel auf die darin enthaltenen Ressourcen zugreifen, als ob es sich um ein generisches Wörterbuch handelt. Ein ResourceDictionary-Element, das nicht an eine Element-Eigenschaft Resources angeheftet ist, existiert nicht als Teil der Elementstruktur und hat keinen Zugriff im Abfrageablauf, der von FindResource und verwandten Methoden verwendet werden kann.

Verwenden von Objekten als Schlüssel

Die meisten Ressourcenverwendungen legen den Schlüssel der Ressource auf eine Zeichenfolge fest. Verschiedene WPF-Features verwenden den Objekttyp jedoch absichtlich als Schlüssel anstelle einer Zeichenfolge. Die Möglichkeit, eine Ressource durch einen Objekttyp zu schlüsseln, wird von der WPF-Stil- und Themenunterstützung verwendet. Die Stile und Designs, die zum Standard für ein nicht anderweitig formatiertes Steuerelement werden, werden jeweils durch die Type des Steuerelements, auf das sie angewendet werden sollen, zugewiesen.

Der Schlüssel nach Typ bietet einen zuverlässigen Suchmechanismus, der mit den Voreinstellungen der jeweiligen Steuerelementtypen funktioniert. Der Typ kann durch Spiegelung erkannt und zum Formatieren abgeleiteter Klassen verwendet werden, obwohl der abgeleitete Typ andernfalls keine Standardformatvorlage aufweist. Sie können einen Type Schlüssel für eine ressource angeben, die in XAML definiert ist, indem Sie die x:Type-Markuperweiterung verwenden. Ähnliche Erweiterungen sind für andere Nichtzeichenfolgenschlüsselverwendungen vorhanden, die WPF-Features unterstützen, z. B. ComponentResourceKey Markup Extension.

Weitere Informationen finden Sie unter Stile, DataTemplates und implizite Schlüssel.

Siehe auch