2010-02-02 12 views
12

İki kitaplığım ve tek bir uygulama derleme proje düzenine sahibim ve stillerdeki anahtarlar tarafından anahtarlarına göre anahtar sözcükleri nasıl referans gösterebilirim? diğer.Başka bir kitaplıkta ayrı bir derlemede tanımlanan WPF stili anahtarları nasıl başvuruyor

Çözümümün düzeni:

  • WpfControls.dll - yanı ben yeniden yapmak istiyorum böyle bir WPF tabanlı NumericUpDown kontrolü yanı sıra diğer temel kontroller ve bazı stilleri gibi genel yeniden kontrolleri tutar. Örnekte, stil anahtarımın MyButtonStyle olarak tanımlandığını varsayalım.
  • SpecializedControls.dll - WPF'deki özel birleşik denetimler ve UserControls gibi uygulamalarımız için özelleştirilmiş denetimleri tutar. WpfControls.dll derlemesinde tanımlanan MyButtonStyle stilini referans olarak görmek isterim.
  • Application.exe - Bu derleme, SpecializedControls.dll derlemesinde tanımlanan denetimleri kullanır.

ben basit tek kontrol kütüphane ve uygulama montaj ile bunun nasıl açıklayan bazı örnekler gördüm ama benim durumumda iki meclisleri ve bir uygulama var. Yani başka bir deyişle benim durumumda, ikinci kontrol kütüphanemde bir Merge Sözlüğü kavramını kullanabileceğim bir App.xaml yok. Ben emin olmak istedim eğer bir Werged.xaml WpfControls.dll derlemede tanımlanan tüm birleştirmek için her denetimler XAML dosyasında doğrudan bir birleştirilen bir sözlüğü başvuru koyabilirsiniz, ama benim tahminim bu gereksiz yere çeşitli yerlerde birleştirilen stilleri sonuçlanacağı SpecializedControls grubumda en iyi çözüm gibi görünmüyor. Daha da kötüsü yapmak için, bu sözlükler de Application.exe içine de eklenebilir, bu benim çalışma zamanımda uygulamamı şişirmeye başlıyor mu?

Bu tarz stilleri en az miktarda programlı ve kaynak yükü ile paylaşmanız için önerilen veya en iyi yaklaşımın ne olduğunu açıklığa kavuşturabilir.

Güncelleştirmesi: Biraz daha fazla test yaptıktan sonra, Generic.xaml içinde tanımlanan herhangi bir kaynağın, aynı montajda bile olsa, bu anahtar ile başvuruda sorun yaşıyorum. Kaynak anahtarlarının nasıl çalıştığını anladığım konusunda tamamen yanlış bir şey olabilir, bu yüzden ComponentResourceKey'ye bakmanın yanı sıra biraz daha fazla araştırmam gerekecek. Herhangi bir ipucu veya önerisi varsa lütfen yardım edin.

cevap

14

WPF'deki kaynak araması hiyerarşide çalışır: mantıksal ağaç, sonra uygulama kaynakları, tema kaynakları ve son olarak sistem kaynakları. Tema kaynaklarına genellikle yalnızca örtülü olarak erişilebilirler (tanımlandıkları derleme dahilinde bile). Bu, yalnızca TargetType öğesinin örtülü anahtar olarak kullanılabileceği Stiller için geçerlidir.

  • bir ComponentResourceKey kullanın: Yapmanız çalıştığınız şeyi başarmak için

    , iki seçenek vardır. Bu, diğer derlemelerden kaynak referansı sağlayan özel bir kaynak anahtardır.Örneğin, WpfControls içinde tema sözlüğünü bir fırça tanımlayabilirsiniz:

    <LinearGradientBrush x:Key="{ComponentResourceKey TypeInTargetAssembly=local:MyClass, ResourceId=MyBrush}"> 
        <GradientStop Color="Red" /> 
        <GradientStop Color="Blue" Offset="1" /> 
    </LinearGradientBrush> 
    

    Ve sonra SpecializedControls bunu başvurabilirsiniz: içine bir sözlük almak için

    <UserControl Background="{StaticResource {ComponentResourceKey TypeInTargetAssembly=wpfControls:MyClass, ResourceId=MyBrush}}" /> 
    
  • Kullanım MergedDictionaries uygulama kaynakları. Bunu Uygulama derlemesinde yapabilir ve uygulama yüklendiğinde, SpecializedControls'da bulunan denetimler bile bu kaynakları kullanabilir. Bu senaryodaki tasarım zamanı deneyimiyle ilgili bir sorun yaşayacaksınız; bu, SpecializedControls numaralı bir sahte App.xaml dosyasını ekleyerek, bu da sözlüğe bir başvuru da içerecektir. Bu yardımcı olur

Umut,

Aelij.

+3

Aynı sorunla karşı karşıyayım. İkinci seçeneği uzatır mısın lütfen? MergedDictionary kullanarak başka bir mecliste bildirilen başka bir stile dayalı olarak bir Tarz açıklamasının nasıl çalışacağını göremiyorum. – JoanComasFdz

İlgili konular