Tworzenie i używanie zasobów obejmujących całą aplikację
Definiowanie zasobów i stylów na stronie extensible Application Markup Language (XAML) to doskonały sposób na zmniejszenie powtarzającego się kodu. Jest jednak problem. Te zasoby i style są dostępne tylko na tej konkretnej stronie XAML. Słowniki zasobów na poziomie strony nie są wystarczające, aby uniknąć powtarzającego się kodu w aplikacji, gdy masz wiele stron. W tej lekcji zobaczysz, jak udostępniać zasoby i style na wszystkich stronach w aplikacji interfejsu użytkownika aplikacji wieloplatformowej (MAUI) platformy .NET.
Gdzie są dostępne słowniki zasobów
Klasa VisualElement definiuje właściwość Resources . Kontrolki, strony i układy dziedziczą z elementu VisualElement, dzięki czemu mają właściwość Resources , która może przechowywać słownik zasobów.
Klasa Application definiuje również właściwość Resources . Aplikacja nie dziedziczy z elementu VisualElement, więc właściwość jest definiowana jako część tej klasy.
Poniższa ilustracja przedstawia strukturę typowej aplikacji. Każdy z wyświetlonych elementów ma właściwość Resources , która może przechowywać słownik zasobów.
Uwaga
Ten diagram przedstawia znacznie uproszczony opis sposobu organizowania elementów w aplikacji. Na tym diagramie termin Widok odnosi się do pojedynczej kontrolki, takiej jak Przycisk lub Etykieta, która nie pełni funkcji kontenera dla żadnych podrzędnych elementów sterujących. Termin Układ oznacza również kontener, który odpowiada za organizowanie układu jego podrzędnych kontrolek. Układ można zagnieżdżać. Na przykład kontrolka Siatka może być przechowywana w kontrolce StackLayout.
Jak zdefiniować zasoby i style na poziomie aplikacji
Zasoby i style na poziomie aplikacji definiuje się w pliku XAML skojarzonym z klasą Aplikacji . Poniższy kod pokazuje, jak zadeklarować zasób Color w słowniku zasobów aplikacji.
<Application.Resources>
<Color x:Key="MyTextColor">Blue</Color>
</Application.Resources>
Jak program MAUI platformy .NET lokalizuje zasób lub styl
Załóżmy, że stosujesz zasób do jednej z kontrolek, jak pokazano w poniższym kodzie.
<Label TextColor="{StaticResource MyTextColor}" ... />
Program .NET MAUI musi zlokalizować definicję tego zasobu, aby można było zastosować tę wartość. Jedna aplikacja może mieć wiele słowników. Które słowniki będą przeszukiwać program .NET MAUI i w jakiej kolejności? Aby odpowiedzieć na te pytania, warto myśleć o wystąpieniach elementu VisualElement na stronach jako tworzących strukturę przypominającą drzewo. Aplikacja znajduje się w katalogu głównym, a poniżej rozłożone są strony, układy i widoki. Ta struktura jest często nazywana drzewem wizualnym. Każdy element w drzewie może mieć własny słownik, który może zawierać zasoby. Algorytm wyszukiwania stylów w programie .NET MAUI przechodzi w górę drzewa wizualnego.
Rozpocznij wyszukiwanie ze słownikiem w wystąpieniu elementu VisualElement , do którego jest stosowany zasób. W poprzednim przykładzie wyszukiwanie rozpoczyna się od typu Etykieta. Jeśli nie ma słownika zasobów lub jeśli istnieje słownik, ale zasób nie istnieje, wtedy wyszukiwanie przejdzie do następnego etapu.
Przejdź do nadrzędnego elementu sterującego i powtórz wyszukiwanie. Zazwyczaj następnym miejscem do poszukiwania jest plan.
Sprawdź element nadrzędny układu. Zazwyczaj następnym miejscem do przeszukania jest strona, chociaż jeśli układ jest zagnieżdżony wewnątrz innego układu (takiego jak Grid w StackLayout), przeszukiwanie przesunie się w górę drzewa do układu nadrzędnego.
Wyszukaj klasę Application w słowniku.
Wyszukiwanie zwraca pierwszy element znaleziony z pasującą wartością x:Key . Na poniższej ilustracji przedstawiono podsumowanie sekwencji wyszukiwania zasobów.
W praktyce większość deweloperów ignoruje właściwość Resources w widokach i układach. Używają słowników na poziomie strony dla elementów używanych na jednej stronie. Zasoby i style, które chcą udostępniać na wielu stronach, są definiowane na poziomie aplikacji. Następnie proces wyszukiwania musi sprawdzić tylko dwa słowniki: jeden w bieżącym wystąpieniu strony i jeden w aplikacji.
Uwaga
Jeśli zasób z określonym kluczem nie zostanie znaleziony, aplikacja używa wartości domyślnych dla stylu.
Zduplikowane klucze
Każde wystąpienie usługi ResourceDictionary jest niezależne, co oznacza, że ta sama wartość x:Key może być używana w więcej niż jednym słowniku. Posiadanie tego samego identyfikatora x:Key w wielu słownikach w ścieżce wyszukiwania nie powoduje błędu. Zasób skojarzony z pierwszą pasującą wartością x:Key na ścieżce jest tym, który jest używany.
Załóżmy na przykład, że w klasie Application zdefiniowano następujący zasób:
<Application.Resources>
<x:String x:Key="msg">Two</x:String>
</Application.Resources>
Następnie zdefiniujesz następujący zasób w witrynie ContentPage i zastosujesz go do etykiety na tej samej stronie:
<ContentPage.Resources>
<x:String x:Key="msg">One</x:String>
</ContentPage.Resources>
...
<Label Text="{StaticResource msg}">
Ponieważ jest używana pierwsza zgodna wartość x:Key , właściwość Text jest ustawiona na jedną.