2011-04-20 20 views
34

के बिना डब्ल्यूपीएफ वास्तुकला में, मुझे लगता है कि डब्ल्यूपीएफ बहुत अद्भुत है। आम तौर पर, मैं अंतर्निहित प्रतिपादन/एनीमेशन आंतरिक कार्यकलापों का एक बड़ा प्रशंसक हूं। टेम्पलेटिंग और स्टाइल सेट अप की लचीलापन बहुत प्रभावशाली है।एक्सएएमएल

लेकिन मैं एक्सएएमएल से नफरत करता हूं - मुझे लगता है कि यह कई चीजों को जटिल बनाता है। मैंने इसे बड़े और छोटे अनुप्रयोगों पर उपयोग किया है और मैंने खुद को XAML में कुछ करने का तरीका जानने का प्रयास किया है जिसके लिए अंतर्निहित सिद्धांत मूलभूत है लेकिन वाक्यविन्यास quirky है। इतना ही नहीं, लेकिन मैंने कई बार सोचा है कि पार्सिंग/बाध्यकारी के कुछ हिस्सों कितने भारी हैं। (मुझे पता है कि यह संकलित है, लेकिन मुझे यकीन नहीं है कि रनटाइम पर अभी भी कितना मूल्यांकन किया जाता है)

एक्सएएमएल दृश्य वृक्ष के निर्माण और लोड करने का एक ही तरीका है। क्या गैर-एक्सएमएल, कोड-आधारित (लेकिन अभी भी काफी हद तक घोषणात्मक) तरीके में दृश्य पेड़ के निर्माण को सरल बनाने के लिए कोई ढांचा है? विशेष रूप से, मैं चौखटे कि निम्न समस्याओं में से किसी भी कम है जबकि एक MVVM दृष्टिकोण को बनाए रखना में दिलचस्पी रखता हूँ:

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

  2. तेज बाध्यकारी, गैर -INotifyPropertyChanged बाइंडिंग। ऐसा लगता है कि BindableProperty<T> के किसी प्रकार की तरह बनाया जा सकता है और बाध्यकारी सभी ViewModel संपत्ति परिवर्तन प्राप्त करने के बजाय सीधे सुन सकता है। और एक स्ट्रिंग तर्क बनाम प्रत्यक्ष कॉलबैक का उपयोग भी फायदेमंद प्रतीत होता है।

  3. संसाधन प्रबंधन के लिए एक अलग दृष्टिकोण; फिर, कुछ प्रकार के दृढ़ता से टाइप किए गए शब्दकोश बहुत अच्छे हो सकते हैं। मैं शैलियों को दृढ़ता से टाइप किए गए पहलू को पकड़ने के लिए लैम्बडा या कुछ के रूप में देखना चाहता हूं।

सारांश में, किसी भी चौखटे है कि गैर XAML हैं आधारित, MVVM के साथ अच्छी तरह से फिट है, और दृढ़ता से लिखे जाते हैं?

+0

जावाएफएक्स के साथ एक सप्ताहांत व्यतीत करें और वापस न देखें। – sproketboy

उत्तर

5

Desclaimer - मुझे xaml पसंद है। मुझे लगता है कि यूआई तकनीक के साथ होने वाली सबसे अच्छी बात है..वैसे..मैं "विनफॉर्म" कहना चाहता था लेकिन वास्तव में चूसा - इसलिए इतिहास की शुरुआत!

