संसाधन असेंबली एक अलग असेंबली में


245

मेरे पास संसाधन शब्दकोश फाइलें हैं (MenuTemplate.xaml, ButtonTemplate.xaml, आदि) जो मैं कई अलग-अलग अनुप्रयोगों में उपयोग करना चाहता हूं। मैं उन्हें अनुप्रयोगों की असेंबली में जोड़ सकता हूं, लेकिन अगर मैं इन संसाधनों को एक ही विधानसभा में संकलित करूं और मेरे आवेदन इसे संदर्भित करें तो सही?

संसाधन असेंबली बनाए जाने के बाद, मैं अपने एप्लिकेशन के App.xaml में इसका संदर्भ कैसे दे सकता हूं? वर्तमान में मैं अलग-अलग डिक्शनरी फ़ाइलों को मर्ज करने के लिए ResourceDictionary.MergedD शब्दकोशों का उपयोग करता हूं। अगर मेरे पास विधानसभा में हैं, तो मैं उन्हें xaml में कैसे संदर्भित कर सकता हूं?


1
यह एक ओवरकिल हो सकता है, लेकिन आप यहाँ वर्णित तकनीक का उपयोग करके अपने संसाधनों को निर्यात के लिए तैयार करना चाह सकते हैं: alexfeinberg.wordpress.com/2015/08/16/… । ऐसा करने का मुख्य लाभ संसाधन असेंबली के कई संस्करणों के साथ समस्याओं को रोकने के लिए एक ही रूप में लोड किया जा रहा है।
user195275

जवाबों:


353

URI सिंटैक्स पैक की जाँच करें । आप कुछ इस तरह चाहते हैं:

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

1
क्या होगा यदि YourAssembly एप्लिकेशन पथ के अंदर समाहित नहीं है?
SaneDeveloper 10

@Engineer Spock: तब CLR इसे बिना सहायता के नहीं मिलेगा (WPF के साथ विशेष रूप से करने के लिए कुछ भी नहीं)। या तो अपने app.config में प्रोबिंग पथ जोड़ें , या AppDomain.AssemblyResolveइसे असेंबली खोजने में मदद करने के लिए संलग्न करें ।
केंट बूगार्ट

1
अगर आपके एप्लिकेशन प्रोजेक्ट के समान स्तर पर है, तो क्या मुझे प्रोबेटिंग पथ जोड़ने की आवश्यकता है, जो YourAssembly को संदर्भित करने की आवश्यकता है? उदाहरण के लिए, C: \ Solution \ AppProject \ और C: \ Solution \ YourAssemblyProject \
SaneDeveloper

1
@EngineerSpock: यह एक अलग प्रश्न है, इसलिए कृपया इसे खोलें।
केंट बूआगार्ट

2
इस जवाब का कोई मतलब नहीं है। इसका पालन करने के लिए पहले से ही यह जानने की जरूरत है कि यह कैसे करना है!
user1040323

97

एक उदाहरण, इसे 15 सेकंड का उत्तर देने के लिए -

कहो कि आपके पास "आम" नाम की WPF लाइब्रेरी में "style.xaml" है और आप इसे अपने मुख्य एप्लिकेशन प्रोजेक्ट से उपयोग करना चाहते हैं:

  1. मुख्य प्रोजेक्ट से "कॉमन" प्रोजेक्ट के लिए एक संदर्भ जोड़ें
  2. आपके app.xaml में होना चाहिए:

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

चियर्स


2
और फिर आप विजुअल स्टूडियो 2010 प्रॉपर्टीज विंडो के माध्यम से शैलियों में परिभाषित संसाधनों को कैसे बनाते हैं। यदि मैं किसी तत्व का चयन करता हूं, और उसके बाद बैकग्राउंड प्रॉपर्टी के लिए अप्लाई रिसोर्स पर क्लिक करता हूं, तो यह केवल SystemColors दिखाता है, न कि स्टाइल में परिभाषित। लेकिन अगर मैं खुद XAML में संसाधन का नाम लिखता हूं तो यह काम करता है, इसलिए इसे सही ढंग से संदर्भित किया जाता है।
xr280xr

बस यह जोड़ना चाहता था कि यदि आप UserControl से रिसोर्सवार्ड का संदर्भ लेते हैं, तो आपको दोनों स्थानों में विधानसभा का संदर्भ जोड़ने की आवश्यकता है: UserControl में और मुख्य विंडो प्रोजेक्ट में। अन्यथा आपको रनटाइम त्रुटि मिलेगी।
रसियन गैसीलोव्स

35

मैं .NET 4.5 के साथ काम कर रहा हूं और यह काम नहीं कर सका ... मैं WPF कस्टम कंट्रोल लाइब्रेरी का उपयोग कर रहा था। यह मेरे लिए अंत में काम आया ...

<ResourceDictionary Source="/MyAssembly;component/mytheme.xaml" />

स्रोत: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/11a42336-8d87-4656-91a3-275413d3cc19


16

संसाधन-केवल DLL आपके लिए एक विकल्प है। लेकिन जरूरी नहीं है कि जब तक आप अनुप्रयोगों को फिर से जमा किए बिना संसाधनों को संशोधित करना चाहते हैं। बस एक सामान्य संसाधन फ़ाइल है एक विकल्प भी है। यह निर्भर करता है कि आप कितनी बार संसाधनों को बदलते हैं और आदि।

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

MyAssembly - विस्तार के बिना बस विधानसभा का नाम

FolderStructureInAssembly - यदि आपके संसाधन एक तह में हैं, तो फ़ोल्डर संरचना निर्दिष्ट करें

जब आप ऐसा कर रहे हैं तो साइटऑफ ऑर्गिन के बारे में भी जानना बेहतर होगा ।

WPF दो प्राधिकरणों का समर्थन करता है: आवेदन: /// और साइटोफोरिगिन: ///। आवेदन: /// प्राधिकरण अनुप्रयोग डेटा फ़ाइलों की पहचान करता है जो संसाधन और सामग्री फ़ाइलों सहित, संकलन समय पर जानी जाती हैं। साइटोफोरिजिन: /// प्राधिकरण मूल फ़ाइलों की साइट की पहचान करता है। प्रत्येक प्राधिकरण का दायरा निम्नलिखित आकृति में दिखाया गया है।

यहां छवि विवरण दर्ज करें



4

XAML का उपयोग करना:

आप दूसरे को जानते हैं assemblyसंरचना और चाहते हैं resourcesमें सी # कोड है, तो नीचे दिए गए कोड का उपयोग करें:

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

आउटपुट: यदि हम ResourceDictionary RD1.xamlप्रोजेक्ट WpfControlLibrary1में StackOverflowAppप्रोजेक्ट का उपयोग करना चाहते हैं ।

परियोजनाओं की संरचना :

परियोजनाओं की संरचना

संसाधन शब्दकोश: संसाधन शब्दकोश

कोड आउटपुट:

उत्पादन

पुनश्च: सभी ResourceDictionaryफाइलें Build Action' Resource' या ' Page' के रूप में होनी चाहिए ।

C # का उपयोग करना:

अगर किसी को शुद्ध रूप से सी # कोड में समाधान चाहिए तो मेरा यह समाधान देखें।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.