poniedziałek, 8 listopada 2010

Zasobby (Resources)

Zasoby umożliwiają zapisanie informacji o użytych pędzlach, stylach i późniejsze wykorzystanie ich.
Zalety zasobów to min.:
- zwiększenie wydajności poprzez zapamiętanie często używanych styli, kolorów itp.
- reużywalność - nadając styl np. przyciskom zmiana w jednym miejscu powoduje zmianę we wszystkich korzystających z danego zasobu
- łatwa wymiana na nowe (np. wykorzystanie w systemie skinów)

Wszystko, co jest związane z zasobami przechowywane jest w kolekcji Resources (instancja klasy ResourceDictionary). Elementy tej kolekcji indexowane są poprzez ciągi znaków (string).
Zasoby przechowywane są najczęściej na poziomie okna lub też całej aplikacji. Dlaczego na poziomie okna? Gdyż każdy element ma dostęp do własnych zasobów jak i rodzica.
<Window x:Class="WpfApplication3.MainWindow"
       xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
       xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
       Title="MainWindow" Height="350" Width="525">
    <Window.Resources>
        <LinearGradientBrush x:Key="MyColor">
            <GradientStopCollection>
                <GradientStop Color="Blue" Offset="0.5" />
                <GradientStop Color="Orange" Offset="1.0" />
            </GradientStopCollection>
        </LinearGradientBrush>
    </Window.Resources>
    <Grid>
        <Rectangle Width="100" Height="100" Fill="{StaticResource ResourceKey=MyColor}" />
    </Grid>
</Window>


Pozwala to na uzyskanie następującego kwadratu:

W tym przypadku stosujemy statyczne zasoby - czyli takie, które raz przypiszemy i nie będziemy ich zmieniać podczas działania naszego programu. Oczywiście istnieją także dynamiczne zasoby, które można zmieniać podczas działania programu - ale o nich trochę później.

Hierarchia zasobów
Jak już wiemy, zasoby można umieszczać zarówno na poziomie aplikacji, okien jak i pojedyńczych elementów (np. przycisku). Ważne jest zdanie sobie sprawy z tego, że dany zasób szukany jest najpierw lokalnie a następnie u coraz to wyższego rodzica. Tak więc możliwe jest zdefiniowanie dwóch zasobów o takiej samej nazwie w zasięgu przycisku jak i okna. Ważne z drugiej strony jest to, że nie można nadać tej samej nazwy dwóm zasobom na tym samym poziomie.

Statyczne i dynamiczne zasoby
Jak już wiemy z wcześniejszego wywodu, statyczne zasoby przypisujemy raz podczas startu aplikacji a dynamiczne kiedy chcemy. Oczywiście może na pierwszy rzut oka wydać się, że stosowanie dynamicznych zasobów daje o wiele większe możliwości. Jest to prawda jednak stosowanie ich pociąga za sobą spadek wydajności naszej aplikacji. Dlatego też stosowanie dynamicznych zasobów powinno być w pełni odpowiedzialną decyzją

Słowniki zasobów
Słowniki pozwalają na łatwie zapisywanie często używanych zasobów i korzystanie z nich w aktualnej jak i przyszłych aplikacjach. Tworzenie ich jest niezwykłe proste:
Klikamy prawym przyciskiem myszy i wybieramy Add->Resource Dictionary...
Po dodaniu nowego słownika warto sprawdzić czy dodany plik XAML kompilowany jest w trybie Page:

Jest to ważne ze względów wydajnościowych.
Aby korzystać z tak stworzonych słowników, należy je połączyć z słownikami na poziomie aplikacji czy też okna:
    <Window.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <ResourceDictionary Source="Dictionary1.xaml" />
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Window.Resources>

Jak widać korzystanie z zasobów jak i słowników zasobów może bardzo ułatwić nam życie. W przedstawionym, bardzo prostym przykładzie użycie słownika wydaje się zbędne. Jednak warto o nim pomyśleć przy tworzeniu bardziej zaawansowanych styli jak i szablonów kontrolek.

Brak komentarzy:

Prześlij komentarz