.net - डब्ल्यूपीएफ में, एक्स: नाम और नाम विशेषताओं के बीच अंतर क्या हैं?




wpf xaml (9)

शीर्षक ही सब कुछ कह देता है। कभी-कभी ऐसा लगता है कि Name और x:Name विशेषताएँ अदला-बदली हैं।

तो, उनके बीच निश्चित मतभेद क्या हैं, और दूसरे पर एक का उपयोग करना बेहतर क्यों है?

क्या गलत तरीके से उनका उपयोग करने के लिए कोई प्रदर्शन या स्मृति प्रभाव है?


उत्तर में से एक यह है कि x: नाम का प्रयोग विभिन्न प्रोग्राम भाषाओं जैसे सी # के रूप में किया जाना चाहिए और फ्रेमवर्क के लिए नाम का उपयोग किया जाना है। ईमानदारी से यह मेरे जैसा लगता है।


एक्स: नाम और नाम विभिन्न नामस्थानों का संदर्भ दे रहे हैं।

x: नाम Xaml फ़ाइल के शीर्ष पर डिफ़ॉल्ट रूप से परिभाषित एक्स नेमस्पेस का संदर्भ है।

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

बस कह रहा है नाम नाम नीचे डिफ़ॉल्ट नाम का उपयोग करता है।

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

x: नाम कह रहा है कि नामस्थान का उपयोग करें जिसमें x उपनाम है। एक्स डिफ़ॉल्ट है और अधिकांश लोग इसे छोड़ देते हैं लेकिन आप जो भी चाहें उसे बदल सकते हैं

xmlns:foo="http://schemas.microsoft.com/winfx/2006/xaml"

तो आपका संदर्भ foo होगा : नाम

WPF में नामस्थानों को परिभाषित करें और उपयोग करें

ठीक है इसे एक अलग तरीके से देखते हैं। मान लें कि आप अपने एक्सएमएल पेज पर एक बटन खींचें और छोड़ें। आप इस 2 तरीके x: नाम और नाम का संदर्भ दे सकते हैं। सभी xmlns = "http://schemas.microsoft.com/winfx/2006/xaml/presentation" और xmlns: x = "http://schemas.microsoft.com/winfx/2006/xaml" एकाधिक नामस्थानों के संदर्भ हैं । चूंकि xaml में नियंत्रण नामस्थान (उस पर 100% नहीं) है और प्रेजेंटेशन में फ्रेमवर्क एलिमेंट है और बटन क्लास का विरासत पैटर्न है:

Button : ButtonBase
ButtonBase : ContentControl, ICommandSource
ContentControl : Control, IAddChild
Control : FrameworkElement
FrameworkElement : UIElement, IFrameworkInputElement, 
                    IInputElement, ISupportInitialize, IHaveResources

इसलिए जब कोई फ्रेमवर्क एलिमेंट से प्राप्त कुछ भी उम्मीद करेगा तो उसके सभी सार्वजनिक विशेषताओं तक पहुंच होगी। इसलिए बटन के मामले में पदानुक्रम के पेड़ के शीर्ष पर, फ्रेमवर्क एलिमेंट से इसका नाम विशेषता प्राप्त हो रही है। तो आप एक्स: नाम या नाम कह सकते हैं और वे दोनों फ्रेमवर्क एलिमेंट से गेटर / सेटर तक पहुंचेंगे।

एमएसडीएन संदर्भ

डब्ल्यूपीएफ एक सीएलआर विशेषता को परिभाषित करता है जिसे एक्सएलएमएल प्रोसेसर द्वारा उपभोग किया जाता है ताकि एकाधिक सीएलआर नेमस्पेस को एक एक्सएमएल नेमस्पेस में मैप किया जा सके। XmlnsDefinitionAttribute विशेषता असेंबली स्तर पर असेंबली स्तर पर रखी जाती है जो असेंबली उत्पन्न करती है। WPF असेंबली स्रोत कोड http://schemas.microsoft.com/winfx/2006/xaml/presentation नेमस्पेस पर, System.Windows और System.Windows.Controls जैसे विभिन्न सामान्य नामस्थानों को मैप करने के लिए इस विशेषता का उपयोग करता है।

तो असेंबली विशेषताएँ कुछ इस तरह दिखेगी:

PresentationFramework.dll - XmlnsDefinitionAttribute:

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Data")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Navigation")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Shapes")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Documents")]

[assembly: XmlnsDefinition("http://schemas.microsoft.com/winfx/2006/xaml/presentation", "System.Windows.Controls")]  

