2009-03-03 9 views
42

मैं वर्तमान में Panel एस के साथ WPF में काम कर रहा हूं, और मैंने देखा है कि Width और Height गुणों के संबंध में, ActualWidth और ActualHeight नामक दो अन्य गुण भी हैं।डब्ल्यूपीएफ में चौड़ाई और वास्तविक दृष्टि के बीच क्या अंतर है?

ActualWidth

इस तत्व का गाया चौड़ाई हो जाता है। यह एक निर्भरता संपत्ति है। ( FrameworkElement से विरासत।)

Width

हो जाता है या तत्व की चौड़ाई निर्धारित करता है। यह एक निर्भरता संपत्ति है। (FrameworkElement से विरासत।)

संदर्भ: MSDN

किसी को भी बाहर बिंदु सकता है दो और जब या तो एक का उपयोग करने के बीच मतभेद?

उत्तर

62

Width/Height अनुरोध किया गया है या लेआउट आकार है। यदि आप ऑटो पर सेट करते हैं, तो जब आप पीछे कोड में संपत्ति तक पहुंचते हैं तो मान double.NaN होता है।

ActualWidth/ActualHeight आकार प्रदान किया गया है। यदि आप आइटम के वास्तविक आकार को चाहते/चाहते हैं, तो इस विशेषता का उपयोग करें।

+7

यह वास्तव में लेआउट आकार प्रदान नहीं किया गया आकार है। – chuckj

+2

@chuckj, प्रस्तुत आकार प्राप्त करने के लिए कोई विशेषता किस प्रकार उपयोग करेगी? – dumbledad

+0

@ डंबलड 'रेंडरसाइज। विथथ' – Mafii

3

ActualWidth प्रतिपादन प्रणाली द्वारा निर्धारित किया गया है, और अन्य तत्वों और समग्र आकार की बाधाओं की चौड़ाई के आधार पर भिन्न हो सकता है। नतीजतन, यह बदला नहीं जा सकता है। Width एक ऐसी संपत्ति है जिसे बदला जा सकता है, और तत्व की चौड़ाई बढ़ाने या घटाने के लिए उपयोग किया जाना चाहिए।

MSDN से:

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

0

यह बिल्कुल है, रेंडर चौड़ाई! = लेआउट चौड़ाई। एक का उद्देश्य लेआउट के लिए इस्तेमाल किया जाना है जिसका उद्देश्य दूसरे को प्रस्तुत करना है। यह WinForms के साथ, एक आकार और क्लाइंट आकार संपत्ति थी, थोड़ा अलग है और आपको प्रतिपादन के वास्तविक/ग्राहक आकार और लेआउट के लिए चौड़ाई/ऊंचाई का उपयोग करना चाहिए।

0

आप Width संपत्ति सेट कर सकते हैं, लेकिन ActualWidth संपत्ति नहीं।

Width संपत्ति का उपयोग यह निर्धारित करने के लिए किया जाता है कि पैनल कैसे प्रदान किया जाता है, तो ActualWidth उपयोग की जाने वाली वास्तविक चौड़ाई पर सेट होता है। यह चौड़ाई के समान मूल्य नहीं हो सकता है, इसके बाल तत्वों के आकार और उसके मूल तत्व से कसनाओं के आधार पर।

ActualWidthWidth संपत्ति सेट करते समय तुरंत सेट नहीं किया गया है, लेकिन प्रतिपादन के दौरान अपडेट किया जाएगा (एक या अधिक बार)।

7

ActualWidth मूल्य में पैडिंग के लिए खाते हैं इसलिए किसी भी समय आपको उस नंबर को जानने की आवश्यकता है जिसे आप चौड़ाई के बजाय Actualwidth पर कॉल कर सकते हैं और गणना से बच सकते हैं।

संपादित करें: हटाया गया मार्जिन बी/सी यह वास्तविक वाइड का हिस्सा नहीं है।