मुझे इस नए और बेहतर ढांचे से अपनी आवश्यकताओं को तोड़ने करते हैं:

  1. जोरदार टाइप किया बाइंडिंग - हालांकि मैं इस बात से सहमत है कि यह विशिष्ट करने के लिए कुछ सेटिंग्स एक जोरदार टाइप किया तरह से बाध्यकारी में उपयोगी हो सकता है, मैं अक्सर इस तथ्य का उपयोग करके खुद को ढूंढें कि बाध्यकारी बहुत उपयोगी होने के लिए पूरी तरह से ढीला है। गुणों की रनटाइम खोज Xaml और बाध्यकारी तंत्र की एक अविश्वसनीय रूप से शक्तिशाली संपत्ति है। मेरे अनुभव में आप बाध्यकारी समस्याओं को ढूंढने और ठीक करने के लिए बहुत तेज़ी से सीखते हैं, और रनटाइम त्रुटियां बहुत विस्तृत हैं। यह आदर्श नहीं हो सकता है - लेकिन यह बहुत अच्छा है।
  2. तेज़ बाध्यकारी - performance, अधिकांश स्थितियों के लिए काफी तेज़ है। चरम मामलों में प्रदर्शन को बेहतर बनाने के लिए आप हमेशा आईसी कस्टम टाइप टाइपस्क्रिप्टर प्रदान कर सकते हैं। उस बंडेबल संपत्ति के लिए कॉलबैक के साथ - किसी प्रकार के Dependency Property के बारे में कैसे? (मुझे लगता है कि वाक्यविन्यास कुछ हद तक कमी है)। हालांकि, अधिकांश उपयोगों के लिए मुझे पर्याप्त होने के लिए INotifyPropertyChanged इंटरफ़ेस मिला। बाध्यकारी तंत्र केवल इस तथ्य की परवाह करता है कि एक बदलाव आया था, और यह इसके वर्तमान रूप में बहुत अच्छी तरह से काम करता है। आप इस बात की परवाह क्यों करते हैं कि फ्रेमवर्क इस समस्या को हल करता है - जब तक यह अच्छी तरह से काम करता है?
  3. संसाधन शब्दकोश - यह एक अन्य कार्यान्वयन मुद्दा है जो ज्यादातर ढांचे को प्रभावित करता है और यह आंतरिक कार्य करता है। आप परवाह क्यों करते हैं कि उन्हें कैसे लागू किया जाता है? वे बहुत अच्छी तरह से काम करते हैं।

मुझे संदेह है कि आप Xaml में हल और हल की जाने वाली समस्याओं को हल करने के लिए कोडबेइंड का उपयोग कर सकते हैं। जो आपको इन विभिन्न मुद्दों को हल करने के ढांचे के तरीके के बारे में बताता है, और जिसे मुझे लगभग कभी भी डब्ल्यूपीएफ में सौदा नहीं करना पड़ा था। "जीयूआई चीजें" और "आपके कोड हैं जो चीजें" के बीच Xaml द्वारा प्रदान किया गया स्पष्ट पृथक्करण कोड के उपयोग से यूआई में हस्तक्षेप करना कठिन बनाता है। लेकिन एक्सएमएल का उपयोग करके इन समाधानों को हल करने के लिए डब्ल्यूपीएफ कई अलग-अलग तंत्र प्रदान करता है।

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

+0

वहां कुछ अच्छे विचार हैं। प्रदर्शन पर लिंक के लिए धन्यवाद - मैं ईमानदारी से उन नंबरों को पसंद नहीं करता जो मैंने वहां देखा था। मुझे थोड़ा और स्पष्ट रूप से निर्दिष्ट करने दें: मैं निश्चित रूप से कोड और यूआई के स्पष्ट पृथक्करण को संरक्षित करना चाहता हूं। आखिरकार, मुझे लगता है कि आप UI के लिए एक .cs फ़ाइल बनायेंगे और आप कुछ LINQ-syntax-esque फैशन में दृश्य पेड़ का निर्माण करेंगे और आपके पास XAML के साथ अपेक्षा की तरह कोई और कोड नहीं होगा। मैंने जटिल यूआई कार्यों को कोड-बैक के बिना पूरा करने के लिए कस्टम नियंत्रण और व्यवहार लिखे हैं। इसे लाने के लिए धन्यवाद - उम्मीद है कि मैं वहां किसी भी गलतफहमी को साफ़ कर सकता हूं। –

+0

@Trana J - मैं अपने व्यंग्यात्मक स्वर के लिए क्षमा चाहता हूं, मैं हास्य प्रभाव के लिए जा रहा था :) मैं आपकी बात समझता हूं, लेकिन मैं अभी भी आपके आधार से असहमत हूं। मैंने Winforms कोड में हेरफेर करने में पर्याप्त समय बिताया, और मैंने जावा में कुछ गुई कोड लिखा है जो आपको उन संरचनाओं को बनाने के लिए अधिक स्वतंत्रता और नियंत्रण देता है - और मैं यह मानता हूं कि xaml का मूल रूप अपने लक्ष्यों को बहुत अच्छी तरह से स्वीकार करता है। उपकरण अभी तक पर्याप्त नहीं हैं, अच्छे ऑटो-पूर्ण समर्थन, असली जेनेरिक समर्थन आदि 'बहुत जरूरी हैं। लेकिन यह एक नया ढांचा है जो गति उठा रहा है। नई सुविधाओं को हर समय जोड़ा जा रहा है। – NightDweller

