2009-09-04 10 views
26

जब मैं एक WPF UserControl बनाया है और इसका इस्तेमाल करने की कोशिश की, मैं निम्नलिखित संकलक त्रुटि मिली:मैं एक ही असेंबली में UserControl पर नाम विशेषता का उपयोग क्यों नहीं कर सकता?

Because 'UserControl1' is implemented in the same assembly, you must set the x:Name attribute rather than the Name attribute.

संदेश क्या इसे ठीक करने करने के बारे में स्पष्ट है, लेकिन इसके कारण क्या है? क्यों क्या मैं यहां Name का उपयोग नहीं कर सकता?

उत्तर

29

x: नाम "इस विशिष्ट एक्सएमएल नेमस्पेस में नाम विशेषता" कहने का एक और स्पष्ट तरीका है। तथ्य यह है कि डब्ल्यूपीएफ इस संकेत के बिना इसे संकलित नहीं कर सकता है क्योंकि यह एक ही असेंबली में है, यह सिर्फ एक सीमा है कि उन्होंने पार्सर कैसे लिखा।

यदि आप पूछ रहे हैं कि यह क्यों है, तो मुझे यकीन नहीं है क्योंकि मैंने इसे नहीं लिखा था। संभवतः नाम उपयोगकर्ता विशेषता (पढ़ें: निर्भरता संपत्ति) को कुछ कंक्रीट में हल करने में सक्षम होने की आवश्यकता है, इसके अलावा आपके उपयोगकर्ता नियंत्रण 1, दूसरे शब्दों में, कैच -22।

7

शुरुआत में एक्सएएमएल कंपाइलर को .NET ऑब्जेक्ट्स के "पेड़" बनाने में सक्षम बनाने के लिए लिखा गया था, माइक्रोसॉफ्ट के भीतर 101 परियोजनाएं थीं जो एक्सएएमएल का इस्तेमाल करती थीं। एक्सएएमएल कंपाइलर WPF के बारे में कुछ भी नहीं जानता है।

"नाम" संपत्ति WPF द्वारा परिभाषित की गई है और XAML कंपाइलर द्वारा इसके बारे में ज्ञात नहीं है। डब्ल्यूपीएफ नाम संपत्ति को "नाम TAG" जैसा ही चिह्नित करता है जो XAML कंपाइलर द्वारा समर्थित है। "X: name" में "x" XAML xml स्कीमा द्वारा परिभाषित "नाम" का उपयोग कर रहा है, "नाम" कहता है कि दिए गए ऑब्जेक्ट पर "नाम" नामक एक संपत्ति खोजें। अधिक जानकारी के लिए In WPF, what are the differences between the x:Name and Name attributes? देखें।

एक्सएएमएल कंपाइलर उपयोगकर्ता नियंत्रण के साथ किए गए असेंबली को लोड किए बिना उपयोगकर्ता नियंत्रण के साथ क्या कर सकता है, उसमें बहुत सीमित है। चूंकि असेंबली को लोड करने से पहले एक्सएएमएल को संकलित करने की आवश्यकता है, इसलिए एक्सएमएल कंपाइलर स्पष्ट रूप से असेंबली को उसी नियंत्रण में लागू नहीं कर सकता है जो एक ही असेंबली में लागू होता है। इसलिए एक्सएएमएल कंपाइलर यह भी नहीं जानता कि आइटम उपयोगकर्ता नियंत्रण है।

Properties that are defined on a user control (or its parent class) can therefore not be accessed. “Name” is a property that is defined in the parent (or super-parent) of a custom control.

एक्सएएमएल कंपाइलर सिर्फ "संपत्ति को संपत्ति के रूप में परिभाषित नहीं किया गया" कह सकता है; अगर ऐसा होता है, तो सोचें कि कितने लोग एक साधारण कस्टम नियंत्रण काम करने में असफल हो जाएंगे! इसलिए XAML कंपाइलर का एक विशेष मामला है जो कोड का अर्थ "अनुमान लगाने" द्वारा एक और अधिक उपयोगी त्रुटि संदेश देता है। इसका अनुमान ज्यादातर सही है।

सबसे सरल उपयोगकर्ता नियंत्रण के अलावा कुछ भी अपनी असेंबली में होना आवश्यक है, हालांकि उपयोगकर्ता सरल नियंत्रण इतना आम है कि उनके लिए एक विशेष मामला सार्थक माना जाता था।

+2

'उपयोगकर्ता नियंत्रण (या उसके मूल वर्ग) पर परिभाषित गुणों को इसलिए एक्सेस नहीं किया जा सकता है।' - यह मेरे लिए समझ में नहीं आता है। बेस क्लास में परिभाषित अन्य गुणों को सेट करना '', इसलिए मुझे समझ में नहीं आता कि क्यों संकलक 'नाम' WPF-property के मूल्य को उसी तरह सेट नहीं कर सकता – nevermind

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

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