Scalone słowniki zasobów (WPF .NET)

Windows Presentation Foundation (WPF) obsługują funkcję scalonego słownika zasobów. Ta funkcja umożliwia definiowanie części zasobów aplikacji WPF poza skompilowaną aplikacją XAML. Następnie zasoby mogą być współużytkowane przez aplikacje i są wygodniejsze do lokalizacji.

Ważne

Dokumentacja przewodników klasycznych dla platform .NET 6 i .NET 5 (w tym .NET Core 3.1) jest w trakcie budowy.

Tworzenie scalonego słownika

W znacznikach 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>

Element ResourceDictionary nie ma dyrektywy x:Key, która jest zwykle wymagana dla wszystkich elementów w kolekcji zasobów. Jednak innym ResourceDictionary odwołaniem w kolekcji MergedDictionaries jest specjalny przypadek zarezerwowany dla tego scalonego scenariusza słownika zasobów. Ponadto element , ResourceDictionary który wprowadza scalony słownik zasobów, nie może mieć dyrektywy x:Key.

Zazwyczaj każdy w ResourceDictionary kolekcji MergedDictionaries określa atrybut Source . Wartość powinna być Source identyfikatorem URI, który jest rozpoznawczy jako lokalizacja pliku zasobów do scalenia. Miejsce docelowe tego URI musi być innym plikiem XAML z elementem ResourceDictionary głównym.

Uwaga

Definiowanie ResourceDictionary zasobów w ramach określonego słownika jako scalonego jest legalne, Sourcejako alternatywa dla określenia , lub oprócz zasobów uwzględnionych z określonego źródła. Nie jest to jednak powszechny scenariusz. Głównym scenariuszem scalonych słowników jest scalanie zasobów z zewnętrznych lokalizacji plików. Jeśli chcesz określić zasoby w znacznikach dla strony, zdefiniuj je w słowniku głównym ResourceDictionary , a nie w scalonych słownikach.

Zachowanie scalonego słownika

Zasoby w scalanych słownikach 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 obrębie dowolnego słownika, klucz może istnieć wiele razy w zestawie scalonych słowników. W tym przypadku zwrócony zasób będzie pochodził z ostatniego słownika znalezionego sekwencyjnie w kolekcji MergedDictionaries . Jeśli kolekcja MergedDictionaries została zdefiniowana w języku XAML, kolejność scalonych słowników w kolekcji jest kolejnością elementów określoną w znacznikach. Jeśli klucz jest zdefiniowany w słowniku podstawowym, a także w słowniku, który został scalony, zwrócony zasób będzie pochodzić ze słownika podstawowego. Te reguły zakresu są stosowane w równym stopniu zarówno w przypadku odwołań do zasobów statycznych, jak i odwołań do zasobów dynamicznych.

Scalone słowniki i kod

Scalone słowniki można dodawać 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ą właściwość MergedDictionaries kolekcji. Aby dodać scalony słownik za pomocą kodu, ResourceDictionarynależy uzyskać odwołanie do żądanego obiektu podstawowego, CollectionMergedDictionariesAdd pobrać jego wartość właściwości i wywołać obiekt ogólny, który znajduje się w obiekcie .MergedDictionaries Obiekt, który dodajesz, musi być nowym obiektem ResourceDictionary.

W kodzie nie ustawiasz właściwości Source . Zamiast tego należy uzyskać obiekt ResourceDictionary , tworząc jeden obiekt lub ładuj go. Jednym ze sposobów załadowania istniejącego elementu ResourceDictionary w celu wywołania w XamlReader.Load istniejącym strumieniu plików XAML z katalogiem głównym, a ResourceDictionary następnie rzutowanie wartości zwracanej na .ResourceDictionary

Scalone URI słownika

Istnieje kilka technik dołączania scalonego słownika zasobów, które są wskazywane przez używany format identyfikatora URI. Ogólnie rzecz biorąc, techniki te można podzielić na dwie kategorie: zasoby, które są kompilowane w ramach projektu, i zasoby, które nie są kompilowane w ramach projektu.

W przypadku zasobów, które są kompilowane 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 Kompilacja zasobu. Jeśli uwzględnisz plik xaml zasobu w projekcie jako zasób, nie musisz kopiować pliku zasobów 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 następnie skopiować pliki do katalogu wyjściowego i wdrożyć pliki zasobów w tej samej relacji ścieżki do pliku wykonywalnego.

Uwaga

Nie używaj akcji kompilacji zasobu osadzonego. Sama akcja kompilacji jest obsługiwana w przypadku aplikacji WPF, SourceResourceManagerale rozdzielczość nie obejmuje , dlatego nie może oddzielić poszczególnych zasobów od strumienia. Nadal można używać zasobu osadzonego do innych celów, o ile został on również ResourceManager użyty do uzyskania dostępu do zasobów.

Powiązaną techniką jest użycie URI pakietu do pliku XAML i nazwanie go źródłem. Dzięki uri pakietu można odwoływać się do składników zestawów, do których się odwoływuje, i innych technik. Aby uzyskać więcej informacji na temat URI pakietu, zobacz WPF Application Resource, Content, and Data Files (Zasób aplikacji WPF, zawartość i pliki danych).

W przypadku zasobów, które nie zostały skompilowane w ramach projektu, wartość URI jest oceniana w czasie uruchamiania. Aby odwołać się do pliku zasobów, można użyć typowego transportu za pomocą adresu URI, takiego jak plik : lub http : . Wadą korzystania z nieskompilowanego podejścia do zasobów jest plik : dostęp wymaga dodatkowych kroków wdrażania, a protokół HTTP: dostęp implikuje internetową strefę zabezpieczeń.

Ponowne 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 scalenia może być przywołyny za pomocą dowolnego prawidłowego identyfikatora URI. Dokładnie to, jak to zrobisz, zależy od strategii wdrażania aplikacji i modelu aplikacji, który należy stosować. Wcześniej wymieniona strategia URI pakietu umożliwia często źródło scalonego zasobu w wielu projektach podczas opracowywania przez udostępnienie odwołania do zestawu. W tym scenariuszu zasoby są nadal dystrybuowane przez klienta i co najmniej jedna z aplikacji musi wdrożyć przywoływane zestawy. Można również odwoływać się do scalonych zasobów za pośrednictwem rozproszonego adresu URI, który używa protokołu http: .

Innym możliwym scenariuszem scalania słowników i wdrażania aplikacji jest pisanie scalonych słowników jako lokalnych plików aplikacji lub w lokalnym magazynie udostępnionym.

Lokalizacja

Jeśli zasoby, które muszą być zlokalizowane, są izolowane do słowników scalanych z podstawowymi słownikami i przechowywane jako luźny kod XAML, te pliki mogą być zlokalizowane oddzielnie. Ta technika jest lekką alternatywą dla lokalizacji zestawów zasobów sateliskich. Aby uzyskać szczegółowe informacje, zobacz WPF Globalization and Localization Overview (Globalizacja i lokalizacja WPF — omówienie).

Zobacz też