2011-08-18 17 views
7

की सीमा से अधिक है तो मेरे पास चौड़ाई = 511, ऊंचाई = 15 9 के आयाम के साथ टेक्स्टब्लॉक है। FONTSIZE = 28। यदि टेक्स्ट टेक्स्टब्लॉक के आयाम से अधिक है तो मैं फ़ॉन्ट आकार बदलना चाहता हूं ताकि सभी टेक्स्ट प्रदर्शित किए जाएंगे। क्या इसे करने का कोई तरीका है? शायद एक सूत्र?टेक्स्ट टेक्स्ट बदलें यदि टेक्स्ट टेक्स्टब्लॉक

+0

मैं न, क्योंकि यह TextBlock चौड़ाई बनाने छोटे ज़ूम आउट ViewBox का उपयोग करना चाहते है। मैं टेक्स्टब्लॉक का आयाम रखना चाहता हूं और बस फ़ॉन्ट आकार बदलना चाहता हूं। – patlimosnero

+2

TextRenderer.MeasureText का उपयोग करके एक समान पोस्ट यहां है: http://stackoverflow.com/questions/1453327/relation-between-length-and-font-size-of-a-string-and-width-of-a-textbox। मुझे आश्चर्य है कि फ़ॉन्ट आकार अनुपात में रेट्रो-फिट करने का कोई तरीका है या नहीं? – Josh

+0

यदि आप अपने टेक्स्टब्लॉक को स्क्रॉलव्यूअर में लपेटते हैं और फिर क्षैतिज स्क्रॉलबार दिखाई देने वाला ईवेंट प्रबंधित करते हैं। फिर आप फ़ॉन्ट को फिर से आकार दे सकते हैं और स्क्रॉलबार को प्रदर्शित कर सकते हैं। सिद्धांत रूप में ... मैंने यह जांच नहीं की है कि यह अभी तक संभव है लेकिन मैं करूँगा। –

उत्तर

0

मैं वास्तव में डब्ल्यूपीएफ के बारे में निश्चित नहीं हूं, लेकिन WinForms में आप किसी दिए गए फ़ॉन्ट में स्ट्रिंग आयामों को मापने के लिए MeasureString विधि का उपयोग कर सकते हैं। इसलिए, जब भी टेक्स्टब्लॉक की सामग्री बदलती है, तो आपको बस इस विधि का उपयोग करने की आवश्यकता होती है और यदि पाठ के आयाम बड़े होते हैं तो टेक्स्ट ब्लॉक के आयाम - फ़ॉन्ट आकार को कम करें और फिर मापें।

(अब, के बाद मैं इस लिखा है, मुझे लगता है कि इस के लिए एक सरल तरीका होना चाहिए)

0

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

यदि आप एरियल जैसे किसी भिन्न फ़ॉन्ट का उपयोग करते हैं, तो आप वही कर सकते हैं और यदि आप वास्तव में इसे सटीक बनाना चाहते हैं, तो आप वर्णमाला को 'i', 'l' आदि जैसे संकीर्ण अक्षरों में समूहित कर सकते हैं और ' टी 'और' ओ 'और राजधानियों जैसे वसा पत्र। फिर आपको संकीर्ण, मध्यम और वसा अक्षरों की संख्या मिलती है और उस डेटा के आकार की गणना होती है, लेकिन व्यक्तिगत रूप से, यह मेरे लिए बहुत अधिक है।

आशा है कि यह सहायक होगा।

संपादित करें: इसे अनदेखा करें, मैंने बस मापने के कार्य के बारे में पढ़ा है, यह मेरे सुझाव से बहुत छोटा प्रयास है।

0

यहां मैं क्या आया हूं। सुनिश्चित करें कि आप -1.0 फ़ॉन्ट आकार के मामले को संभाल लें।

 private static double GetFontSize(TextBox textBox) 
     { 
     double fontSize = textBox.FontSize; 
     FormattedText ft = new FormattedText(textBox.Text, CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight, 
              new Typeface(textBox.FontFamily, textBox.FontStyle, textBox.FontWeight, textBox.FontStretch), 
              fontSize, textBox.Foreground); 
     while (textBox.Width < ft.Width) 
     { 
      fontSize -= 1; 
      if (fontSize < 0) return -1.0; 
      ft = new FormattedText(textBox.Text, CultureInfo.CurrentCulture, System.Windows.FlowDirection.LeftToRight, 
                 new Typeface(textBox.FontFamily, textBox.FontStyle, textBox.FontWeight, textBox.FontStretch), 
                 fontSize, textBox.Foreground); 
     } 

     return fontSize; 
     } 
0

संपादित करें: मुझे पोस्ट करने से पहले टैग देखना चाहिए। कोई हल नहीं है कि इसे हल करने के लिए डब्ल्यूपीएफ को क्या पेशकश करनी पड़ सकती है।

मैं इस का बैकअप लेने के लिए किसी प्रमाण की जरूरत नहीं है, लेकिन यह है कि (यह भी चर-चौड़ाई वाले फ़ॉन्ट के लिए, कम से कम मेरी मशीन पर स्थापित सभी वाले) लगता है:

  • अक्षरों का आकार एक रेखीय है एक दिया स्ट्रिंग
  • फ़ॉन्ट आकार की चौड़ाई के साथ संबंध 0 परिणाम 0

की चौड़ाई में इसका मतलब यह है कि आप शायद MeasureString एक बार सबसे बड़ा फ़ॉन्ट आकार की अनुमति पर इस्तेमाल कर सकते हैं, और फिर इष्टतम फ़ॉन्ट आकार को खोजने के लिए अंतर्वेशन ।

हालांकि "रैखिक सड़क" पर कुछ "पिक्सेल टक्कर" हैं, इसलिए आप कुछ पिक्सल बंद हो सकते हैं - लेकिन यह माप-लूप से एक अच्छा विकल्प है।

2

यह समाधान एक व्यूबॉक्स के उपयोग का तात्पर्य है, मुझे लगता है कि डब्लूपीएफ ट्रांसफॉर्मिंग सुविधाओं के साथ पाठ के फ़ॉन्ट आकार को बदलने की कोई आवश्यकता नहीं है, लगभग उसी परिणाम को परिवर्तन (और इस मामले में एक व्यूबॉक्स) का उपयोग करके प्राप्त किया जा सकता है। ।

के बजाय एक ViewBox के अंदर अपने TextBlock डाल, यह टेम्पलेट को संशोधित करने और नियंत्रण जहां पाठ एक ViewBox अंदर प्रकट होता है शब्दों में कहें, कुछ की तरह:

<ControlTemplate TargetType="{x:Type TextBox}">      
    <Microsoft_Windows_Themes:ListBoxChrome x:Name="Bd" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}" RenderFocused="{TemplateBinding IsKeyboardFocusWithin}" SnapsToDevicePixels="true"> 
     <Viewbox HorizontalAlignment="Left"> 
      <ScrollViewer x:Name="PART_ContentHost" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/> 
     </Viewbox> 
    </Microsoft_Windows_Themes:ListBoxChrome> 

    <ControlTemplate.Triggers> 
     <Trigger Property="IsEnabled" Value="false"> 
      <Setter Property="Background" TargetName="Bd" Value="{DynamicResource {x:Static SystemColors.ControlBrushKey}}"/> 
      <Setter Property="Foreground" Value="{DynamicResource {x:Static SystemColors.GrayTextBrushKey}}"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

अब आप एक नियंत्रण आकार है कि यह में फिट करने के लिए पाठ है मिल उपलब्ध स्पेस, धन्यवाद WPF।

इसके अलावा यहाँ कुछ उदाहरण

text example

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