10

मुझे ActualWidth सबसे उपयोगी लगता है जब मैं एक तत्व की चौड़ाई या ऊंचाई को दूसरे में बांधना चाहता हूं।

इस साधारण उदाहरण में मेरे पास दो बटन हैं जो एक तरफ व्यवस्थित हैं और नीचे एक टिप्पणी स्टैकपैनल की चौड़ाई को बाध्य करती है जिसमें दो बटन होते हैं।

<StackPanel> 

    <StackPanel Margin="0,12,0,0" Orientation="Horizontal" Name="buttonPanel" HorizontalAlignment="Left" > 
     <Button Content="Yes - Arm the missile" FontWeight="Bold" HorizontalAlignment="Left"/> 
     <Button Content="No - Save the world" HorizontalAlignment="Left" Margin="7,0,0,0"/> 
    </StackPanel> 

    <TextBlock Text="Please choose whether you want to arm the missile and kill everybody, or save the world by deactivating the missile." 
       Width="{Binding Path=ActualWidth,ElementName=buttonPanel}" Margin="0,5,0,0" HorizontalAlignment="Left" TextWrapping="Wrap"/> 

</StackPanel> 
3

एक बहुत अच्छा कारण ActualWidth करने के लिए (जाहिर है ActualHeight तदनुसार) बाध्य करने के लिए उपयोग करने के लिए नहीं है। जब आप किसी तत्व के Width को ActualWidth पर सेट करते हैं तो आप लेआउट चेन तोड़ सकते हैं।

सर्वश्रेष्ठ मामले में माता-पिता (बाध्यकारी स्रोत) की लेआउट प्रक्रिया समाप्त होने के बाद आपके तत्व/नियंत्रण को पार्स किया जाना आवश्यक है। इसका मतलब अतिरिक्त समय है। यदि यह समान पदानुक्रम स्तर पर है, तो माता-पिता के रूप में लेआउट प्रक्रिया को एक निश्चित आकार की गणना करने के लिए दो रन (कम से कम) की आवश्यकता होती है।

<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding ActualWidth}" 
      Height="1" Fill="#000000"/> 

जब युक्त विंडो का आकार बदलने, नियंत्रण:

उदाहरण के लिए मैं एक नियंत्रण है जो इसे आकार संपत्ति एक शैली में अधिरोहित है कि यह TemplatedParent(ऐसा नहीं करते) करने के लिए सेट होता था कंटेनर को छोटे होने और लेआउट ब्रेक करने से रोक देगा। Width के लिए यह निर्धारित करना समस्या (करते हैं) हल होगा:

<Rectangle DockPanel.Dock="Top" Width="{TemplateBinding Width}" 
      Height="1" Fill="#000000"/> 

आप उपयोग करना सामान्य कुछ में ActualWidth अपने XAML साथ कुछ गड़बड़ है है। लेआउट रन के अंतिम आकार के साथ गड़बड़ करने की बजाए बेहतर सुधार करें।

+1

आपका कोड स्निपेट ("न करें" और "करें") बिल्कुल वही हैं?!? – PIntag

+0

टिप्पणी के लिए धन्यवाद। निश्चित है कि। – Pascal

+1

@ ट्यूनर मैं इस से असहमत हूं: "यदि आपको सामान्य रूप से वास्तविक विडथ का उपयोग करना है तो आपके xaml में कुछ गलत है"। 'वास्तविक विड्थ' (या 'वास्तविक हाइट') को बाध्य करने में कुछ भी गलत नहीं है, वास्तव में कुछ मामलों में यह किसी विशेष लेआउट समस्या को हल करने का सबसे आसान तरीका हो सकता है। सिर्फ इसलिए कि इन गुणों के लिए बाध्यकारी कारणों (दुर्लभ) अवसरों पर समस्याएं पूरी तरह से उनसे बचने का कोई कारण नहीं है। –

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