ResourceDictionary w osobnym zestawie

245

Mam pliki słownika zasobów (MenuTemplate.xaml, ButtonTemplate.xaml itp.), Których chcę używać w wielu różnych aplikacjach. Mógłbym dodać je do zestawów aplikacji, ale lepiej jest, jeśli skompiluję te zasoby w jednym zestawie, a moje aplikacje odniosą się do niego, prawda?

Po zbudowaniu zestawu zasobów, jak mogę odwoływać się do niego w pliku App.xaml moich aplikacji? Obecnie używam ResourceDictionary.MergedDictionaries do scalania poszczególnych plików słowników. Jeśli mam je w zestawie, jak mogę odwoływać się do nich w Xaml?

Gus Cavalcanti
źródło
1
Może to być przesada, ale możesz przygotować swoje zasoby do eksportu przy użyciu techniki opisanej tutaj: alexfeinberg.wordpress.com/2015/08/16/… . Główną zaletą takiego działania jest zapobieganie problemom z ładowaniem wielu wersji zestawu zasobów do tej samej domeny.
user195275,

Odpowiedzi:

353

Sprawdź składnię URI paczki . Chcesz coś takiego:

<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/>
Kent Boogaart
źródło
1
Co jeśli YourAssembly nie jest zawarty w ścieżce aplikacji?
SaneDeveloper
@Engineer Spock: CLR nie znajdzie go bez pomocy (nie ma nic wspólnego z WPF). Dodaj ścieżki sondowania do pliku app.config lub dołącz do, AppDomain.AssemblyResolveaby pomóc mu znaleźć zestaw.
Kent Boogaart,
1
Czy muszę dodać ścieżkę próbkowania, jeśli projekt YourAssembly jest na tym samym poziomie, co projekt aplikacji, który musi odwoływać się do YourAssembly? Na przykład C: \ Solution \ AppProject \ i C: \ Solution \ YourAssemblyProject \
SaneDeveloper
1
@EngineerSpock: to osobne pytanie, więc proszę je otworzyć.
Kent Boogaart,
2
Ta odpowiedź nie ma sensu. Aby tego przestrzegać, trzeba już wiedzieć, jak to zrobić!
user1040323,
97

Przykład, aby odpowiedź była 15 sekundowa -

Załóżmy, że masz plik „styles.xaml” w bibliotece WPF o nazwie „common” i chcesz go użyć z głównego projektu aplikacji:

  1. Dodaj odniesienie z głównego projektu do „wspólnego” projektu
  2. Twój plik app.xaml powinien zawierać:

<Application.Resources>
    <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary Source="pack://application:,,,/Common;component/styles.xaml"/>
        </ResourceDictionary.MergedDictionaries>
    </ResourceDictionary>
</Application.Resources>

Twoje zdrowie

Hertzel Guinness
źródło
2
A w jaki sposób udostępnić zasoby zdefiniowane w styles.xaml w oknie właściwości Visual Studio 2010? Jeśli wybiorę element, a następnie kliknę Zastosuj zasób dla jego właściwości Tło, pokaże tylko SystemColors, a nie te zdefiniowane w styles.xaml. Ale jeśli sam wpiszę nazwę zasobu w XAML, to zadziała, więc jest poprawnie przywołana.
xr280xr
Chciałem tylko dodać, że jeśli odwołujesz się do ResourceDictionary z UserControl, musisz dodać odwołanie do zestawu w obu miejscach: w UserControl i w głównym oknie projektu. W przeciwnym razie pojawi się błąd czasu wykonywania.
Andrejs Gasilovs,
16

Tylko biblioteka zasobów jest opcją dla Ciebie. Nie jest to jednak konieczne, chyba że chcesz zmodyfikować zasoby bez ponownej kompilacji aplikacji. Tylko jeden wspólny plik ResourceDictionary jest również opcją. To zależy od tego, jak często zmieniasz zasoby itp.

<ResourceDictionary Source="pack://application:,,,/
     <MyAssembly>;component/<FolderStructureInAssembly>/<ResourceFile.xaml>"/>

MyAssembly - po prostu nazwa zestawu bez rozszerzenia

FolderStructureInAssembly - Jeśli zasoby są w folderze, określ strukturę folderów

Kiedy to robisz, lepiej też wiedzieć o siteOfOrigin .

WPF obsługuje dwa organy: application: /// i siteoforigin: ///. Uprawnienie application: /// identyfikuje pliki danych aplikacji znane w czasie kompilacji, w tym pliki zasobów i treści. Organ siteoforigin: /// identyfikuje pliki stron źródłowych. Zakres każdego organu pokazano na poniższym rysunku.

wprowadź opis zdjęcia tutaj

CharithJ
źródło
8

Dla UWP:

<ResourceDictionary Source="ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" />
Gianluca Demarinis
źródło
4

Korzystanie z XAML:

Jeśli znasz inną assemblystrukturę i potrzebujesz kodu resourcesin c # , użyj poniższego kodu:

 ResourceDictionary dictionary = new ResourceDictionary();
 dictionary.Source = new Uri("pack://application:,,,/WpfControlLibrary1;Component/RD1.xaml", UriKind.Absolute);
 foreach (var item in dictionary.Values)
 {
    //operations
 }

Wynik: jeśli chcemy wykorzystać ResourceDictionary RD1.xamlProject WpfControlLibrary1do StackOverflowAppprojektu.

Struktura projektów :

Struktura projektów

Słownik zasobów: Słownik zasobów

Kod wyjściowy:

Wynik

PS: wszystkie ResourceDictionarypliki powinny mieć Build Actionjako „ Resource” lub „ Page”.

Za pomocą C #:

Jeśli ktoś chce rozwiązania w kodzie czysto c #, zobacz moje rozwiązanie.

Kylo Ren
źródło