2011-08-18 37 views
7

我有一個寬度爲511,高度爲159的文本塊。字號= 28。如果文本超過文本塊的尺寸,我想更改字體大小,以便顯示所有文本。有沒有辦法做到這一點?一個公式可能?如果文本超出文本塊的邊界,則更改字體大小

+0

我不想使用視框,因爲它縮小使得寬度小的文本塊。我想保留文本塊的尺寸,只是改變字體大小。 – 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

如果將您的TextBlock包裝在ScrollViewer中,然後在水平滾動條即將出現時處理事件。然後,您可以重新調整字體大小並取消顯示的滾動條。理論上...我還沒有檢查過這是否可能,但我會。 –

回答

0

我不太確定WPF,但在WinForms中,您可以使用MeasureString方法來測量給定字體中的字符串尺寸。因此,每當文本塊的內容發生變化時,您只需使用此方法,並且文本的尺寸較大,然後文本塊的尺寸 - 再減小字體大小並再次測量。

(現在,我已經寫了這個之後,我覺得應該有這種更簡單的方法)

0

這要看你用什麼字體,比如宋體設計讓每個字符相同的寬度,所以如果你研究每個字符的寬度是多少,你可以使用字符串的get length函數(給出字符長度),然後從中計算出它的寬度(以像素爲單位)。如果寬度超過511px,則相應地調整大小。

如果您使用不同的Arial字體,您也可以做同樣的事情,如果您確實需要它,可以將字母組合成窄字母,如'i','l'等,中等字母如' t'和胖子字母'o'和首都。然後你可以得到一些窄的,中等的和粗體的字母,並根據這些數據計算出大小,但是對我個人而言,這太多了。

希望這有幫助。

編輯:忽略這一個,我剛剛閱讀了有關measurestring函數,這是一個比我的建議小得多的努力。

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

編輯:我應該在發佈之前查看標籤。不知道WPF可能會提供什麼解決方案。

我沒有任何證據來支持這一行動,但似乎(也可用於可變寬度字體,至少安裝在我的機器上所有的):

  • 字體大小具有線性與給定的字符串
  • 字體大小的寬度關係0的結果爲0

寬度這意味着你很可能在允許的最大字體大小使用MeasureString一次,然後插值找到最佳字體大小。這個「線性道路」雖然有一些「像素顛簸」,所以你可能會有幾個像素 - 但它是度量循環的一個很好的選擇。

2

此解決方案意味着使用ViewBox,我認爲使用Wpf轉換功能不需要更改文本的字體大小,使用轉換(和本例中的ViewBox)幾乎可以實現相同的結果, 。

而不是把你的TextBlock一個視框裏面,修改它的模板,並把其中的文字出現視框內部的控制,是這樣的:

<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> 

現在你得到確定其大小的文本,可安裝在控制可用的spacee,謝謝WPF。

而且這裏是一些例子

text example

相關問題