+0

कौन जानता है - दृढ़ता से टाइप किए गए गुण केवल कोने के आसपास हो सकते हैं। मैं सचमुच सोचता हूं कि जिस तरह से आप यूआई, स्टाइल, डेटा बाध्यकारी, तर्क और परिवर्तन को अलग कर सकते हैं, मैंने उपयोग किए गए अन्य ढांचे के मुकाबले आश्चर्यजनक रूप से अच्छी तरह से हासिल किया था। मुझे लगता है कि आपको लगता है कि वास्तव में आपकी अवधारणा को वैचारिक वाक्यविन्यास में डालने से जटिलता और असुविधा की दीवार बहुत तेज हो जाएगी क्योंकि यूआईएल के लिए नियमित कोड कभी अनुकूलित नहीं किया गया था। – NightDweller

1

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

यहां कुछ सुझाव दिए गए हैं अपने अनुभव में सुधार करें।
1. एक्सएएमएल से निपटने के लिए सीखें (मैं इसके गले से भी नफरत करता था, लेकिन अब जब मैं इसका उपयोग करता हूं)
2. अपनी खुद की लाइब्रेरी बनाएं जो यूआई के निर्माण को आपके लिए आसान बनाता है, कोड में । आखिरकार, एक्सएएमएल में जो कुछ भी किया जाता है, वह कोड में भी किया जा सकता है।
3. यदि आप वास्तव में INotifyPropertyChanged से नफरत करते हैं, और इसके बजाय कॉलबैक चाहते हैं तो इसके बजाय निर्भरता प्रॉपर्टी का उपयोग करें। आपके लिए कोई घटना नहीं बढ़ाना, और आपके पास कॉलबैक और डिफ़ॉल्ट मान हो सकते हैं!
4.) WPF का उपयोग न करें। भले ही आप कहते हैं कि आप वास्तुकला से प्यार करते हैं, आपकी कमियों/वांछित 'सुधार' की सूची में लगभग सभी शामिल हैं।

0
> non-INotifyPropertyChanged binding. 

