2012-06-23 36 views
19

बीच क्या अंतर है?</p> <pre><code><Style TargetType="{x:Type Border}"> </code></pre> <p>और:

<Style TargetType="Border"> 

कब और क्यों मैं {x:Type …} उपयोग करने के लिए की जरूरत है?

+1

+1 अच्छा प्रश्न। मेरा अनुमान है कि दूसरा एक नया, बेहतर नोटेशन है। – McGarnagle

+3

समान पुराने SO प्रश्न - http://stackoverflow.com/questions/1085730/difference-between-targettype-controltype-and-targettype-xtype-controltype/9128422#9128422 और http://stackoverflow.com/questions/ 5449481/प्रदर्शन-भिन्न-बीच-लक्ष्य-sometype-and-target-xtype-sometype/9127377 # 9127377 – akjoshi

उत्तर

11

प्रभाव में कोई अंतर नहीं है; दोनों ही मामलों में TargetType संपत्ति typeof(Border)

पहले संस्करण {x:Type Border} WPF के पहले संस्करण में की जरूरत थी क्योंकि संकलक एक प्रकार वस्तु में स्ट्रिंग परिवर्तित करने के लिए TypeConverter वर्ग का उपयोग नहीं किया पर सेट हो जाएगा और आपके द्वारा निर्दिष्ट करने के लिए आवश्यक TypeExtension कक्षा आपके लिए ऐसा करने के लिए।

दूसरा संस्करण पेश किया गया था, अगर मुझे सही ढंग से याद है, सिल्वरलाइट के साथ और जल्दी ही डब्ल्यूपीएफ कंपाइलर के लिए अपना रास्ता मिल गया।

संपादित

TypeConverter वर्ग पर मेरे धारणा गलत था; इस FrameworkElementFactory द्वारा कार्यान्वित किया जाता:

से the documentation:

प्रकार गुण है कि समर्थन TypeName के रूप में स्ट्रिंग

WPF तकनीकों के प्रकार के प्रकार कुछ गुण का मान निर्दिष्ट करने को सक्षम का समर्थन करता है एक्स की आवश्यकता के बिना: टाइप मार्कअप एक्सटेंशन उपयोग करें। इसके बजाय, आप मान को एक स्ट्रिंग के रूप में निर्दिष्ट कर सकते हैं जो प्रकार का नाम है। इसके उदाहरण हैं ControlTemplate.TargetType और Style.TargetType। इस व्यवहार के लिए समर्थन के माध्यम से प्रदान नहीं किया गया है या तो कनवर्टर्स या मार्कअप एक्सटेंशन टाइप करें। इसके बजाए, यह फ्रेमवर्क एलिमेंट फैक्टरी के माध्यम से लागू स्थगित व्यवहार है।

सिल्वरलाइट एक समान सम्मेलन का समर्थन करता है। वास्तव में, सिल्वरलाइट वर्तमान में अपने एक्सएएमएल भाषा समर्थन में {x: Type} का समर्थन नहीं करता है, और कुछ शर्तों के बाहर {x: Type} उपयोग स्वीकार नहीं करता है जो WPF-Silverlight XAML माइग्रेशन का समर्थन करने के इरादे से हैं। इसलिए, टाइपनाम-ए-स्ट्रिंग व्यवहार सभी सिल्वरलाइट देशी संपत्ति मूल्यांकन के लिए अंतर्निहित है जहां एक प्रकार मान है।

1

दोनों बिल्कुल समान हैं। किसी भी मामले में आपकी शैली केवल Border पर लागू होगी।

2

x:Key के साथ स्टाइल को निर्दिष्ट किए बिना इस संपत्ति को सेट करने के लिए इस प्रॉपर्टी (TargetType) को सेट करने के लिए शैली को सभी सीमा तत्वों पर लागू करने की अनुमति मिलती है। लेकिन जब आप x:Key से {x:Type Border} पर सेट करते हैं, तो इसका अर्थ यह है कि यदि आप Stylex:Key{x:Type Border} के अलावा किसी अन्य चीज़ का मान देते हैं, तो Style स्वचालित रूप से सभी सीमा तत्वों पर लागू नहीं होगा। इसके बजाय, आपको सीमा तत्वों को शैली को स्पष्ट रूप से लागू करने की आवश्यकता है।

4

हालांकि दिए गए उदाहरण में यह कोई फर्क नहीं पड़ता है लेकिन वास्तव में x:Type और TypeName-as-String के बीच अंतर है।

मैं हाल ही में एक स्थिति है जिसमें पता चलता है कि x:Type से TypeName-as-String अलग है जब यह कस्टम प्रकार की बात आती है सामना करना पड़ा। मेरे अनुभव से -

