Ressourcen im Code (WPF .NET)

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

Zugreifen auf Ressourcen aus dem Code

Die Schlüssel, die XAML-definierte Ressourcen identifizieren, 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 zurück null. Jede Methode verwendet den Ressourcenschlüssel als Eingabeparameter und gibt ein lose typisiertes Objekt zurück.

In der Regel ist ein Ressourcenschlüssel eine Zeichenfolge, es gibt jedoch gelegentlich Nichtzeichenfolgenverwendungen. Die Suchlogik für die Coderessourcenauflösung entspricht dem XAML-Fall des dynamischen Ressourcenverweises. 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 berücksichtigt ordnungsgemäß Änderungen an diesen Ressourcen, die während der Laufzeit aufgetreten sind.

Im folgenden Codebeispiel wird ein Click-Ereignishandler veranschaulicht, der eine Ressource nach Schlüssel findet und den zurückgegebenen Wert verwendet, 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 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. Ressourcenwörterbücher werden verwendet, um vorhandene Sammlungen neue Ressourcen hinzuzufügen, überprüfen Sie, ob ein gegebener Schlüsselname bereits von der Sammlung und anderen Vorgängen verwendet wird. Wenn Sie eine WPF-Anwendung vollständig im Code schreiben, können Sie auch die gesamte Sammlung im Code erstellen, zuweisen Sie ihm Ressourcen. Die Sammlung kann der Resources-Eigenschaft eines Elements zugewiesen werden. Dies wird im nächsten Abschnitt beschrieben.

Sie können innerhalb einer beliebigen Resources Sammlung einen bestimmten Schlüssel als Index indizieren. Auf diese Weise zugreifene Ressourcen folgen nicht den normalen Laufzeitregeln der Ressourcenauflösung. Sie greifen nur auf diese bestimmte Sammlung zu. Die Ressourcensuche durchläuft den Ressourcenbereich nicht bis zur Wurzel oder zur Anwendung, wenn kein gültiges Objekt unter dem 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. 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 dann alle Ressourcen zum Wörterbuch hinzu, indem Sie nacheinander ResourceDictionary.Add aufrufen. Weisen Sie dann die so erstellte ResourceDictionary zum Festlegen der Resources-Eigenschaft zu, 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-Features verwenden den Objekttyp jedoch absichtlich als Schlüssel anstelle einer Zeichenfolge. Die Fähigkeit, die Ressource mit einem Objekttypen 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 Schlüsselschlüsselung nach Typ bietet einen zuverlässigen Suchmechanismus, der auf Standardinstanzen jedes Steuerelementtyps funktioniert. Der Typ kann durch Reflektion erkannt und für die Formatierung abgeleiteter Klassen verwendet werden, auch wenn der abgeleitete Typ andernfalls keinen Standardstil 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.

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

Weitere Informationen