Udostępnij za pośrednictwem


Zasoby w kodzie (WPF .NET)

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 składni XAML. Aby uzyskać więcej informacji na temat ogólnego użycia zasobów i zasobów z perspektywy składni XAML, zobacz Omówienie zasobów XAML.

Uzyskiwanie dostępu do zasobów z kodu

Klucze identyfikujące zasoby zdefiniowane przez język 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. 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 przechodzi przez 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 tych zasobach, które wystąpiły podczas wykonywania.

Poniższy przykład kodu przedstawia procedurę Click obsługi zdarzeń, która znajduje zasób według klucza i używa zwróconej wartości do ustawienia właściwości.

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

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 jest obecna 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. Słowniki zasobów służą do dodawania nowych zasobów do istniejących kolekcji, sprawdzania, czy dana nazwa klucza jest już używana przez kolekcję i inne operacje. Jeśli piszesz aplikację WPF w całości w kodzie, możesz również utworzyć całą kolekcję w kodzie, przypisać do niej zasoby. Kolekcję można następnie przypisać do Resources właściwości elementu. Jest to opisane w następnej sekcji.

Indeksować można w dowolnej Resources kolekcji przy użyciu określonego klucza jako indeksu. Zasoby dostępne w ten sposób nie są zgodne z normalnymi regułami środowiska uruchomieniowego rozpoznawania zasobów. Uzyskujesz dostęp tylko do tej konkretnej kolekcji. Wyszukiwanie zasobów nie przechodzi przez zakres zasobów 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. Aby uzyskać więcej informacji na temat sposobu bezpośredniej pracy ze słownikiem zasobów, zobacz klasę ResourceDictionary .

Tworzenie zasobów przy użyciu 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 przypisz utworzony ResourceDictionary element, aby ustawić Resources właściwość elementu, 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. Obiekt 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 używają typu obiektu jako klucza zamiast ciągu. Możliwość klucza zasobu przez typ obiektu jest używana przez styl WPF i obsługę motywów. Style i motywy, które stają się wartością domyślną dla kontrolki innej niż styl, są kluczami Type kontrolki, do której mają być stosowane.

Kluczowanie według typu zapewnia niezawodny mechanizm wyszukiwania, który działa w przypadku domyślnych wystąpień każdego typu kontrolki. Typ można wykryć za pomocą odbicia i użyć 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.

Aby uzyskać więcej informacji, zobacz Style, DataTemplates i niejawne klucze.

Zobacz też