Połączone słowniki zasobów
Zasoby programu Windows Presentation Foundation (WPF) obsługują funkcję scalonego słownika zasobów. Ta funkcja umożliwia zdefiniowanie części zasobów aplikacji WPF poza skompilowanym aplikacją XAML. Zasoby mogą być następnie współużytkowane w aplikacjach i są również wygodniej izolowane pod kątem lokalizacji.
Wprowadzenie do scalonego słownika zasobów
W adiustacji użyj następującej składni, aby wprowadzić scalony słownik zasobów do strony:
<Page.Resources>
<ResourceDictionary>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="myresourcedictionary.xaml"/>
<ResourceDictionary Source="myresourcedictionary2.xaml"/>
</ResourceDictionary.MergedDictionaries>
</ResourceDictionary>
</Page.Resources>
Należy pamiętać, że ResourceDictionary element nie ma dyrektywy x:Key, która jest zwykle wymagana dla wszystkich elementów w kolekcji zasobów. Jednak inne ResourceDictionary odwołanie w MergedDictionaries kolekcji jest specjalnym przypadkiem zarezerwowanym dla tego scalonego scenariusza słownika zasobów. Element ResourceDictionary wprowadzający scalony słownik zasobów nie może mieć dyrektywy x:Key. Zazwyczaj każdy ResourceDictionary element w MergedDictionaries kolekcji określa Source atrybut. Wartość Source powinna być jednolitym identyfikatorem zasobu (URI), który rozpoznaje lokalizację pliku zasobów do scalenia. Miejsce docelowe tego identyfikatora URI musi być innym plikiem XAML ze ResourceDictionary swoim elementem głównym.
Uwaga
Jest to legalne definiowanie zasobów w obrębie ResourceDictionary określonego jako scalony słownik, albo jako alternatywa dla określenia Source, lub oprócz jakichkolwiek zasobów zawartych w określonym źródle. Jednak nie jest to typowy scenariusz; Głównym scenariuszem scalonych słowników jest scalanie zasobów z lokalizacji plików zewnętrznych. Jeśli chcesz określić zasoby w znacznikach dla strony, zazwyczaj należy je zdefiniować w głównym ResourceDictionary , a nie w scalonych słownikach.
Zachowanie scalonego słownika
Zasoby w słowniku scalanym zajmują lokalizację w zakresie wyszukiwania zasobów, który znajduje się tuż po scaleniu zakresu głównego słownika zasobów. Mimo że klucz zasobu musi być unikatowy w dowolnym słowniku, klucz może istnieć wiele razy w zestawie scalonych słowników. W takim przypadku zwrócony zasób pochodzi z ostatniego słownika znalezionego sekwencyjnie w kolekcji MergedDictionaries . MergedDictionaries Jeśli kolekcja została zdefiniowana w języku XAML, kolejność scalonych słowników w kolekcji jest kolejnością elementów podanych w adiustacji. Jeśli klucz jest zdefiniowany w słowniku podstawowym, a także w słowniku, który został scalony, zwracany zasób będzie pochodzić ze słownika podstawowego. Te reguły określania zakresu mają jednakowe zastosowanie zarówno w przypadku odwołań do zasobów statycznych, jak i odwołań do zasobów dynamicznych.
Scalone słowniki i kod
Scalane słowniki można dodać do słownika Resources
za pomocą kodu. Wartość domyślna, początkowo pusta ResourceDictionary , która istnieje dla dowolnej Resources
właściwości, ma również domyślną, początkowo pustą MergedDictionaries właściwość kolekcji. Aby dodać scalony słownik za pomocą kodu, należy uzyskać odwołanie do żądanego podstawowego ResourceDictionaryelementu , uzyskać jego MergedDictionaries wartość właściwości i wywołać Add
metodę ogólną Collection
zawartą w MergedDictionarieselemencie . Dodany obiekt musi być nowym ResourceDictionaryobiektem . W kodzie nie ustawiasz Source właściwości . Zamiast tego należy uzyskać ResourceDictionary obiekt, tworząc jeden lub ładując go. Jednym ze sposobów załadowania istniejącego do wywołania XamlReader.Load istniejącego ResourceDictionary strumienia plików XAML, który ma ResourceDictionary katalog główny, a następnie rzutowanie wartości zwracanej XamlReader.Load na ResourceDictionary.
Scalone identyfikatory URI słownika zasobów
Istnieje kilka technik dołączania scalonego słownika zasobów, które są wskazywane przez format identyfikatora URI (uniform resource identifier), który będzie używany. Ogólnie rzecz biorąc, te techniki można podzielić na dwie kategorie: zasoby kompilowane w ramach projektu i zasoby, które nie są kompilowane w ramach projektu.
W przypadku zasobów skompilowanych w ramach projektu można użyć ścieżki względnej, która odwołuje się do lokalizacji zasobu. Ścieżka względna jest oceniana podczas kompilacji. Zasób musi być zdefiniowany jako część projektu jako akcja kompilacji zasobu. Jeśli w projekcie dołączysz plik xaml zasobu jako zasób, nie musisz kopiować pliku zasobu do katalogu wyjściowego, zasób jest już uwzględniony w skompilowanej aplikacji. Możesz również użyć akcji Kompilacja zawartości, ale musisz skopiować pliki do katalogu wyjściowego, a także wdrożyć pliki zasobów w tej samej relacji ścieżki do pliku wykonywalnego.
Uwaga
Nie używaj akcji kompilacji Zasób osadzony. Sama akcja kompilacji jest obsługiwana w przypadku aplikacji WPF, ale rozdzielczość Source nie obejmuje ResourceManagerelementu , a tym samym nie może oddzielić pojedynczego zasobu od strumienia. Możesz nadal używać zasobu osadzonego do innych celów, o ile również użyto ResourceManager dostępu do zasobów.
Powiązaną techniką jest użycie identyfikatora URI pakietu do pliku XAML i odwoływanie się do niego jako źródło. Identyfikator URI pakietu umożliwia odwoływanie się do składników zestawów, do których odwołują się odwołania i inne techniki. Aby uzyskać więcej informacji na temat identyfikatorów URI pakietów, zobacz Zasoby aplikacji WPF, Zawartość i Pliki danych.
W przypadku zasobów, które nie są kompilowane w ramach projektu, identyfikator URI jest obliczany w czasie wykonywania. Do odwoływania się do pliku zasobu można użyć typowego transportu identyfikatora URI, takiego jak plik: lub http. Wadą korzystania z niekompilowanego podejścia do zasobów jest to, że plik: dostęp wymaga dodatkowych kroków wdrażania, a http: dostęp oznacza internetową strefę zabezpieczeń.
Ponowne łączenie słowników
Można ponownie użyć lub udostępnić scalone słowniki zasobów między aplikacjami, ponieważ słownik zasobów do scalania można odwoływać się za pomocą dowolnego prawidłowego identyfikatora URI (Uniform Resource Identifier). Dokładnie tak, jak to zrobisz, będzie zależeć od strategii wdrażania aplikacji i modelu aplikacji, który należy wykonać. Wyżej wymieniona strategia identyfikatora URI pakietu umożliwia często źródło scalonego zasobu w wielu projektach podczas programowania przez udostępnienie odwołania do zestawu. W tym scenariuszu zasoby są nadal dystrybuowane przez klienta, a co najmniej jedna z aplikacji musi wdrożyć zestaw, do którego się odwołuje. Istnieje również możliwość odwołowania się do scalonych zasobów za pośrednictwem rozproszonego identyfikatora URI korzystającego z protokołu HTTP.
Zapisywanie scalonych słowników jako plików aplikacji lokalnych lub lokalnego magazynu udostępnionego jest innym możliwym scenariuszem scalania słownika/wdrażania aplikacji.
Lokalizacja
Jeśli zasoby, które muszą być zlokalizowane, są izolowane do słowników, które są scalane z słownikami podstawowymi i przechowywane jako luźne XAML, te pliki mogą być zlokalizowane oddzielnie. Ta technika jest uproszczoną alternatywą dla lokalizowania zestawów zasobów satelitarnych. Aby uzyskać szczegółowe informacje, zobacz Omówienie globalizacji i lokalizacji WPF.
Zobacz też
.NET Desktop feedback