एक्सएएमएल, x:Name में वास्तव में केवल एक ही x:NameRuntimeNamePropertyAttribute जैसे ढांचे, वैकल्पिक रूप से RuntimeNamePropertyAttribute के x:Name में अपने गुणों में से एक को मानचित्र कर सकते हैं x:Name क्लास पर RuntimeNamePropertyAttribute का उपयोग करके x:Name जो क्लास गुणों में से एक को एक्स पर मैपिंग के रूप में निर्दिष्ट करता है: XAML का नाम विशेषता।

ऐसा करने का कारण उन ढांचे के लिए अनुमति देना था जिनके पास पहले से ही "नाम" की अवधारणा है, जैसे कि WPF। डब्ल्यूपीएफ में, उदाहरण के लिए, FrameworkElement एलिमेंट एक नाम संपत्ति पेश करता है।

आम तौर पर, किसी वर्ग को x:Name के नाम को स्टोर करने की आवश्यकता नहीं होती है x:Name करने योग्य होना चाहिए। सभी x:Name मतलब है एक्सएएमएल कक्षा के पीछे कोड में मूल्य को स्टोर करने के लिए एक फ़ील्ड उत्पन्न करता है। उस मैपिंग के साथ रनटाइम क्या ढांचा निर्भर है।

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

भविष्य में, एक्सएएमएल के पास एक्स: नाम के लिए अधिक उपयोग होंगे, जैसे कि आप अन्य वस्तुओं को नाम से संदर्भित करके गुण सेट करने की इजाजत देते हैं, लेकिन 3.5 और इससे पहले, इसका उपयोग केवल फ़ील्ड बनाने के लिए किया जाता है।

चाहे आपको एक या दूसरे का उपयोग करना चाहिए, वास्तव में एक स्टाइल सवाल है, तकनीकी नहीं। मैं इसे सिफारिश के लिए दूसरों को छोड़ दूंगा।

AutomationProperties.Name VS x: नाम , AutomationProperties.Name को एक्सेसिबिलिटी टूल और कुछ परीक्षण टूल द्वारा भी उपयोग किया जाता है।


केवल अंतर यह है कि यदि आप समान नियंत्रण से नियंत्रण में उपयोगकर्ता नियंत्रण का उपयोग कर रहे हैं तो नाम आपके नियंत्रण की पहचान नहीं करेगा और आपको एक त्रुटि मिलेगी "एक्स का उपयोग करें: उसी असेंबली में नियंत्रण के लिए नाम"। तो एक्स: नाम डब्ल्यूपीएफ में नामकरण नियंत्रण का डब्ल्यूपीएफ संस्करण है। नाम का उपयोग विनफॉर्म विरासत के रूप में किया जाता है। वे WPF में नियंत्रणों के नामकरण को अलग करना चाहते थे और Winforms के रूप में वे एक्सएमएल में विशेषताओं का उपयोग करने के लिए एक्सएम में इस्तेमाल किए गए अन्य असेंबली से नियंत्रण की पहचान करते थे: नियंत्रण के नामों के लिए।

बस ध्यान रखें कि इसे रखने के लिए सिर्फ एक नियंत्रण के लिए नाम न रखें क्योंकि यह स्मृति में एक रिक्त स्थान के रूप में रहता है और यह आपको चेतावनी देगा कि नाम नियंत्रण के लिए लागू किया गया है लेकिन इसका कभी भी उपयोग नहीं किया जाता है।


निर्दिष्ट x: नाम XAML संसाधित होने पर अंतर्निहित कोड में बनाए गए फ़ील्ड का नाम बन जाता है, और उस फ़ील्ड में ऑब्जेक्ट का संदर्भ होता है। सिल्वरलाइट में, प्रबंधित एपीआई का उपयोग करके, इस क्षेत्र को बनाने की प्रक्रिया एमएसबिल्ड लक्ष्य चरणों द्वारा की जाती है, जो एक्सएएमएल फ़ाइल और इसके कोड-बैक के लिए आंशिक कक्षाओं में शामिल होने के लिए जिम्मेदार भी होती है। यह व्यवहार जरूरी नहीं है कि एक्सएएमएल-भाषा निर्दिष्ट हो; यह विशेष कार्यान्वयन है कि सिल्वरलाइट x का उपयोग करने पर लागू होता है : इसके प्रोग्रामिंग और एप्लिकेशन मॉडल में नाम

एमएसडीएन पर और पढ़ें ...


मैं हमेशा एक्स: नाम संस्करण का उपयोग करता हूं। मुझे कोई जानकारी नहीं है कि यह किसी भी प्रदर्शन को प्रभावित करता है, मुझे निम्नलिखित कारणों से बस इतना आसान लगता है। यदि आपके पास अपने स्वयं के उपयोगकर्ता नियंत्रण हैं जो किसी अन्य असेंबली में रहते हैं तो बस "नाम" संपत्ति हमेशा पर्याप्त नहीं होगी। यह सिर्फ एक्स: नाम संपत्ति को चिपकाना आसान बनाता है।


