Freigeben über


Ressourcen und Code

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

Zugreifen auf Ressourcen aus Code

Die Schlüssel, die Ressourcen identifizieren, wenn sie über XAML definiert werden, werden auch verwendet, um bestimmte Ressourcen abzurufen, wenn Sie die Ressource im Code anfordern. Die einfachste Möglichkeit zum Abrufen einer Ressource aus Code besteht darin, entweder die FindResource oder die TryFindResource-Methode aus Objekten auf Frameworkebene 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 aber nullzurück. 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 gelegentlich nicht-Zeichenfolgenverwendungen. Weitere Informationen finden Sie im Abschnitt Verwenden von Objekten als Schlüssel. In der Regel würden Sie das zurückgegebene Objekt in den Typ umwandeln, der von der Eigenschaft benötigt wird, die Sie beim Anfordern der Ressource einstellen. 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 geht dann zu den nachfolgenden übergeordneten Elementen in der logischen Struktur über. Bei Bedarf wird die Suche in Anwendungsressourcen, Themen und Systemressourcen fortgesetzt. Eine Codeanforderung für eine Ressource berücksichtigt ordnungsgemäß Laufzeitänderungen in Ressourcenwörterbüchern, die möglicherweise nach dem Laden des Ressourcenwörterbuchs aus XAML vorgenommen wurden, sowie Änderungen der Systemressourcen in Echtzeit.

Das folgende ist ein kurzes Codebeispiel, das eine Ressource mithilfe eines Schlüssels findet und den zurückgegebenen Wert verwendet, um eine Eigenschaft festzulegen, das 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 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. Der Zugriff auf das in dieser Eigenschaft enthaltene Wörterbuch ermöglicht es Ihnen auch, neuen Ressourcen zu vorhandenen Sammlungen hinzuzufügen, zu überprüfen, ob ein bestimmter Schlüsselname bereits in der Sammlung verwendet wird, und andere Wörterbuch-/Sammlungsvorgänge auszuführen. Wenn Sie eine WPF-Anwendung vollständig in Code schreiben, können Sie auch die gesamte Sammlung im Code erstellen, ihm Schlüssel zuweisen und die fertige Auflistung dann der Resources Eigenschaft eines etablierten Elements zuweisen. Dies wird im nächsten Abschnitt beschrieben.

Sie können innerhalb einer Resources-Auflistung mit einem bestimmten Schlüssel als Index indizieren. Beachten Sie jedoch, dass der Zugriff auf die Ressource auf diese Weise nicht den normalen Regeln der Ressourcenauflösung in der Laufzeitumgebung entspricht. Sie greifen nur auf diese bestimmte Sammlung zu. Die Suche nach Ressourcen wird nicht zum Stamm oder zur Anwendung hin ausgeweitet, wenn beim angeforderten Schlüssel kein gültiges Objekt gefunden wird. Dieser Ansatz kann jedoch in einigen Fällen Leistungsvorteile haben, weil der Umfang der Suche nach dem Schlüssel eingeschränkter ist. Weitere Details dazu, wie man direkt mit dem Ressourcenwörterbuch arbeitet, finden Sie in der Klasse ResourceDictionary.

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 durch aufeinanderfolgende Aufrufe von ResourceDictionary.Addzum Wörterbuch hinzu. ** Verwenden Sie dann die erstellte ResourceDictionary, um die Resources-Eigenschaft für ein Element festzulegen, das im Seitenscope vorhanden ist, oder nutzen Sie die Application.Resources. Sie können die ResourceDictionary auch als eigenständiges Objekt verwalten, ohne es einem Element hinzuzufügen. Wenn Sie dies tun, müssen Sie jedoch über einen Elementschlüssel auf die darin enthaltenen Ressourcen zugreifen, als wäre es ein generisches Wörterbuch. Eine ResourceDictionary, die nicht als Eigenschaft eines Elements Resources angefügt ist, ist nicht Teil der Elementstruktur und hat keinen Gültigkeitsbereich in einer Suchreihenfolge, die 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 jedoch absichtlich keinen Zeichenfolgentyp, um Schlüssel anzugeben, stattdessen handelt es sich bei diesem Parameter um ein Objekt. Die Fähigkeit, die Ressource über ein Objekt zu schlüsseln, wird von der Stil- und Themenunterstützung in WPF verwendet. Die Formatvorlagen in Designs, die zur Standardformatvorlage für ein ansonsten nicht formatiertes Steuerelement werden, sind jeweils mit dem Schlüssel Type des Steuerelements versehen, auf das sie angewendet werden sollen. Das Keying nach Typ bietet einen zuverlässigen Nachschlagemechanismus, der auf Standardinstanzen jedes Steuerelementtyps funktioniert, und der Typ kann durch Reflexion erkannt und zum Styling abgeleiteter Klassen verwendet werden, auch wenn der abgeleitete Typ sonst keinen Standardstil hat. Sie können einen Type Schlüssel für eine ressource angeben, die in XAML definiert ist, indem Sie die x:Type Markup Extensionverwenden. Ähnliche Erweiterungen existieren für andere Verwendungen von Nicht-String-Schlüsseln, die WPF-Features unterstützen, z. B. ComponentResourceKey Markup Extension.

Siehe auch