Ayrı bir montajda ResourceDictionary


245

Birden çok ayrı uygulamada kullanmak istediğiniz kaynak sözlük dosyaları (MenuTemplate.xaml, ButtonTemplate.xaml, vb.) Var. Bunları uygulamaların derlemelerine ekleyebilirim, ancak bu kaynakları tek bir derlemede derleyip uygulamalarımın referans almasını sağlamak daha iyi, değil mi?

Kaynak derlemesi oluşturulduktan sonra, uygulamalarımın App.xaml dosyasında nasıl başvurabilirim? Şu anda tek tek sözlük dosyalarını birleştirmek için ResourceDictionary.MergedDictionaries kullanın. Onları bir montajda varsa, xaml'de nasıl başvurabilirim?


1
Bu aşırıya kaçabilir, ancak burada açıklanan tekniği kullanarak kaynaklarınızı İhracat için hazırlamak isteyebilirsiniz: alexfeinberg.wordpress.com/2015/08/16/… . Bunu yapmanın ana avantajı, kaynak derlemesinin birden çok sürümünün aynı uygulama alanına yüklenmesini engellemektir.
user195275

Yanıtlar:


353

Paket URI sözdizimine göz atın . Böyle bir şey istiyorsun:

<ResourceDictionary Source="pack://application:,,,/YourAssembly;component/Subfolder/YourResourceFile.xaml"/>

1
Montajınız uygulama yolunda yoksa ne olur?
SaneDeveloper

@Engineer Spock: CLR yardım almadan bulamaz (WPF ile özellikle ilgisi yoktur). Ya için araştırmacı yolları eklemek app.config veya eklemek AppDomain.AssemblyResolveo montaj bulmalarına yardımcı olmak için.
Kent Boogaart

1
YourAssembly projeniz, YourAssembly uygulamasına başvurması gereken uygulama projesi ile aynı düzeydeyse prob yolu eklemem gerekir mi? Örneğin, C: \ Solution \ AppProject \ ve C: \ Solution \ YourAssemblyProject \
SaneDeveloper

1
@EngineerSpock: Bu ayrı bir soru, bu yüzden lütfen bir tane açın.
Kent Boogaart

2
Bu cevap bir anlam ifade etmiyor. Bunu takip etmek için zaten nasıl yapılacağını bilmek gerekiyor!
user1040323

97

Bir örnek, bunu 15 saniye cevaplamak için -

Diyelim ki "common" adlı bir WPF kütüphanesinde "styles.xaml" var ve bunu ana uygulama projenizden kullanmak istiyorsunuz:

  1. Ana projeden "ortak" projeye referans ekleme
  2. App.xaml dosyanız şunları içermelidir:

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

Şerefe


2
Peki styles.xaml içinde tanımlanan kaynakları Visual Studio 2010 Properties penceresinden nasıl erişilebilir hale getirebilirsiniz? Bir öğe seçer ve sonra Arka Plan özelliği için Kaynak Uygula'yı tıklatırsam, styles.xaml dosyasında tanımlananları değil yalnızca SystemColors'ı gösterir. Ama XAML kaynak adını kendim yazarsam çalışır, bu yüzden doğru başvurulur.
xr280xr

Sadece UserControl ResourceDictionary başvurursanız, o zaman her iki yerde derleme bir başvuru eklemeniz gerekir eklemek: UserControl ve ana pencere projesinde. Aksi takdirde çalışma zamanı hatası alırsınız.
Andrejs Gasilovs


16

Yalnızca Kaynak DLL sizin için bir seçenektir. Ancak, uygulamaları yeniden derlemeden kaynakları değiştirmek istemiyorsanız zorunlu olarak gerekli değildir. Tek bir ortak ResourceDictionary dosyası da bir seçenektir. Kaynakları vb. Ne sıklıkta değiştirdiğinize bağlıdır.

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

MyAssembly - Sadece uzantısız montaj adı

FolderStructureInAssembly - Kaynaklarınız bir folde içindeyse, klasör yapısını belirtin

Bunu yaparken siteOfOrigin'in de farkında olmak daha iyidir .

WPF iki yetkiliyi destekler: application: /// ve siteoforigin: ///. Application: /// authority, derleme zamanında bilinen kaynak ve içerik dosyaları da dahil olmak üzere uygulama veri dosyalarını tanımlar. Siteoforigin: /// yetkisi, kaynak dosyaların sitesini tanımlar. Her bir otoritenin kapsamı aşağıdaki şekilde gösterilmiştir.

resim açıklamasını buraya girin


8

UWP için:

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

4

XAML kullanma:

Diğer biliyorsanız assemblyyapısını ve istediğiniz resourcesiçinde c # kodu, daha sonra kodu aşağıda kullanın:

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

Çıktı: Kullandığımız istiyorsanız ResourceDictionary RD1.xamlProjesi WpfControlLibrary1içine StackOverflowAppprojesi.

Projelerin Yapısı :

Projelerin Yapısı

Kaynak Sözlüğü: Kaynak Sözlüğü

Kod Çıkışı:

Çıktı

Not: Tüm ResourceDictionaryDosyalarda Build Action' Resource' veya ' Page' olmalıdır.

C # kullanarak:

Herkes çözüm tamamen c # kodu istiyorsa benim bu çözüm bakın.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.