2012-02-29 13 views
14

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

<Canvas> 
    <Line X1="0cm" X2="3cm" Y1="1cm" Y2="3cm" Stroke="Black"/> 
</Canvas> 

हालांकि, आप इन मानों को बाध्य नहीं कर सकते हैं। कल्पना कीजिए कि हमारे पास आयाम संपत्ति वाला व्यूमोडल है जो एक स्ट्रिंग है, उदाहरण के लिए "7 सेमी"। निम्नलिखित काम नहीं करेंगे:

<Button Width="{Binding Dimension}">Test</Button> 

स्वरूप अपवाद फेंक दिया जाता है। इसी प्रकार, जब में कोड-पीछे एक FrameworkElement, इस तरह बनाने:

Canvas1.Children.Add(new Button() { Width = "3cm", Content = "Test"}); 

संकलन में विफल रहता है क्योंकि अपवाद/निर्माता में फेंक दिया जाता है जहाँ भी आप नियंत्रण बनाने की कोशिश।

मुझे आश्चर्य है:

  • यह स्वाभाविक इकाइयों (मेरे मामले मीट्रिक में - सेंटीमीटर) उपयोग करना संभव है में कोड-पीछे?
  • कैसे?
  • क्या WPF/XAML इकाइयों की एक पूरी सूची है?

संपादित करें:

यहाँ नीचे टिप्पणी से एक लिंक है, जो इस सवाल को हल करता है:)

http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.width.aspx

उत्तर

13

आप कोड में यह कर सकते हैं के पीछे एक ही रूपांतरण XAML-पार्सर का उपयोग करता लगाने से, आप अगर तुम तार के आसपास गुजर कोई आपत्ति नहीं है इस तर्क reimplement की जरूरत नहीं है:

button.Width = (double)new LengthConverter().ConvertFrom("2cm"); 

XAML-पार्सर TypeConverters का उपयोग करता documentation page of the Width property में, जरूरत मूल्यों के तार कन्वर्ट करने के लिए आप देख सकते हैं कि यह एक TypeConverterAttribute है कि निर्दिष्ट करने कि एक LengthConverter इस्तेमाल किया जाना चाहिए। इस विशेषता का उपयोग स्थानीय रूप से ओवरराइड करने के लिए किया जा सकता है कि संपत्ति को कैसे संभाला जाना चाहिए, लेकिन इसे कक्षा स्तर पर भी लागू किया जा सकता है, इसलिए यदि Employee कक्षा में यह विशेषता निर्दिष्ट है कि EmployeeConverter का उपयोग किया जाना चाहिए तो कनवर्टर प्रकार के गुणों के लिए डिफ़ॉल्ट होगा Employee

मैं थोड़ा बाध्यकारी इस प्रकार कनवर्टर लागू नहीं होता है, लेकिन एक IValueConverter अंदर इसे का उपयोग काफी सरल हो सकता है, वास्तव में आप इसे अच्छी तरह से सामान्य बनाने के लिए एक markup extension जो एक प्रकार कनवर्टर से एक IValueConverter निर्माण करती बना सकते हैं हैरान हूँ।

+0

यही वह है जिसे मैं ढूंढ रहा था, धन्यवाद! –

+0

आपका स्वागत है, मदद करने में खुशी :) –

2

1 के लिए और 2) DIPs डिवाइस स्वतंत्र हैं क्योंकि, आप कर सकते हैं बिना किसी समस्या के किसी भी "प्राकृतिक इकाई" की गणना करें। अपवाद (अप्राकृतिक :) डिवाइस निर्भर पिक्सल हैं।

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

3 के लिए) और कार्यान्वयन: मैंने जल्दी से गुमराह किया है और कुछ भी नहीं मिला है, लेकिन शायद एक गहरी खोज कुछ दिखाएगी। अन्यथा, अपना स्वयं का कनवर्टर बनाना बहुत कठिन नहीं होना चाहिए। यहाँ कुछ रूपांतरण जानकारी:

96DIP == 1inch == 2.54cm; 
1cm == 37.8DIP; 
1zoll == 1inch == 2.54cm; 
+0

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

+1

@Aaron: मैं मौजूदा तत्वों का भी उपयोग करना पसंद करता हूं, हालांकि प्रत्येक कनवर्टर के लिए मैंने Google से पूछा, मुझे कक्षा का नाम जल्दी से मिला है। लेकिन इस विशिष्ट मामले में, Google को बताने के लिए कुछ भी नहीं था। Wpf में प्रयुक्त कनवर्टर का पता लगाने के लिए, मैं मदद नहीं कर सकता। मैंने कभी भी एफसीएल में गहराई से खोला नहीं। हो सकता है कि यह एक समर्पित प्रश्न के लायक है: एक विशिष्ट रूपांतरण के लिए डब्ल्यूपीएफ द्वारा कौन सा ValueConverter उपयोग किया जाता है इसका पता लगाने के लिए कैसे? – HCL

+0

आपके उत्तर के लिए धन्यवाद। मैं अपने आप पर एक सही कनवर्टर लगाने की कोशिश करूंगा और संभवतः एक नया प्रश्न पूछूंगा यदि मैं असफल रहता हूं। एक बार फिर धन्यवाद! –

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