WPF

2009-03-10 8 views
17

में पाठ मापना WPF का उपयोग करके, बड़ी संख्या में छोटे तारों को मापने का सबसे प्रभावी तरीका क्या है? विशेष रूप से, मैं प्रत्येक स्ट्रिंग की प्रदर्शन ऊंचाई निर्धारित करना चाहता हूं, वर्दी स्वरूपण (समान फ़ॉन्ट, आकार, वजन, आदि) और अधिकतम चौड़ाई स्ट्रिंग पर कब्जा कर सकता है?WPF

+1

एक ही सवाल कुछ बेहतर समाधान मिल गया: http://social.msdn.microsoft.com/Forums/en-US/wpf/

return new Size(TextBlock.ActualWidth, TextBlock.ActualHeight); 

पूरा कोड इस तरह दिखता है थ्रेड/ए 450b0aa-7086-4145-9eff-a779571b6187/ – srgstm

उत्तर

12

सबसे कम-स्तरीय तकनीक (और इसलिए रचनात्मक अनुकूलन के लिए सबसे अधिक दायरा देना) ग्लाइफ्रन्स का उपयोग करना है।

यह बहुत अच्छी तरह से प्रलेखित नहीं लेकिन मैं यहाँ एक छोटे से उदाहरण ऊपर लिखा है:

http://smellegantcode.wordpress.com/2008/07/03/glyphrun-and-so-forth/

उदाहरण यह प्रतिपादन से पहले एक आवश्यक कदम के रूप में स्ट्रिंग की लंबाई बाहर काम करता है।

3

आप ऊंचाई और चौड़ाई पाने के लिए एक गाया पाठ बॉक्स पर DesiredSize संपत्ति का उपयोग कर सकते

using System.Windows.Threading; 

... 

Double TextWidth = 0; 
Double TextHeight = 0; 
... 

MyTextBox.Text = "Words to measure size of"; 
this.Dispatcher.BeginInvoke(
    DispatcherPriority.Background, 
    new DispatcherOperationCallback(delegate(Object state) { 
     var size = MyTextBox.DesiredSize; 
     this.TextWidth = size.Width; 
     this.TextHeight = size.Height; 
     return null; 
    } 
) , null); 

आप तार की एक बड़ी संख्या में यह ऊंचाई और हर की चौड़ाई पहले पूर्व calualte जल्दी हो सकता है है, तो एक दिए गए फ़ॉन्ट में indiviudal अक्षर और प्रतीक, और फिर स्ट्रिंग वर्णों के आधार पर एक गणना करते हैं। कर्नाई आदि के कारण यह 100% एक्यूरेट नहीं हो सकता है

5

यह फ़ॉर्मेटेड टेक्स्ट श्रेणी द्वारा बहुत ही सरल और किया गया है! इसे आज़माएं।

+0

स्वरूपित टेक्स्ट यूनिवर्सलविंडोज़ में उपलब्ध नहीं है, मेरी मदद करें! –

5

WPF में:

() DesiredSize संपत्ति पढ़ने से पहले TextBlock पर उपाय कॉल करने के लिए याद रखें।

तो TextBlock ऑन-द-मक्खी बनाया गया था, और अभी तक नहीं दिखाया, तो आप उपाय() कॉल करने के लिए पहले, इसलिए की तरह है:

MyTextBlock.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity)); 

return new Size(MyTextBlock.DesiredSize.Width, MyTextBlock.DesiredSize.Height); 

सिल्वरलाइट में:

मापने की कोई जरूरत नहीं है।

public Size MeasureString(string s) { 

    if (string.IsNullOrEmpty(s)) { 
     return new Size(0, 0); 
    } 

    var TextBlock = new TextBlock() { 
     Text = s 
    }; 

#if SILVERLIGHT 
    return new Size(TextBlock.ActualWidth, TextBlock.ActualHeight); 
#else 
    TextBlock.Measure(new Size(Double.PositiveInfinity, Double.PositiveInfinity)); 

    return new Size(TextBlock.DesiredSize.Width, TextBlock.DesiredSize.Height); 
#endif 
} 
MSDN मंचों पर
संबंधित मुद्दे