2010-04-07 20 views
41

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

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

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

आप

उत्तर

68

Adorners सबसे प्रयोजनों के लिए ControlTemplates का उपयोग कर की तुलना में थोड़ा अधिक काम की आवश्यकता होती है धन्यवाद। यदि आप अतिरिक्त कार्यक्षमता चाहते हैं जो सजावट प्रदान करते हैं, तो उनका उपयोग करें। अन्यथा ControlTemplates का उपयोग करें।

  1. क्योंकि adorners एक अलग परत पर हैं, दृश्य सजी तत्व से बाहर भी कर सकते हैं, भले ही सजी तत्व काटा जाता है:

    यहाँ मुख्य विशेषताएं इस प्रकार है कि Adorners मेज पर लाने के लिए कर रहे हैं।

  2. क्योंकि adorners एक अलग परत पर हैं, वे आम तौर पर AdornedElement के कंटेनर से या भाई नियंत्रण के कारण अस्पष्ट नहीं कर रहे हैं।
  3. Adorners स्वचालित रूप से आकार और सजी तत्व के स्थान में सभी परिवर्तनों के बारे में सूचित कर रहे हैं, प्रतिक्रियाओं परिवर्तन है कि के रूप में आसानी साधारण नियंत्रण के साथ हासिल नहीं कर रहे हैं लेआउट करने की इजाजत दी।
  4. एडॉर्नर्स पैनलों और मौजूदा नियंत्रणों पर उनके टेम्पलेट्स में बदलाव किए बिना या अन्यथा लागू किया जा सकता है। यह उन्हें मनमाने ढंग से नियंत्रण पर हेरफेर हैंडल या दृश्य प्रतिक्रिया प्रदान करने के लिए अच्छा बनाता है।
  5. कई परिदृश्यों में आप केवल सैकड़ों या हजारों में से कुछ "सक्रिय" वस्तुओं के लिए सजावट करेंगे। ControlTemplates का उपयोग कर ही कार्यक्षमता को लागू करने में नाटकीय रूप से कम कुशल आप टेम्पलेट के लिए एक अतिरिक्त पैनल को जोड़ने के लिए है, तो हो सकता है: टेम्पलेट के हर एक instatiation, अतिरिक्त पैनल होगा, जबकि सिर्फ एक adorner होगा।

    1. आप और adorner
    2. आप चाहिए के जीवनकाल का प्रबंधन करने के .GetAdornerLayer() कॉल करने के लिए कोड लिखना चाहिए .Add() और:

    यहां संभावित adorners का उपयोग कर के साथ जुड़े लागत से कुछ के रूप में करने का विरोध किया ControlTemplates हैं या तो अपने एडॉर्नर के लिए प्रतिपादन कोड लिखें या Control को एडॉर्नर के बच्चे के रूप में शामिल करने के लिए कोड जोड़ें ताकि आप इसके साथ एक कंट्रोल टेम्पलेट का उपयोग कर सकें

  6. आप आमतौर पर अपने कस्टम उपाय/कोड में गणना की व्यवस्था करेंगे ई (जब तक आप अपने adorner के भीतर एक ControlTemplate उपयोग कर रहे हैं)
  7. आप AdornedElement को RoutedEvents अग्रेषित करने के लिए की आवश्यकता होगी अगर आप चाहते हैं उन्हें लक्ष्य नियंत्रण द्वारा नियंत्रित किया जा करने के लिए
  8. आप एक DataContext="{Binding AdornedElement.DataContext}" जोड़ने के लिए अगर आप चाहते हैं की आवश्यकता होगी भर में
  9. ऐसा लगता है कि दिखाई adorner हर लेआउट पास पर स्कैन किया जाता है, तो परदे पर एक बार में ध्यान देने योग्य मंदी में परिणाम कर सकते adorners कई हजारों होने DataContext लाने के लिए।
  10. Having more than 144 adorners is not supported (साधारण दृश्यों केवल उनके उपाय है/जब कुछ है कि उन्हें सीधे प्रभावित करता है बदल जाता है कहा जाता है कोड की व्यवस्था।), इसलिए नियंत्रण टेम्पलेट्स वहाँ इस सीमा के करीब होने का कोई खतरा है, तो अधिक उपयुक्त हैं।

आपके विशेष उदाहरणों में, कोई स्पष्ट-सही सही उत्तर नहीं हैं।

  • मैं कनेक्शन अंक के लिए एक ControlTemplate का उपयोग कर जब से तुम शायद कनेक्शन अंक के स्थानों को निर्दिष्ट करने के लिए एक तरह से की आवश्यकता होगी की ओर झुक चाहते हैं, और ControlTemplate पहले से ही लेआउट स्वयं आइटम को परिभाषित किया गया है। दूसरी तरफ, यदि कनेक्शन बिंदु जानकारी डेटा संचालित होती है और केवल सक्रिय नियंत्रण (या नियंत्रण को खींचने पर) पर दिखाई देती है तो प्रदर्शन लाभ प्राप्त करने और व्यक्तिगत नियंत्रण टेम्पलेट को सरल बनाने के लिए सजावट का उपयोग करना बेहतर हो सकता है।

  • एक स्वचालित रूप से स्थित लेबल एक एडॉर्नर के लिए एक माप/व्यवस्थित गणना बिंदु की व्यवस्था करने के लिए एक अच्छा फिट हो सकता है यदि लाइनें कुछ भी सरल सीधी रेखाएं हैं, लेकिन यदि आपके पास संभावित रूप से दस हजार दृश्य दिखाई देंगे I प्रदर्शन के बारे में चिंतित होगा।

आपके आवेदन के बारे में अधिक जानने के बिना इसे और अधिक कहना मुश्किल है।

+3

बहुत बहुत धन्यवाद, यह एक अच्छा और पूरा जवाब है। एप्लिकेशन एक यूएमएल डिजाइनर है, इसलिए मुझे नहीं लगता कि मेरे पास बहुत सारे कनेक्शन होंगे; वैसे भी, आमतौर पर वे सीधे लाइन नहीं हैं। – fra

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