InitializeComponent () क्या करता है, और यह WPF में कैसे काम करता है?


166

InitializeComponent()WPF में क्या काम करता है, और यह कैसे काम करता है?

सामान्य तौर पर पहले, लेकिन मैं विशेष रूप से निर्माण के आदेश के गोर विवरण को जानना चाहूंगा, और जब संलग्न गुण होते हैं तो क्या होता है।


2
धन्यवाद, मुझे लगता है कि ये नीचे बहुत अच्छे जवाब हैं! किसी ने भी अटैच्डप्रोटेक्टी का उल्लेख नहीं किया है, लेकिन अब मुझे पता है कि ज़ामल में कोई भी अटैचप्रोपरेटी केवल ज़ामल पार्सिंग के हिस्से के रूप में बनाई गई हैं, इसलिए वे वास्तव में एक विशेष उल्लेख के लायक नहीं हैं।
टिम लोवेल-स्मिथ

जवाबों:


157

के लिए कॉल InitializeComponent()(जिसे आमतौर पर कम से कम डिफ़ॉल्ट निर्माता में कहा जाता है ) Windowऔर UserControlवास्तव में नियंत्रण के आंशिक वर्ग को कॉल करने की एक विधि है (बजाय मैं पहली उम्मीद के अनुसार वस्तु पदानुक्रम को कॉल करता हूं)।

यह विधि लोड हो रही है Window/ UserControlऔर System.Windows.Application.LoadComponent()स्थैतिक विधि के लिए इसे पास करने के लिए XAML के लिए एक URI पता लगाता है । LoadComponent()XAML फ़ाइल को लोड करता है जो URI में पास है, और इसे XAML फ़ाइल के मूल तत्व द्वारा निर्दिष्ट ऑब्जेक्ट के उदाहरण में परिवर्तित करता है।

अधिक विवरण में, का LoadComponentएक उदाहरण XamlParserबनाता है और XAML का एक पेड़ बनाता है। प्रत्येक नोड द्वारा पार्स किया जाता है XamlParser.ProcessXamlNode()। यह BamlRecordWriterक्लास में पास हो जाता है । इसके कुछ समय बाद मैं थोड़ा खो जाता हूं कि कैसे BAML को वस्तुओं में परिवर्तित किया जाता है, लेकिन यह आपको आत्मज्ञान के मार्ग पर मदद करने के लिए पर्याप्त हो सकता है।

नोट: दिलचस्प रूप से, इंटरफ़ेस InitializeComponentपर एक विधि System.Windows.Markup.IComponentConnectorहै, जिसमें से Window/ UserControlआंशिक रूप से उत्पन्न वर्ग में लागू होती है।

उम्मीद है की यह मदद करेगा!


@ ब्रैड, आपको कैसे पता चला कि इनिशियलाइज़ कॉमपोनपेंट को किस इंटरफ़ेस में परिभाषित किया गया है? .Xaml.cs फ़ाइल की कॉल पर F1 मदद .g.cs या .gics फ़ाइल में "पृष्ठ नहीं मिला" की ओर जाता है जो Microsoft.SPOT.Emulator.EmulatorComponent वर्ग की ओर जाता है। मैं WPF के लिए नया हूँ। क्या यह विधि बिल्ड टाइम पर उत्पन्न होती है?
विम्स

@ Арт callмЦарионов कंस्ट्रक्शनर में प्रारंभिक कॉल करने के लिए बिना कॉल, नियंत्रण XAML में प्रदर्शित नहीं होगा या उपयोग करने योग्य नहीं होगा जिसमें यह स्थित है।
जेसन

दिलचस्प। मैं इस धारणा के तहत था कि xaml का उपयोग केवल संकलन के दौरान किया गया था .. xaml को रनटाइम पर उपलब्ध होने के लिए क्या बिंदु है और यह कहाँ संग्रहीत है?
जेसपर मथेत्सेन

क्यों कुछ तरीके मुझे एक "वस्तु संदर्भ एक वस्तु के उदाहरण पर सेट नहीं है" देते हैं। ?
पीटर ग्रुपेलाकर

26

कोड को देखने से हमेशा मदद मिलती है। अर्थात्, आप वास्तव में उत्पन्न आंशिक वर्ग पर एक नज़र डाल सकते हैं (जिसे लोडकम्पोनेंट कहते हैं ) निम्न कार्य करके:

  1. Visual Studio समाधान में समाधान एक्सप्लोरर फलक पर जाएं जिसमें आप रुचि रखते हैं।
  2. सॉल्यूशन एक्सप्लोरर के टूल बार में एक बटन होता है जिसका शीर्षक है 'शो ऑल फाइल्स'। उस बटन को टॉगल करें।
  3. अब, obj फ़ोल्डर और फिर डीबग या रिलीज़ फ़ोल्डर (या जो भी कॉन्फ़िगरेशन आप बना रहे हैं) का विस्तार करें और आपको YourClass .g.cs नामक एक फ़ाइल दिखाई देगी।

YourClass .g.cs ... उत्पन्न आंशिक वर्ग के लिए कोड है। फिर से, यदि आप इसे खोलते हैं तो आप InitializeComponent पद्धति को देख सकते हैं और इसे LoadComponent कैसे कहते हैं ... और बहुत कुछ।


12
ध्यान दें कि आप इसे एक चरण में कंस्ट्रक्टर में विधि कॉल पर क्लिक करके और "गो टू डेफिनिशन" का चयन करके कर सकते हैं।
ब्रैड लीच

2
आह, यह सही है ... उस के बारे में भूल गया। बहुत आसान तरीका है। ठीक है, कम से कम आप जानते हैं कि यह परियोजना में कैसे शामिल है। मुसकान।
cplotts

1
@ ब्रैड लीच, इस पार्टी के लिए देर से, आप इसे F12 के साथ कर सकते हैं
जूलियस डेपुल्ला
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.