Udostępnij za pośrednictwem


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

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.

Tworzenie scalonego słownika

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>

Element ResourceDictionary 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. Ponadto wprowadzenie ResourceDictionary scalonego słownika 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

Zgodnie z prawem można zdefiniować zasoby w obrębie ResourceDictionary określonego jako scalony słownik, albo jako alternatywę dla określenia Sourceelementu lub oprócz zasobów uwzględnionych w określonym źródle. Jednak nie jest to typowy scenariusz. Głównym scenariuszem scalanych słowników jest scalanie zasobów z lokalizacji plików zewnętrznych. Jeśli chcesz określić zasoby w znacznikach dla strony, zdefiniuj je 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 tuż po scaleniu 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, zasób zwrócony 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 MergedDictionariespliku . 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 istniejącego ResourceDictionary strumienia plików XAML, który ma ResourceDictionary katalog główny, a następnie rzutowanie wartości zwracanej na ResourceDictionary.XamlReader.Load

Scalone identyfikatory URI słownika

Istnieje kilka technik dołączania scalonego słownika zasobów, który jest wskazywany przez używany format identyfikatora URI( uniform resource identifier). 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 strefę zabezpieczeń Internetu.

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 to, jak to zrobić, zależy od strategii wdrażania aplikacji i modelu aplikacji, który należy wykonać. Wcześniej 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: .

Pisanie scalonych słowników jako plików aplikacji lokalnych lub lokalnego magazynu udostępnionego jest innym możliwym scenariuszem scalania słownika i 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ż