Używanie i aktualizowanie zasobów dynamicznych

Ukończone

W poprzedniej lekcji zdefiniowano zasób w języku Extensible Application Markup Language (XAML) i użyto go jako wartości statycznej. Jednak w niektórych przypadkach usługa StaticResource nie jest odpowiednia. Rozważ następujące scenariusze:

  • Załóżmy, że chcesz zaimplementować motywy kolorów, które umożliwiają użytkownikowi zmianę wyglądu aplikacji w czasie wykonywania. Rozszerzenie znaczników StaticResource wykonuje wyszukiwanie w słowniku tylko raz, więc nie może dynamicznie aktualizować interfejsu użytkownika.

  • Preferencje użytkownika są przechowywane na serwerze internetowym i ładują je po uruchomieniu aplikacji. Rozszerzenie znaczników StaticResource zgłasza wyjątek, jeśli klucz nie zostanie znaleziony w słowniku.

W tej lekcji pokazano, jak rozwiązywać problemy, takie jak te przy użyciu zasobów dynamicznych.

Jak aktualizować zasoby w czasie wykonywania

Zasoby są przechowywane w słowniku zasobów. Możesz napisać kod, aby zaktualizować te zasoby w czasie wykonywania. Możesz nawet dodać nowe zasoby lub usunąć istniejące zasoby.

Rozważmy następujący przykład:

<ContentPage.Resources>
    <Color x:Key="PanelBackgroundColor">Blue</Color>
</ContentPage.Resources>

Załóżmy, że chcesz zmienić wartość zasobu PanelBackgroundColor podczas działania aplikacji. Aby uzyskać dostęp do właściwości Resources , możesz dodać kod do pliku za pomocą kodu dla strony. Poniższy przykład aktualizuje wartość zasobu z poprzedniego przykładu XAML na inny kolor.

this.Resources["PanelBackgroundColor"] = Colors.Green;

Co to jest DynamicResource?

DynamicResource to kolejne rozszerzenie znaczników do wyszukiwania zasobów w słowniku zasobów. Jest on podobny do staticResource w tym, że wykonuje wyszukiwanie słownika podczas tworzenia obiektu docelowego. Jednak nasłuchuje również zmian w zasobie w słowniku. Jeśli wartość zasobu w słowniku ulegnie zmianie, usługa DynamicResource automatycznie aktualizuje interfejs użytkownika.

DynamicResource ma przewagę nad staticResource. Jeśli parametr DynamicResource nie może znaleźć klucza w słowniku, właściwość nie zostanie ustawiona. W przeciwieństwie do elementu StaticResource brak klucza nie jest błędem i nie zgłasza wyjątku.

Uwaga

Charakter rozszerzenia dynamicResource mark-up nakłada niewielką karę za wydajność aplikacji. Mimo że możesz użyć elementu DynamicResource zamiast staticResource na stronach XAML, jeśli zasób nie ulegnie zmianie, należy odwołać się do niego z rozszerzeniem znaczników StaticResource.

Aby użyć zaktualizowanego koloru tła z wcześniejszego przykładu, możesz zastosować element DynamicResource w kodzie XAML w następujący sposób:

<ContentPage ...>
    <ContentPage.Resources>
        <Color x:Key="PanelBackgroundColor">Blue</Color>
    </ContentPage.Resources>

    <StackLayout BackgroundColor="{DynamicResource PanelBackgroundColor}">
    ...
    </StackLayout>
</ContentPage>

Jeśli wartość zasobu PanelBackgroundColor zmieni się, wartość BackgroundColor kontrolki StackLayout zostanie zaktualizowana automatycznie.

Test wiedzy

1.

Jaka funkcja zapewnia DynamicResource , że StaticResource element nie jest?