StaticResource -statyczne, ładowane w momencie uruchamiania aplikacji, nie podlegają zmianom w czasie trwania aplikacji, ale też nie wymagają dodatkowych zasobów do śledzenia zmian.
DynamicResource - mogą być zmieniane wielokrotnie w czasie trwania aplikacji, ładowane są dopiero w momencie, kiedy zachodzi taka potrzeba, np. przy wejściu do danej strony.
Na poziomie okna zasoby definiowane są w następujący sposób :
<Window.Resources> <SolidColorBrush x:Key="myBrush" Color="Azure" /> </Window.Resources>
Mogą być także definiowane na innych poziomach, np. w pliku App.xaml jako zasoby globalne dla całej aplikacji.
<Application.Resources> <ResourceDictionary> <SolidColorBrush x:Key="globalBrush" Color="DarkOliveGreen" /> </ResourceDictionary> </Application.Resources>
Do zasobów odwołujemy się w następujący sposób:
<Rectangle Fill="{StaticResource myBrush}" Name="rectangle1" Stroke="Black" VerticalAlignment="Top" Width="491" /> <Rectangle Fill="{DynamicResource globalBrush}" Name="rectangle2" Stroke="Black" VerticalAlignment="Top" Width="491" />
Istnieje możliwość używania tych samych kluczy na różnych poziomach. Podczas wczytywania zasobu, przeszukiwane jest drzewo wizualne, od najbardziej lokalnego poziomu. Jeśli zostanie znaleziony zasób na poziomie okna, to jest on ładowany, jeśli nie, to sprawdzany jest poziom aplikacji, później zasoby systemowe, a gdy również tam nie zostanie nic znalezione, rzucany jest wyjątek.
Warto także pamiętać o tym, że domyślnie, gdy zdefiniujemy zasób i odwołamy się do niego w wielu miejscach, to używana jest jedna instancja. Możemy wymusić tworzenie nowego zasobu poprzez ustawiania atrybutu x:Shared=”False”.
Zasoby można także definiować oraz przydzielać z poziomu Code Behind.
private void rectangle2_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { Resources.Add("addedResource", new SolidColorBrush(Colors.Khaki)); App.Current.Resources.Add("newResource", new SolidColorBrush(Colors.Honeydew)); } private void rectangle1_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) { ((Rectangle)sender).Fill = (SolidColorBrush)Resources["addedResource"]; ((Rectangle)sender).Stroke = (SolidColorBrush)App.Current.Resources["newResource"]; }
Brak komentarzy:
Prześlij komentarz