2012-06-17 4 views
10

मुझे WPF डिज़ाइन के मूलभूत सिद्धांतों के बारे में कुछ याद आ रहा है, लेकिन मैं सोच रहा था कि WPF नियंत्रणों पर कई गुणों को 'ऑब्जेक्ट' प्रकार के रूप में क्यों उजागर किया गया है?डब्ल्यूपीएफ में एक इंटरफ़ेस के बजाय 'ऑब्जेक्ट' में कई गुण क्यों हैं?

उदाहरण के लिए, MenuItem.Icon एक ऑब्जेक्ट है, और इसी तरह MenuItem.ToolTip है। लगभग पहली बार उपयोगकर्ता के रूप में, यह मेरे लिए बहुत भ्रमित था (ऐसा लगा कि मैं एक गतिशील प्रोग्रामिंग भाषा का उपयोग कर रहा था, इस बात का कोई अंदाजा नहीं था कि स्ट्रिंग प्रकार में टूलटिप सेटिंग भी काम करेगी या नहीं)। इसके अलावा, मैंने आइकन को 'System.Drawing.Icon' पर सेट करने का प्रयास किया और मुझे एक तर्क मिलता है "तर्क" चित्र का अपवाद एक तस्वीर होना चाहिए जिसे आइकन के रूप में उपयोग किया जा सकता है। " संपत्ति को टाइप नहीं किया जाना चाहिए ताकि कम से कम यह वर्णन कर सकें कि दुनिया में आपको क्या देना है?

ईमानदारी से, कारण के रूप में मेरा अनुमान यह है कि आप एक प्रकार के इंटरफेस को कार्यान्वित नहीं कर सकते जिसे आपने नहीं बनाया था (एक रैपर बनाने के बिना), लेकिन यह सिर्फ एक अनुमान है।

आपके उत्तरों और अंतर्दृष्टि के लिए बहुत बहुत धन्यवाद!

उत्तर

2

मेरी राय में मुख्य कारण यह है कि Object "नेट फ्रेमवर्क में सभी वर्गों का अंतिम आधार वर्ग" है। यह आपको लचीलापन देता है, डब्ल्यूपीएफ में आप एक पूर्वनिर्धारित प्रकार तक सीमित नहीं हैं। डब्ल्यूपीएफ अलग है और इसमें एक सीखने की वक्र है, लेकिन यह आपको अच्छा दिखने वाले उत्पाद को बनाने के लिए बहुत अधिक विकल्प प्रदान करता है।

यानी

आप एक टूलटिप के लिए किसी पाठ बॉक्स प्रदान कर सकते हैं:

TextBox tb = new TextBox(); 
tb.Text = "Hello World"; 
this.ToolTip = tb; 

एक बिटमैप

BitmapImage myBitmapImage = new BitmapImage(new Uri((@"C:\Temp\20100706.jpg"))); 
Image image = new Image(); 
image.Source = myBitmapImage; 
this.ToolTip = image; 

और एक MenuItem करने के लिए एक छवि बताए

BitmapImage myBitmapImage = new BitmapImage(new Uri((@"C:\Temp\20100706.jpg"))); 
Image image = new Image(); 
image.Source = myBitmapImage; 
menuItem1.Icon = image; 
+0

मुझे लगता है कि यह अच्छा है, लेकिन क्या ऑब्जेक्ट को यूआई तत्व का कोई प्रकार नहीं होना चाहिए? टेक्स्टबॉक्स और छवि दोनों फ्रेमवर्क एलिमेंट्स हैं। केवल एक चीज मैंने देखा है कि आप असाइन कर सकते हैं कि फ्रेमवर्क एलीमेंट एक स्ट्रिंग नहीं है ... क्या वास्तव में केवल एक चीज है? यदि ऐसा है तो ऐसा लगता है कि यह 'ऑब्जेक्ट' होने का एक अच्छा कारण नहीं है क्योंकि मैं अपने स्ट्रिंग के चारों ओर एक लेबल या रैपर बना सकता हूं। – Trevor

