8

मेरे पास कुछ संसाधन (इस मामले में छवियां) संसाधन फ़ाइल में हैं जो मैं अपने विंडोज फॉर्म प्रोजेक्ट में नियंत्रणों पर उपयोग करता हूं। विजुअल स्टूडियो रिसोर्स सिलेक्शन डायलॉग को संसाधन फ़ाइलों से छवियों को चुनने के लिए बहुत अच्छा समर्थन नहीं है जब तक कि वे विशिष्ट स्थानों पर न हों, लेकिन आप डिज़ाइनर फ़ाइल को सीधे संपादित कर सकते हैं, और यह ठीक काम करता है; एप्लिकेशन संकलित करता है और सही ढंग से चलता है, और विंडोज फॉर्म डिज़ाइनर मेरे हाथ से संपादित कोड को गड़बड़ करने के लिए पर्याप्त स्मार्ट नहीं है।बाहरी असेंबली से संसाधनों का उपयोग करने के लिए मैं विंडोज फॉर्म डिज़ाइनर कैसे प्राप्त करूं?

// in an assembly named ResourceConsumer 
this.button1.Image = global::ResourceConsumer.Properties.Resources.Close32x32; 

अब मैं उन संसाधनों को बाहरी असेंबली में ले जाना चाहता हूं ताकि उन्हें कई अनुप्रयोगों द्वारा उपयोग किया जा सके। मैं बिना किसी समस्या के अपने संसाधनों का पर्दाफाश करने के लिए एक असेंबली स्थापित कर सकता हूं (जब तक मैं विजुअल स्टूडियो 2008 या बाद में उपयोग कर रहा हूं), और यह ठीक काम करता है। जब मैं अपने नए स्थान से छवि को संदर्भित करने के लिए डिज़ाइनर कोड बदलता हूं, तो कोड संकलित करता है और सही ढंग से चलता है, लेकिन जब भी यह कोड उत्पन्न करता है तो विंडोज फॉर्म डिज़ाइनर मेरे कोड को बदलता है; यह स्थानीय संसाधन फ़ाइल में छवि की बाइनरी को एम्बेड करता है और वहां से संदर्भ देता है।

// ResourceProducer is an external assembly containing resources 
this.button1.Image = global::ResourceProducer.Properties.Resources.Exit32x32; 

करने के लिए Windows फार्म डिजाइनर द्वारा बदल गई है:

this.button1.Image = ((System.Drawing.Image)(resources.GetObject("button1.Image"))); 

विण्डोज़ फॉर्म्स डिजाइनर एक ही विधानसभा के भीतर से एक संसाधन खींच को समझने के लिए लगता है, लेकिन नहीं एक बाहरी। क्या विंडोज फॉर्म डिज़ाइनर को बाहरी असेंबली से संसाधन का उपयोग करने का कोई तरीका है?

उत्तर

2

नहीं, डिजाइनर इसका समर्थन नहीं करता है। महत्वपूर्ण है कि यह जिस तरह से काम करता है, सैटेलाइट असेंबली के माध्यम से स्थानीयकरण अन्यथा काम नहीं करेगा।

आप यह कर सकते हैं लेकिन आपको कोड स्वयं लिखना है। संसाधनों में आपको बहुत कुछ मिलता है। डिज़ाइनर सीएस फ़ाइल। विचार करें कि यह प्रयास के लायक है, यह बहुत ही रखरखाव नहीं है और संसाधन असेंबली साझा करना अनुकूलन का अधिक नहीं है। एक टेराबाइट डिस्क सौ रुपये से भी कम है।

बीटीडब्ल्यू: कभी संसाधनों को संपादित करें। डिज़ाइनर सीएस स्वयं फ़ाइल करें।

+1

दरअसल, मैं डिजाइनर को इसका समर्थन करने के लिए वैसे भी नहीं ढूंढ पा रहा हूं, लेकिन जब आप कहते हैं कि "उपग्रह असेंबली के माध्यम से स्थानीयकरण काम नहीं करेगा?" हम कोड डुप्लिकेशन और स्थानीयकरण प्रयास को कम करने के लिए संसाधनों को मजबूत करना चाहते हैं; प्रत्येक परियोजना के बजाय एक बार संसाधन को शामिल करना और स्थानीयकरण करना आसान होगा। क्या इस मामले में संसाधन असेंबली के उपग्रह असेंबली के आधार पर स्थानीय संसाधनों को पुनर्प्राप्त नहीं किया जाएगा? यदि ऐसा है, तो हम अभी भी उन परियोजनाओं के लिए संसाधन असेंबली का उपयोग कर सकते हैं जिन्हें डिजाइनर समर्थन की आवश्यकता नहीं है। –

3

मेरे पास सटीक same problem है और आपके कोड-बेस के आधार पर एक वैकल्पिक दृष्टिकोण हो सकता है। यदि किसी विशिष्ट संसाधन को संदर्भित करने के लिए संशोधित गुण कस्टम नियंत्रण पर हैं, तो आप उन गुणों के लिए [[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] विशेषता जोड़ सकते हैं (यदि आवश्यक हो तो ओवरराइड या छुपाएं) और डिज़ाइनर उन्हें अकेला छोड़ देगा।

हालांकि, यदि गुण मूल यूआई तत्वों (जैसे फॉर्म। बैकग्राउंड इमेज) पर हैं तो आपको उनको ओवरराइड या छुपाना होगा और मुझे यकीन नहीं है कि यह कितना वांछनीय है।

संबंधित मुद्दे