2010-06-07 10 views
12

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

यदि मुझे टेक्स्टब्लॉक में जाने वाला टेक्स्ट पता है , और मैं फ़ॉन्ट, इत्यादि जानता हूं, क्या कोई तरीका है कि मैं वास्तव में उन्हें प्रस्तुत किए बिना इन टेक्स्टब्लॉक की ऊंचाई की गणना या माप सकता हूं?

उत्तर

22

मुझे लगता है कि यह UIElement.Measure(Size) विधि को कॉल करने के लिए पर्याप्त होना चाहिए और बाद में UIElement.DesiredSize संपत्ति की जांच करें। अधिक जानकारी के लिए, प्रदत्त एमएसडीएन लिंक देखें।

+0

+1, लेकिन ध्यान दें सामान्य टाइपफेस और फ़ॉन्ट आकार के अलावा, वहाँ भी एक (विरासत में मिला है) संलग्न संपत्ति है कि [फ़ॉन्ट हिंट को प्रभावित करता है] (है कि http://blogs.msdn.com/b/text /archive/2009/08/24/wpf-4-0-text-stack-improvements.aspx) (चाहे पूरे पिक्सल को संरेखित करें या नहीं), और यह पाठ की चौड़ाई को प्रभावित करता है। संलग्न संपत्ति 'TextOptions.FormattingMode' है - सुनिश्चित करें कि जिस वस्तु को आप माप रहे हैं उस पर इस प्रॉपर्टी का मान उस ऑब्जेक्ट पर मान से मेल खाता है जो आप प्रस्तुत कर रहे हैं (यदि वे समान नहीं हैं)। – Cameron

+4

बस एक ही समस्या थी और बस 'textblock.Measure (नया आकार()) को कॉल करना; 'पर्याप्त मात्रा में। मुझे 'textblock.Measure (नया आकार (डबल। पॉजिटिव इंफिनिटी, डबल। पॉजिटिव इंफिनिटी)) का उपयोग करना था;' टेक्स्टब्लॉक के लिए परिणाम प्राप्त करने के लिए। डिस्कार्ड साइज ' – metacircle

+0

याद रखें, 'मिनविड्थ' को 0 पर सेट करने की आवश्यकता है, और 'मैक्सविड्थ' 'मापने से पहले सकारात्मक इन्फिनिटी पर सेट करें, अन्यथा यह उन मानों से कैप्चर किया जाएगा। – zmechanic

2

UIElement.Measure(Size) पर कॉल, Size पैरामीटर के रूप में लेता है। दूसरा कॉल UIElement.DesiredSize जो भी Size देता है, आप Measure विधि में पारित हो जाते हैं।

मुझे लगता है कि यह मामला है क्योंकि UIElement (TextBlock इस मामले में) किसी भी नियंत्रण (अभी तक) का बच्चा नहीं है और इसलिए DesiredSize के पास कुछ भी अलग होने का कोई कारण नहीं है।

+2

नहीं, जरूरी नहीं। UIElement (मेरे मामले में भी एक टेक्स्टब्लॉक) को मूल नियंत्रण में जोड़ने के बावजूद, वांछित आकार को पैरामीटर के रूप में पर्याप्त रूप से बड़े availabe आकार के साथ मापने के बाद सही ढंग से सेट किया गया था। – slurmomatic

0

मुझे खुशी है कि यह एक नहीं बल्कि पुराने सवाल है, लेकिन मैं ने पाया है कि निम्नलिखित कोड का उपयोग कर

 TextBlock textBlock = new TextBlock(); 
     textBlock.Text = "NR valve"; 
     Size msrSize = new Size(100, 200); 
     textBlock.Measure(msrSize); 
     Size dsrdSize = textBlock.DesiredSize; 

dsrdSize {47.05,15.96} के रूप में दिया जाता है। चाल यह अनुमानित वास्तविक आकार की तुलना में msrSize बड़ा बना रहा है। msrSize desiredSize() परिणाम के लिए एक सीमा के रूप में कार्य करता प्रतीत होता है। उदाहरण के लिए, msrSize = नया आकार (10, 10) का उपयोग करके, यहां {10,10} के dsrdSize में परिणाम मिलता है। उम्मीद है कि यह किसी की मदद करेगा।

0
public static Size ShapeMeasure(TextBlock tb) { 
    // Measured Size is bounded to be less than maxSize 
    Size maxSize = new Size(
     double.PositiveInfinity, 
     double.PositiveInfinity); 
    tb.Measure(maxSize); 
    return tb.DesiredSize; 
} 

public static Testit() 
{ 
    TextBlock textBlock = new TextBlock(); 
    textBlock.Text = "NR valve"; 

    Size text size = ShapeMeasure(textBlock); 
} 
संबंधित मुद्दे