2009-09-03 12 views
15

मैं एक WPF ऐप को सिल्वरलाइट में परिवर्तित कर रहा हूं।सिल्वरलाइट में कस्टम आकार (WPF से एप पोर्टिंग)

ऐप में एक वर्ग शामिल है जो आकार से विरासत में मिलता है। यह पथ वस्तु को वापस करने के लिए DefiningGeometry प्रॉपर्टी को ओवरराइड करता है। हालांकि, सिल्वरलाइट आकार वर्ग में DefiningGeometry प्रॉपर्टी नहीं है।

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

मैं मुख्य रूप से बैक-एंड डेवलपर हूं, इसलिए यह मेरा फोर्टे नहीं है - अगर मैं इसे प्राप्त करने के तरीके के बारे में कोई रूपरेखा नमूना दे सकता हूं तो मैं इसकी सराहना करता हूं।

+4

यदि आप मूल कक्षा पोस्ट करते हैं तो आपको अधिक प्रतिक्रिया मिल सकती है। फिर अन्य लोग इसे आपके लिए तुरंत लिख सकते हैं। शुभ लाभ। –

+0

यह Silverlight मंचों पर एक अनसुलझा समस्या है http://forums.silverlight.net/forums/p/39904/113634.aspx और यहां तक ​​कि Silverlight 4 में subclassing आकार का समाधान (http://blogs.msdn.com/b /nickkramer/archive/2009/12/03/subclassing-shape-or-more-accurately-path.aspx) DefiningGeometry संपत्ति समस्या के साथ मदद नहीं करता है। हमें इसके समाधान पर एक बक्षीस शुरू करना चाहिए। – Alain

उत्तर

16

आप एक वर्ग का उत्पादन करने में सक्षम नहीं होंगे जो उसी तरह काम करता है क्योंकि सिल्वरलाइट Shape बेस क्लास से प्राप्त कस्टम तत्वों के निर्माण का समर्थन नहीं करता है।

सिल्वरलाइट में कस्टम आकार बनाने के कारण असंभव है कि सिल्वरलाइट WPF की "दृश्य परत" साझा नहीं करता है। अगर आप पूरी तरह से समझना चाहते हैं कि आप जो कोशिश कर रहे हैं वह असंभव है, तो आपको यह समझने की जरूरत है कि यहां डब्लूपीएफ से सिल्वरलाइट कितना अलग है। (और यदि आपको परवाह नहीं है, तो अगले 2 अनुच्छेदों को छोड़ दें।)

WPF में, आप दो पूरी तरह से अलग-अलग स्तरों पर काम कर सकते हैं: दृश्य परत, या ढांचे परत। विजुअल लेयर की सेवाएं WindowsBase.dll और PresentationCore.dll द्वारा प्रदान की जाती हैं। यह मूल प्रतिपादन और इनपुट सेवाएं प्रदान करता है। लेकिन अगर आप स्टाइलिंग, डेटा बाध्यकारी, लेआउट, टेम्पलेटिंग जैसी चीजें चाहते हैं, तो आपको ढांचे की सेवाओं की आवश्यकता है, और ये प्रेजेंटेशनफ्रेमवर्क.dll द्वारा प्रदान की जाती हैं। आकार के प्रकार - Rectangle, Path, और इसी तरह - सभी ढांचे के प्रकार हैं - वे FrameworkElement से प्राप्त होते हैं और वे डेटा बाध्यकारी, लेआउट, एनीमेशन आदि का समर्थन करते हैं। लेकिन वे दृश्य परत के शीर्ष पर लागू होते हैं - यदि आप प्रतिबिंबक या आईएलडीएएसएम में Shape प्रकारों में से किसी एक को देखते हैं तो आप देखेंगे कि वे सभी OnRender विधि को ओवरराइड करते हैं, और यही वह जगह है जहां वास्तविक आकार परिभाषित कोड रहता है। (OnRender एक दृश्य परत फ़ंक्शन है।) और क्योंकि दृश्य परत पूरी तरह से समर्थित और प्रलेखित एपीआई है, इसलिए आप WPF में अपने स्वयं के आकार लिखने के लिए स्वतंत्र हैं - आप बिल्कुल वही कोड लिख सकते हैं जैसा आपको मिलेगा अंतर्निहित आकार कक्षाएं।

