Pokazywanie postów oznaczonych etykietą resources. Pokaż wszystkie posty
Pokazywanie postów oznaczonych etykietą resources. Pokaż wszystkie posty

czwartek, 23 sierpnia 2012

[WPF] Logical Resources

Zasobem logicznym może być np. kolor, brush czy czcionka. Mamy do dyspozycji dwa rodzaje zasobów logicznych.

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"];
        }

poniedziałek, 20 sierpnia 2012

[WPF] Resources

Resourcem można nazwać wszystko, co nie zawiera kodu, przeważnie obrazy, pliki muzyczne czy filmy. Zasobami można zarządzać na kilka sposobów w WPFie. Pierwszy sposób to binary resources. Mogą być one przechowywane na kilka sposobów: wbudowane w assembly, luźne pliki znane aplikacji w momencie kompilacji lub luźnie pliki, które nie muszą być znane aplikacji w momencie kompilacji. Rodzaj zasobu definiujemy w Visual Studio we właściwościach pliku przez Build Action.


Wybierając Resource lub Content decydujemy się na zasób binarny. Build Action ustawione na Resource spowoduje, że plik zostanie wbudowany w assembly. W przypadku gdy wybierzemy Content, plik pozostanie poza assembly, ale w metadanych zostanie ustawiony atrybut AssemblyAssociatedContentFile, który rejestruje, czy plik istnieje. W przypadku opcji Content, zachodzi już konieczność ustawienie Copy to Output Directory. Dzięki temu, podobnie jak dla Build Action - Resource można w xaml podawać ścieżkę do pliku w wygodnej postaci , np . :

<Image Source="resource_image.png" HorizontalAlignment="Left" />
<Image Source="content_image.png" HorizontalAlignment="Right" />

Co ciekawe nie możemy się odwoływać ze skompilowanego xaml do plików, które nie są dołączone do projektu, nawet jeśli są w tym samym folderze.

W przypadku takich plików, można podać pełną ścieżkę do pliku, lub odwołać się do niego przez site of origin.

<Image Source="E:\Projects\Wpf\Resources\loose_file.png"/>
<Image Source="pack://siteOfOrigin:,,,/star.png" />

Można także odwoływać się do zasobów zaszytych w innych dll, za pomocą następującej składni :
AssemblyReference;Component/ResourceName, np. MyAssembly.dll;MyProject/image1.png.

Czasami zachodzi także potrzeba ustawienia zasobu z poziomu kodu. Ścieżkę podaje się "opakowaną" w klasę Uri. Np.


image1.Source = new BitmapImage(new Uri("pack://siteOfOrigin:,,,/star.png"));