ResourceDictionary di majelis terpisah

245

Saya memiliki file kamus sumber daya (MenuTemplate.xaml, ButtonTemplate.xaml, dll) yang ingin saya gunakan di beberapa aplikasi terpisah. Saya bisa menambahkannya ke rakitan aplikasi, tetapi lebih baik jika saya mengkompilasi sumber daya ini dalam satu rakitan tunggal dan meminta rujukan aplikasi saya, kan?

Setelah perakitan sumber daya dibangun, bagaimana saya bisa merujuknya di App.xaml dari aplikasi saya? Saat ini saya menggunakan ResourceDictionary.MergedDictionaries untuk menggabungkan masing-masing file kamus. Jika saya memilikinya di sebuah majelis, bagaimana saya bisa merujuk mereka di xaml?

Gus Cavalcanti
sumber
1
Ini mungkin berlebihan, tetapi Anda mungkin ingin menyiapkan sumber daya Anda untuk Ekspor menggunakan teknik yang dijelaskan di sini: alexfeinberg.wordpress.com/2015/08/16/… . Keuntungan utama melakukan ini adalah untuk mencegah masalah dengan beberapa versi rakitan sumber daya dimuat ke dalam domain yang sama.
user195275

Jawaban:

352

Lihatlah sintaksis paket URI . Anda menginginkan sesuatu seperti ini:

<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/>
Kent Boogaart
sumber
1
Bagaimana jika YourAssembly tidak terdapat di dalam jalur aplikasi?
SaneDeveloper
@ Engineer Spock: maka CLR tidak akan menemukannya tanpa bantuan (tidak ada hubungannya dengan WPF). Tambahkan jalur probing ke app.config Anda , atau lampirkan AppDomain.AssemblyResolveuntuk membantunya menemukan perakitan.
Kent Boogaart
1
Apakah saya perlu menambahkan jalur probing jika proyek YourAssembly berada pada level yang sama dengan proyek aplikasi yang perlu mereferensikan YourAssembly? Misalnya, C: \ Solution \ AppProject \ dan C: \ Solution \ YourAssemblyProject \
SaneDeveloper
1
@ EngineerSpock: ini adalah pertanyaan terpisah, jadi silakan buka satu.
Kent Boogaart
2
Jawaban ini tidak masuk akal. Untuk mengikutinya kita harus tahu bagaimana melakukannya!
user1040323
97

Contoh, hanya untuk menjadikan ini jawaban 15 detik -

Katakanlah Anda memiliki "styles.xaml" di perpustakaan WPF bernama "umum" dan Anda ingin menggunakannya dari proyek aplikasi utama Anda:

  1. Tambahkan referensi dari proyek utama ke proyek "umum"
  2. App.xaml Anda harus berisi:

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

Bersulang

Hertzel Guinness
sumber
2
Dan kemudian bagaimana Anda membuat sumber daya yang didefinisikan dalam styles.xaml tersedia melalui jendela Visual Studio 2010 Properties? Jika saya memilih elemen, dan kemudian klik Terapkan Sumber Daya untuk properti Backgroundnya, itu hanya menampilkan SystemColors dan bukan yang didefinisikan dalam styles.xaml. Tetapi jika saya mengetik nama sumber daya di XAML sendiri itu berfungsi, jadi direferensikan dengan benar.
xr280xr
Hanya ingin menambahkan bahwa jika Anda mereferensikan ResourceDictionary dari UserControl, maka Anda perlu menambahkan referensi ke perakitan di kedua tempat: di UserControl dan di proyek jendela utama. Kalau tidak, Anda akan mendapatkan kesalahan runtime.
Andrejs Gasilovs
16

DLL Hanya Sumber Daya adalah opsi untuk Anda. Tapi itu tidak diperlukan tentu kecuali Anda ingin memodifikasi sumber daya tanpa kompilasi ulang aplikasi. Memiliki hanya satu file ResourceDictionary umum juga merupakan opsi. Tergantung seberapa sering Anda mengubah sumber daya dan sebagainya.

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

MyAssembly - Hanya nama perakitan tanpa ekstensi

FolderStructureInAssembly - Jika sumber daya Anda ada dalam lipatan, tentukan struktur folder

Ketika Anda melakukan ini, lebih baik untuk menyadari siteOfOrigin juga.

WPF mendukung dua otoritas: aplikasi: /// dan siteoforigin: ///. Aplikasi: /// otoritas mengidentifikasi file data aplikasi yang diketahui pada waktu kompilasi, termasuk file sumber daya dan konten. Siteoforigin: /// otoritas mengidentifikasi situs file asal. Ruang lingkup masing-masing otoritas ditunjukkan pada gambar berikut.

masukkan deskripsi gambar di sini

CharithJ
sumber
8

Untuk UWP:

<ResourceDictionary Source="ms-appx:///##Namespace.External.Assembly##/##FOLDER##/##FILE##.xaml" />
Gianluca Demarinis
sumber
4

Menggunakan XAML:

Jika Anda tahu lain assemblystruktur dan ingin resourcesdi c # kode, kemudian gunakan kode di bawah:

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

Keluaran: Jika kita ingin menggunakan ResourceDictionary RD1.xamlProyek WpfControlLibrary1ke dalam StackOverflowAppproyek.

Struktur Proyek :

Struktur Proyek

Kamus Sumber: Kamus Sumberdaya

Output Kode:

Keluaran

PS: Semua ResourceDictionaryFile harus memiliki Build Action' Resource' atau ' Page'.

Menggunakan C #:

Jika ada yang menginginkan solusi dalam kode c # murni maka lihat solusi saya ini.

Kylo Ren
sumber