सिल्वरलाइट इस दृश्य/फ्रेमवर्क भेद को नहीं बनाता है - सिल्वरलाइट में, डब्ल्यूपीएफ की दृश्य परत अनिवार्य रूप से फ्रेमवर्क परत में गिर गई है।तो यदि आप रिफ्लेक्टर या आईएलडीएएसएम में आकृति प्रकार देखते हैं, तो आप देखेंगे कि उनमें OnRender विधि नहीं है, और वे लगभग खाली हैं। ऐसा इसलिए है क्योंकि सिल्वरलाइट में, आकार सभी अंतर्निहित हैं - प्लगइन Ellipse, Path, और अन्य सभी आकारों के लिए विशेष हैंडलिंग में अंतर्निहित है। तो सिल्वरिलघट में विस्तार के लिए आकृतियों का सेट खुला नहीं है। सिल्वरलाइट में ओवरराइड करने के लिए OnRender विधि नहीं है। तो आप सिल्वरलाइट में Shape से प्राप्त अपनी खुद की कस्टम क्लास नहीं लिख सकते हैं।

तो, या तो कस्टम Control या UserControl जाने का रास्ता होगा, मुझे डर है। हालांकि MouseEnter और MouseLeave को काम करने से रोकना नहीं चाहिए। क्या आपने वास्तव में पाया है कि वे काम नहीं करते हैं? या आप बस यह मान रहे हैं कि वे काम नहीं करेंगे?

+0

+1 आपके सिद्धांत को जानने के लिए, विशेष रूप से ऐसे प्रतिमानों के लिए जो इतने नए हैं। – Alain

+0

+1 उत्कृष्ट उत्तर – ColinE

+0

स्पष्टीकरण के लिए +1, -1 पूरी तरह से लंगड़ा विस्तार के लिए माइक्रोसॉफ्ट के लिए +1! –

0

क्या होगा यदि आपकी मौजूदा कक्षा को रखें, तो इसे कस्टमशैप कहें, जैसा कि कस्टमशैपकॉन्टेनर जैसे कुछ नियंत्रण से निहित है? CustomShapeContainer अनिवार्य रूप से केवल कस्टमशैप के चारों ओर एक रैपर होगा। फिर आप CustomShapeContainer में सीधे आने वाली सभी घटनाओं को कस्टमशैप में भेज सकते हैं और उसके बाद कंटेनर सामग्री के रूप में DefininingGeometry ऑब्जेक्ट को आकार वापस कर सकते हैं।

पहली नज़र में, यह कम से कम प्रतिरोध के मार्ग की तरह लगता है।

0

आपके पास सिल्वरलाइट में समान नामस्थान नहीं हैं। सिल्वरलाइट xaml WPF xaml का सबसेट है और वहां असेंबली हैं जिन्हें सिल्वेराइट में शामिल नहीं किया गया है। ये प्रौद्योगिकियां विभिन्न प्रकार के समाधानों के लिए हैं।

आपको फिर से शुरू करने की आवश्यकता हो सकती है। हालांकि, अगर आपने एमवीवीएम पैटर्न का उपयोग किया है, तो बहुत कम कोड है तो आप अपने व्यू मॉडेल, मॉडल और सेवाओं का पुनः उपयोग कर सकते हैं। हो सकता है कि संसाधन, शैली "जैसा है" का पुन: उपयोग करना ठीक रहेगा। लेकिन दृश्य: नया शुरू करें।

0

सिल्वरलाइट 3 से शुरू होने पर, Path नामक एक विशेष प्रकार का आकार होता है जो कि ज्यामिति प्रकार के Data को परिभाषित करता है। आपको मूल WPF कोड को पोर्ट करने में सक्षम होना चाहिए जिसने इस डेटा प्रॉपर्टी में ज्यामिति बनाई है।

+1

मुझे पता है कि आपके द्वारा लिंक किए गए एमएसडीएन आलेख में अन्यथा सुझाव दिया गया है, लेकिन शुरुआत से ही पथ सिल्वरलाइट में रहा है। –