+0

@Rovert No, यह संपत्ति पर निर्भर करता है, अगर इसमें कोई दृश्य पहलू है और WPF के लिए इसे एक छवि में परिवर्तित करने का एक तरीका है तो यह दिखाया जाएगा। आप किसी वस्तु को * कुछ * असाइन कर सकते हैं। मेरा मानना ​​है कि यह [TypeConversion] (http://msdn.microsoft.com/en-us/library/aa970913.aspx) के उत्पाद द्वारा Xaml मार्कअप कार्य करने के लिए आवश्यक है। –

+0

TypeConversion के बारे में दिलचस्प बिंदु। यह वास्तव में बहुत अधिक समझ में आता है कि यह कैसे और कैसे तय करता है यह दिखा सकता है। उदाहरण के लिए, यह पता लगाने के लिए छविसोर्स को देखकर कि वे कैसे काम करते हैं, एक बड़ी भ्रम की ओर ले जाते हैं, लेकिन अब मुझे पता है कि दृश्यों के पीछे कुछ गतिशील व्यवहार होना चाहिए। धन्यवाद! – Trevor

1

पर विचार करेंउदाहरण के लिए। एक टूलटिप ContentControl है, जो में किसी भी प्रकार का सीएलआर (सामान्य भाषा रनटाइम) ऑब्जेक्ट (जैसे स्ट्रिंग या डेटटाइम ऑब्जेक्ट) या UIElement ऑब्जेक्ट (जैसे आयताकार या पैनल) हो सकता है। यह आपको बटन और चेकबॉक्स जैसे नियंत्रणों में समृद्ध सामग्री जोड़ने में सक्षम बनाता है।

इस कारण से, ToolTip जैसे तत्व Object के रूप में सामने आए हैं, जो प्रकार पदानुक्रम की जड़ है (परिणामस्वरूप उपयोग की आसानी, लचीलापन और स्पष्टता के साथ)।

0

कल्पना करें कि इन गुणों को UIElements (या कुछ अन्य WPF विशिष्ट ऑब्जेक्ट) के रूप में टाइप किया गया था। आप अपने नियंत्रण में ऑब्जेक्ट्स कैसे जोड़ेंगे जो UIElements नहीं थे?

आपको एक WPF ऑब्जेक्ट से प्राप्त एक रैपर प्रदान करना होगा जो आपको आवश्यक जानकारी का खुलासा करता है। अधिकांश समय रैपर को लिपटे ऑब्जेक्ट के ToString() पर कॉल करना होगा। अधिकांश प्रकार के रूप में देखकर आप ToString() का एक अच्छा पर्याप्त कार्यान्वयन प्रदान करेंगे, यह सब कुछ के लिए डेवलपर लिखने वाले रैपर बनाने के बजाय इसे कॉल करने के लिए समझ में आता है।

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

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

अंत में, याद रखें कि उस वस्तु के बीच एक अंतर है जो संपत्ति का प्रतिनिधित्व करता है और जिस तरह से डब्ल्यूपीएफ उस जानकारी को प्रस्तुत करता है। E.G. यदि आप सिस्टम जैसे एक आदिम प्रकार का उपयोग करते हैं। स्ट्रिंग, डब्ल्यूपीएफ एक टेक्स्टब्लॉक बनाएगा और ToString() के परिणामस्वरूप टेक्स्ट प्रॉपर्टी सेट करेगा। यह यूआई द्वारा प्रदर्शित डेटा के बीच एक बहुत ही साफ अलगाव की अनुमति देता है और वे यूआई द्वारा प्रदान करते हैं।

उदाहरण के लिए, एक साधारण वर्ग है कि एक मेनू आइटम का प्रतिनिधित्व करता लें:

public class MenuItem 
{ 
    public string Text { get; set; } 
    public bool IsChecked { get; set; } 
    public bool IsEnabled { get; set; } 
} 

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

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