करने के लिए मैन्युअल रूप से अपने viewmodell में INotifyPropertyChanged लागू करने या मॉडल काफी मैनुअल/repitative बहुत काम है। इस परियोजना (Pocos) सादा पुराना CLR वस्तुओं का उपयोग कर मॉडल देखें ViewModel (MVVM) वास्तु पैटर्न लागू करने के लिए, जबकि का पूरा लाभ उठा एक तरीका प्रदान करना है: हालांकि मैं इन विकल्प

  • DynamicViewModel: MVVM using POCOs with .NET 4.0 के बारे में पढ़ा .NET 4.0 डायनामिक ऑब्जेक्ट क्लास। .NET 4.0 और डायनामिक ऑब्जेक्ट क्लास का लाभ उठाते हुए, हम डायनामिक ऑब्जेक्ट क्लास से प्राप्त एक प्रकार बना सकते हैं और रन टाइम पर गतिशील व्यवहार निर्दिष्ट कर सकते हैं। इसके अलावा, हम डेटा बाध्यकारी के लिए एक अच्छा उम्मीदवार बनाते हुए व्युत्पन्न प्रकार पर INotifyPropertyChanged इंटरफ़ेस को कार्यान्वित कर सकते हैं।

  • Update Controls .NET: डब्लूपीएफ और सिल्वरलाइट डेटा बिना किसी जानकारी के बाध्यकारी।यह निर्भरता को स्वचालित रूप से खोजता है ताकि आपको उन्हें अपने व्यू मॉडल में प्रबंधित न करना पड़े। और यह Winforms के साथ काम करता है। घटनाओं का उपयोग कर कोड के माध्यम से बांधें।

  • notifypropertyweaver: आईएल बुनाई (http://www.mono-project.com/Cecil के माध्यम से) गुण में INotifyPropertyChanged कोड इंजेक्षन करने के लिए उपयोग करता है।

    • कोई गुण आवश्यक
    • कोई संदर्भ नहीं की आवश्यकता
    • कोई आधार वर्ग की आवश्यकता
    • का समर्थन करता है .net 3.5, .net 4, सिल्वरलाइट 3, सिल्वरलाइट 4 और विंडोज फोन 7
    • ग्राहक प्रोफ़ाइल मोड का समर्थन करता है
+0

कूल प्रोजेक्ट्स - लेकिन वे सभी इनोटिओप्रोपर्टी को लागू करते हैं, हुड के नीचे किसी भी रूप में आकार या रूप में बदल दिया जाता है। मैं प्रति ऑब्जेक्ट श्रोता की बजाय प्रति संपत्ति श्रोता के करीब कुछ ढूंढ रहा हूं। धन्यवाद! –

22

मैं Xaml मुक्त WPF में आप समर्थन करते हैं। मुझे डब्ल्यूपीएफ की लेआउट और बाइंडिंग क्षमताओं से प्यार है लेकिन मुझे एक्सएएमएल से भी नफरत है। मैं प्यार होता है कि WPF में सादा सी # लिखा जा सकता है, कुछ फायदे:

  • वस्तु और संग्रह initializers Xaml instantiations बदल सकते थे। (यह एक दयालु बात है कि xaml बटन ऊपर से ऊपर-नीचे पसंद करता है)।
  • बाइंडिंग कन्वर्टर्स सिर्फ लैम्ब्डा हो सकता है।
  • शैलियाँ केवल लैम्ब्डा हो सकता है जो तत्कालता के बाद किसी ऑब्जेक्ट को संशोधित करता है, <Setter> सिंटैक्स कोई फूला हुआ नहीं है।
  • DataTemplates सिर्फ lambdas है कि एक वस्तु
  • DataTemplateSelectors सिर्फ एक DataTemplate लैम्ब्डा है कि अन्य DataTemplates कॉल किया जाएगा दिए गए नियंत्रण बनाने के लिए होगा।
  • आइटम नियंत्रण केवल एक ऐसा पूर्वानुमान होगा जो लैम्ब्डा (डेटा टेम्पलेट) लेता है और अंतर्निहित संग्रह में कोई नया आइटम जोड़ा जाता है तो इसे फिर से कॉल करता है।
  • x: नाम केवल परिवर्तनीय नाम होंगे।
  • कोई ज़रूरत नहीं कई MarkupExtensions
    • एक्स के लिए: स्टेटिक
    • एक्स: (! विशेष रूप से जटिल जेनरिक भी साथ) प्रकार
  • UserControls सिर्फ कार्यों होगा।

मुझे लगता है कि WPF में इसे बहुत अधिक जटिलता जोड़ा गया था ताकि इसे डिज़ाइन किया जा सके। फ्रंट डेवलपमेंट टू रेजर के पुराने दिनों से वेब विकास पहले ही इस लड़ाई को खो चुका है।

+2

आप और मैं इस पर बहुत समान सोच रहे हैं। मैंने सोचा कि आपको इन विचारों में से कुछ के लिए दिलचस्प खेल मैदान मिल सकता है (लेकिन शायद बहुत उपयोगी नहीं)। मैंने websockets के लिए फ्लेक का उपयोग करने और कैनवास में कुछ सरल प्रतिपादन करने के साथ खिलौना किया। इसे https://bitbucket.org/jtrana/crimson/ पर ढूंढें। मुझे सरल बाइंडिंग, मूल नियंत्रण या दो, और एक टेक्स्ट बॉक्स पर थोड़ा सा काम करने के साथ एक बुनियादी ढांचा मिल गया। सबकुछ के सुंदर बेवकूफ कार्यान्वयन, लेकिन लैम्ब्डा-आधारित बाइंडिंग इत्यादि का प्रयास करने के लिए मजेदार है। बस परियोजना शुरू करें और क्रिमसन/संचार में क्लाइंट.html खोलें। –

3

इस प्रश्न को निश्चित रूप से Bling UI Toolkit के लिंक की आवश्यकता है। यह एपीपी और डब्ल्यूपीएफ के शीर्ष पर समृद्ध यूआई प्रोटोटाइप के लिए एक सुपर-प्रतिभा उच्च स्तरीय पुस्तकालय है। button.Width = 100 - slider.Value के साथ बाध्यकारी, इस तरह की एनीमेशन: button.Left.Animate().Duration(500).To = label.Right, एक पिक्सेल शेडर कंपाइलर - अद्भुत।

अफसोस की बात है, मुझे नहीं लगता कि परियोजना अब और काम कर रही है।लेकिन विचार के लिए कुछ खाना देने के लिए बहुत सारे स्मार्ट विचार।

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

  • कोई संबंधित समस्या नहीं^_^