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"));

Brak komentarzy:

Prześlij komentarz