Zasoby i kod

To omówienie koncentruje się na sposobie uzyskiwania dostępu do zasobów programu Windows Presentation Foundation (WPF) lub tworzenia ich przy użyciu kodu, a nie rozszerzonej składni języka znaczników aplikacji (XAML). Aby uzyskać więcej informacji na temat ogólnego użycia zasobów i zasobów z perspektywy składni XAML, zobacz Zasoby XAML.

Uzyskiwanie dostępu do zasobów z poziomu kodu

Klucze identyfikujące zasoby, jeśli są zdefiniowane za pomocą języka XAML, są również używane do pobierania określonych zasobów, jeśli zażądasz zasobu w kodzie. Najprostszym sposobem pobrania zasobu z kodu jest wywołanie FindResource metody lub TryFindResource z obiektów na poziomie platformy w aplikacji. Różnica behawioralna między tymi metodami jest tym, co się stanie, jeśli żądany klucz nie zostanie znaleziony. FindResource zgłasza wyjątek; TryFindResource nie zgłosi wyjątku, ale zwróci wartość null. Każda metoda przyjmuje klucz zasobu jako parametr wejściowy i zwraca luźno wpisany obiekt. Zazwyczaj klucz zasobu jest ciągiem, ale czasami występują nieciągające użycie; Aby uzyskać szczegółowe informacje, zobacz sekcję Using Objects as Keys (Używanie obiektów jako kluczy ). Zazwyczaj zwracany obiekt jest rzutowany na typ wymagany przez właściwość ustawianą podczas żądania zasobu. Logika wyszukiwania dla rozpoznawania zasobów kodu jest taka sama jak przypadek XAML odwołania do zasobu dynamicznego. Wyszukiwanie zasobów rozpoczyna się od elementu wywołującego, a następnie kontynuuje kolejne elementy nadrzędne w drzewie logicznym. Wyszukiwanie jest kontynuowane do zasobów aplikacji, motywów i zasobów systemowych w razie potrzeby. Żądanie kodu zasobu będzie prawidłowo uwzględniać zmiany w słownikach zasobów, które mogły zostać wprowadzone po załadowaniu tego słownika zasobów z XAML, a także w przypadku zmian zasobów systemowych w czasie rzeczywistym.

Poniżej przedstawiono krótki przykład kodu, który znajduje zasób według klucza i używa zwróconej wartości do ustawienia właściwości zaimplementowanej jako Click procedura obsługi zdarzeń.

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

Alternatywną metodą przypisywania odwołania do zasobu jest SetResourceReference. Ta metoda przyjmuje dwa parametry: klucz zasobu i identyfikator określonej właściwości zależności, która znajduje się w wystąpieniu elementu, do którego ma zostać przypisana wartość zasobu. Funkcjonalnie ta metoda jest taka sama i ma zaletę braku konieczności rzutowania zwracanych wartości.

Innym sposobem uzyskiwania dostępu do zasobów programowo jest uzyskanie dostępu do zawartości Resources właściwości jako słownika. Uzyskiwanie dostępu do słownika zawartego przez tę właściwość jest również sposobem dodawania nowych zasobów do istniejących kolekcji. Sprawdź, czy dana nazwa klucza jest już zajęta w kolekcji, a także inne operacje słownika/kolekcji. Jeśli piszesz aplikację WPF w całości w kodzie, możesz również utworzyć całą kolekcję w kodzie, przypisać do niej klucze, a następnie przypisać zakończoną kolekcję do Resources właściwości ustalonego elementu. Zostanie to opisane w następnej sekcji.

Można indeksować w dowolnej Resources kolekcji przy użyciu określonego klucza jako indeksu, ale należy pamiętać, że uzyskiwanie dostępu do zasobu w ten sposób nie jest zgodne z normalnymi regułami środowiska uruchomieniowego rozpoznawania zasobów. Uzyskujesz dostęp tylko do tej konkretnej kolekcji. Wyszukiwanie zasobów nie będzie przechodzić przez zakres do katalogu głównego lub aplikacji, jeśli nie znaleziono prawidłowego obiektu na żądanym kluczu. Jednak takie podejście może mieć zalety wydajności w niektórych przypadkach, ponieważ zakres wyszukiwania klucza jest bardziej ograniczony. Zobacz klasę, ResourceDictionary aby uzyskać więcej informacji na temat sposobu bezpośredniej pracy ze słownikiem zasobów.

Tworzenie zasobów za pomocą kodu

Jeśli chcesz utworzyć całą aplikację WPF w kodzie, możesz również utworzyć wszystkie zasoby w tej aplikacji w kodzie. Aby to osiągnąć, utwórz nowe ResourceDictionary wystąpienie, a następnie dodaj wszystkie zasoby do słownika przy użyciu kolejnych wywołań do ResourceDictionary.Add. Następnie użyj utworzonego elementu ResourceDictionary , aby ustawić Resources właściwość na elemecie, który znajduje się w zakresie strony lub Application.Resources. Można również zachować ResourceDictionary obiekt jako obiekt autonomiczny bez dodawania go do elementu. Jeśli jednak to zrobisz, musisz uzyskać dostęp do zasobów w nim według klucza elementu, tak jakby był to słownik ogólny. Element ResourceDictionary , który nie jest dołączony do właściwości elementu Resources , nie istnieje w ramach drzewa elementów i nie ma zakresu w sekwencji odnośników, która może być używana przez FindResource metody i powiązane.

Używanie obiektów jako kluczy

Większość użycia zasobów ustawi klucz zasobu na ciąg. Jednak różne funkcje WPF celowo nie używają typu ciągu do określania kluczy, zamiast tego ten parametr jest obiektem. Możliwość klucza zasobu przez obiekt jest używana przez styl WPF i obsługę motywów. Style w motywach, które stają się domyślnym stylem dla kontrolki innej niż styl, są kluczami Type kontrolki, do której należy zastosować. Kluczowanie według typu zapewnia niezawodny mechanizm wyszukiwania, który działa na domyślnych wystąpieniach każdego typu kontrolki, a typ może być wykrywany przez odbicie i używany do stylów klas pochodnych, mimo że typ pochodny w przeciwnym razie nie ma domyślnego stylu. Klucz zasobu zdefiniowanego w języku XAML można określić Type przy użyciu rozszerzenia x:Type Markup. Podobne rozszerzenia istnieją dla innych nieciągnięć użycia kluczy, które obsługują funkcje WPF, takie jak ComponentResourceKey Markup Extension.

Zobacz też