Sdílet prostřednictvím


Prostředky a kód

Tento přehled se zaměřuje na to, jak lze k prostředkům WINDOWS Presentation Foundation (WPF) přistupovat nebo vytvářet pomocí kódu místo syntaxe XAML (Extensible Application Markup Language). Další informace o obecném využití prostředků a prostředcích z hlediska syntaxe XAML najdete v tématu Prostředky XAML.

Přístup ke zdrojům z kódu

Klíče, které identifikují prostředky, pokud jsou definovány prostřednictvím XAML, se také používají k načtení konkrétních prostředků v případě, že požadujete prostředek v kódu. Nejjednodušší způsob, jak načíst prostředek z kódu, je volat buď metodu FindResource, nebo TryFindResource z objektů na úrovni rámce ve vaší aplikaci. Rozdíl chování mezi těmito metodami spočívá v tom, co se stane v případě, že požadovaný klíč nebyl nalezen. FindResource vyvolá výjimku; TryFindResource nevyvolá výjimku, ale vrátí null. Každá metoda vezme klíč prostředku jako vstupní parametr a vrátí volně zadaný objekt. Klíč prostředku je obvykle řetězec, ale občas dochází k neřetězcovým použitím; podrobnosti vizte v části Použití objektů jako klíčů. Vrácený objekt obvykle přetypujete na typ požadovaný vlastností, kterou nastavujete při vyžádání prostředku. Vyhledávací logika pro řešení prostředků kódu je stejná jako u odkazů na dynamické prostředky v XAML. Hledání prostředků začíná z volajícího elementu a pak pokračuje k následným nadřazeným prvkům v logickém stromu. Vyhledávání pokračuje v prostředcích aplikace, motivech a systémových prostředcích, pokud je to nutné. Požadavek na kód prostředku správně zohlední běhové změny ve slovnících prostředků, které mohly být provedeny po načtení slovníku prostředků z XAML, a také změny systémových prostředků v reálném čase.

Následuje stručný příklad kódu, který najde prostředek podle klíče a použije vrácenou hodnotu k nastavení vlastnosti, implementované jako obslužná rutina události Click.

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

Alternativní metodou pro přiřazení referenčního odkazu na prostředek je SetResourceReference. Tato metoda má dva parametry: klíč prostředku a identifikátor konkrétní vlastnosti závislosti, která je přítomna v instanci prvku, ke které má být přiřazena hodnota prostředku. Tato metoda je funkčně stejná a má výhodu, že nevyžaduje přetypování vrácených hodnot.

Dalším způsobem přístupu k prostředkům prostřednictvím kódu programu je přístup k obsahu vlastnosti Resources jako slovníku. Přístup ke slovníku obsaženému v této vlastnosti je také způsob, jak přidat nové prostředky do existujících kolekcí, zkontrolovat, jestli daný název klíče už v kolekci existuje, a další operace slovníku a kolekce. Pokud píšete aplikaci WPF zcela v kódu, můžete také vytvořit kolekci v celém kódu, přiřadit klíče a pak přiřadit dokončenou kolekci vlastnosti Resources existujícího prvku. Bude popsáno v další části.

Můžete indexovat v libovolné kolekci Resources pomocí konkrétního klíče jako indexu, ale měli byste vědět, že přístup k prostředku tímto způsobem neodpovídá běžným pravidlům runtime pro řešení prostředků. K této konkrétní kolekci přistupujete jenom vy. Vyhledávání prostředků neprochází oborem ke kořenu nebo k aplikaci, pokud nebyl v požadovaném klíči nalezen žádný platný objekt. Tento přístup ale může mít v některých případech výhody výkonu přesně proto, že rozsah hledání klíče je omezenější. Další podrobnosti o tom, jak pracovat se slovníkem prostředků přímo, najdete ve třídě ResourceDictionary.

Vytváření prostředků pomocí kódu

Pokud chcete v kódu vytvořit celou aplikaci WPF, můžete také v kódu vytvořit všechny prostředky v této aplikaci. Chcete-li toho dosáhnout, vytvořte novou instanci ResourceDictionary a potom přidejte všechny prostředky do slovníku postupnými voláními ResourceDictionary.Add. Poté použijte vytvořené ResourceDictionary k nastavení vlastnosti Resources u elementu, který je v rozsahu stránky, nebo Application.Resources. Můžete také zachovat ResourceDictionary jako samostatný objekt bez jeho přidání do elementu. Pokud to ale uděláte, musíte k prostředkům v něm přistupovat pomocí klíče položky, jako by šlo o obecný slovník. ResourceDictionary, která není připojena k vlastnosti prvku Resources, by neexistovala jako součást stromu elementu a neměla by žádný obor ve vyhledávací sekvenci, kterou mohou použít metody jako FindResource a s nimi související metody.

Použití objektů jako klíčů

Většina využití prostředků nastaví klíč prostředku na řetězec. Různé funkce WPF však záměrně nepoužívají typ řetězce k určení klíčů, místo toho je tento parametr objektem. Možnost mít prostředky, které jsou klíčovány objektem, se využívá ve stylu a podpoře motivů WPF. Styly v motivech, které se stanou výchozím stylem pro jinak nestylovaný ovládací prvek, jsou určeny podle Type ovládacího prvku, na který se mají použít. Klíčování podle typu poskytuje spolehlivý vyhledávací mechanismus, který funguje na výchozích instancích každého typu ovládacího prvku, a typ lze rozpoznat reflexí a použít pro stylování odvozených tříd, i když odvozený typ jinak nemá žádný výchozí styl. Klíč Type pro prostředek definovaný v XAML můžete zadat pomocí rozšíření značek x:Type. Existují podobná rozšíření pro jiné použití neřetězcových klíčů, které podporují funkce WPF, například ComponentResourceKey Rozšíření značkování.

Viz také