ये एक ही चीज नहीं हैं।

x:Name एक xaml अवधारणा है, मुख्य रूप से संदर्भ तत्वों के लिए उपयोग किया जाता है। जब आप तत्व देते हैं x: नाम xaml विशेषता, "निर्दिष्ट x:Name xall संसाधित होने पर अंतर्निहित कोड में बनाए गए फ़ील्ड का x:Name बन जाता है, और उस फ़ील्ड में ऑब्जेक्ट का संदर्भ होता है।" ( MSDN ) तो, यह एक डिजाइनर से उत्पन्न क्षेत्र है, जिसमें डिफ़ॉल्ट रूप से आंतरिक पहुंच है।

Name एक FrameworkElement एलिमेंट की मौजूदा स्ट्रिंग प्रॉपर्टी है, जो xaml विशेषता के रूप में किसी भी अन्य wpf तत्व प्रॉपर्टी के रूप में सूचीबद्ध है।

नतीजतन, इसका मतलब है x:Name वस्तुओं की विस्तृत श्रृंखला पर उपयोग किया जा सकता है। यह किसी दिए गए नाम से संदर्भित xaml में कुछ भी सक्षम करने की तकनीक है।


वे दोनों एक ही बात हैं, बहुत सारे ढांचे के तत्व स्वयं नाम संपत्ति का पर्दाफाश करते हैं, लेकिन उन लोगों के लिए जो आप x: name का उपयोग नहीं कर सकते हैं - मैं आमतौर पर बस x: name के साथ चिपक जाता हूं क्योंकि यह सबकुछ के लिए काम करता है।

यदि नियंत्रण करना चाहते हैं तो नियंत्रण स्वयं को निर्भरता संपत्ति के रूप में उजागर कर सकते हैं (क्योंकि उन्हें आंतरिक रूप से उस निर्भरता संपत्ति का उपयोग करने की आवश्यकता है), या वे नहीं चुन सकते हैं।

एमएसडीएन में here और here अधिक जानकारी:

कुछ WPF फ्रेमवर्क-स्तरीय अनुप्रयोग x: नाम विशेषता के किसी भी उपयोग से बचने में सक्षम हो सकते हैं, क्योंकि फ्रेमवर्क एलिमेंट / फ्रेमवर्ककंटेंट एलिमेंट जैसे कई महत्वपूर्ण आधार वर्गों के लिए WPF नेमस्पेस के भीतर निर्दिष्ट नाम निर्भरता गुण इसी उद्देश्य को संतुष्ट करता है। अभी भी कुछ सामान्य एक्सएएमएल और ढांचे के परिदृश्य हैं जहां किसी नाम संपत्ति के साथ किसी तत्व को कोड एक्सेस आवश्यक है, विशेष रूप से कुछ एनीमेशन और स्टोरीबोर्ड समर्थन कक्षाओं में। उदाहरण के लिए, यदि आप उन्हें कोड से संदर्भित करना चाहते हैं, तो आपको XAML में बनाए गए समयरेखाओं और परिवर्तनों पर नाम निर्दिष्ट करना चाहिए।

यदि नाम कक्षा, नाम और एक्स पर किसी संपत्ति के रूप में उपलब्ध है: नाम को गुणों के रूप में एक दूसरे के रूप में उपयोग किया जा सकता है, लेकिन एक त्रुटि परिणामस्वरूप दोनों एक ही तत्व पर निर्दिष्ट हैं।


नाम :

  1. केवल फ्रेमवर्क एलिमेंट और फ्रेमवर्ककंटेंट एलिमेंट के वंशजों के लिए उपयोग किया जा सकता है;
  2. SetValue () और संपत्ति की तरह के माध्यम से कोड-पीछे से सेट किया जा सकता है।

एक्स: नाम :

  1. लगभग सभी एक्सएएमएल तत्वों के लिए इस्तेमाल किया जा सकता है;
  2. SetValue () के माध्यम से कोड-पीछे से सेट नहीं किया जा सकता है; इसे केवल ऑब्जेक्ट्स पर विशेषता वाक्यविन्यास का उपयोग करके सेट किया जा सकता है क्योंकि यह एक निर्देश है।

XAML में एक फ्रेमवर्क एलिमेंट या फ्रेमवर्ककंटेंट एलिमेंट के लिए दोनों निर्देशों का उपयोग करना अपवाद का कारण बनता है: यदि एक्सएएमएल मार्कअप संकलित है, अपवाद मार्कअप संकलन पर होगा, अन्यथा यह लोड पर होता है।







name-attribute