x:Type मजबूत नाम या विधानसभा के संस्करण (जिसमें प्रकार रहता है), लेकिन नहीं TypeName-as-String समझता है।

मैं अपने ब्लॉग यहाँ मेरे परिदृश्य और अन्य विवरण के बारे में समझा दिया है -

Importance of specifying AncestorType with x:Type in RelativeSourceBinding

इस से

अलावा, वहाँ भी कैसे WPF प्रकार infers में अंतर है। x:TypeTypeExtension का उपयोग किया जाता है, जबकि TypeName-as-StringFrameworkElementFactory का उपयोग किया जाता है (जैसा कि एर्नो का उल्लेख है)।

0

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

एक्स का गुण मान: कुंजी XamlName व्याकरण में परिभाषित कोई स्ट्रिंग हो सकता है या एक मार्कअप एक्सटेंशन के माध्यम से मूल्यांकन किया जा सकता है। WPF से एक उदाहरण के लिए "WPF उपयोग नोट्स" देखें।

एक अभिभावक तत्व के बाल तत्व जो आईडीआईआरआई कार्यान्वयन है, में आम तौर पर एक एक्स शामिल होना चाहिए: कुंजी विशेषता जो उस शब्दकोश के भीतर एक अद्वितीय कुंजी मान निर्दिष्ट करती है। फ्रेमवर्क एक्स के लिए विकल्प के लिए एलियाज्ड कुंजी गुणों को कार्यान्वित कर सकते हैं: विशेष प्रकारों पर कुंजी; ऐसे गुणों को परिभाषित करने वाले प्रकारों को DictionaryKeyPropertyAttribute के साथ जिम्मेदार ठहराया जाना चाहिए।

कोड निर्दिष्ट करने के बराबर कोड x: कुंजी वह कुंजी है जिसका उपयोग अंतर्निहित IDictionary के लिए किया जाता है। उदाहरण के लिए, एक एक्स: कुंजी जो WPF में किसी संसाधन के लिए मार्कअप में लागू होती है, संसाधन संसाधन के कुंजी पैरामीटर के मान के बराबर होती है। जब आप कोड में WPF ResourceDictionary में संसाधन जोड़ते हैं तो जोड़ें। एक्स: टाइप मार्कअप एक्सटेंशन में सी # में टाइपऑफ() ऑपरेटर या माइक्रोसॉफ्ट विजुअल बेसिक में GetType ऑपरेटर के लिए एक समान कार्य है।

एक्स: टाइप मार्कअप एक्सटेंशन टाइप प्रकार लेने वाले गुणों के लिए एक स्ट्रिंग रूपांतरण व्यवहार प्रदान करता है। इनपुट एक एक्सएएमएल प्रकार है। इनपुट एक्सएएमएल प्रकार और आउटपुट सीएलआर प्रकार के बीच का रिश्ता यह है कि एक्सएएमएल स्कीमा संदर्भ और IXamlTypeResolver सेवा के आधार पर आवश्यक XamlType को देखने के बाद आउटपुट प्रकार इनपुट XamlType का अंतर्निहित प्रकार है।

.NET Framework XAML सेवाओं में, इस मार्कअप एक्सटेंशन के लिए हैंडलिंग टाइपएक्स्टेंशन क्लास द्वारा परिभाषित किया गया है।

विशिष्ट रूपरेखा कार्यान्वयन में, कुछ गुण जो मान के रूप में टाइप करते हैं, प्रकार के नाम को सीधे (नाम प्रकार का स्ट्रिंग मान) स्वीकार कर सकते हैं। हालांकि, इस व्यवहार को लागू करना एक जटिल परिदृश्य है। उदाहरण के लिए, "WPF उपयोग नोट्स" अनुभाग देखें जो निम्नानुसार है।

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

एक्स: टाइप मार्कअप एक्सटेंशन ऑब्जेक्ट तत्व वाक्यविन्यास में उपयोग किया जा सकता है। इस मामले में, TypeName प्रॉपर्टी के मान को निर्दिष्ट करने के लिए एक्सटेंशन को सही तरीके से प्रारंभ करना आवश्यक है।

एक्स: प्रकार मार्कअप एक्सटेंशन वर्बोज विशेषता के रूप में भी उपयोग किया जा सकता है; हालांकि यह उपयोग सामान्य नहीं है:

+4

यदि आप एक परीक्षण की प्रतिलिपि बनाते हैं तो आपको एक लिंक देना चाहिए और/या क्रेडिट देना चाहिए। –

+0

Ctrl + C, Ctrl + V पता चला :) –

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