我有一個寬度爲511,高度爲159的文本塊。字號= 28。如果文本超過文本塊的尺寸,我想更改字體大小,以便顯示所有文本。有沒有辦法做到這一點?一個公式可能?如果文本超出文本塊的邊界,則更改字體大小
回答
我不太確定WPF,但在WinForms中,您可以使用MeasureString方法來測量給定字體中的字符串尺寸。因此,每當文本塊的內容發生變化時,您只需使用此方法,並且文本的尺寸較大,然後文本塊的尺寸 - 再減小字體大小並再次測量。
(現在,我已經寫了這個之後,我覺得應該有這種更簡單的方法)
這要看你用什麼字體,比如宋體設計讓每個字符相同的寬度,所以如果你研究每個字符的寬度是多少,你可以使用字符串的get length函數(給出字符長度),然後從中計算出它的寬度(以像素爲單位)。如果寬度超過511px,則相應地調整大小。
如果您使用不同的Arial字體,您也可以做同樣的事情,如果您確實需要它,可以將字母組合成窄字母,如'i','l'等,中等字母如' t'和胖子字母'o'和首都。然後你可以得到一些窄的,中等的和粗體的字母,並根據這些數據計算出大小,但是對我個人而言,這太多了。
希望這有幫助。
編輯:忽略這一個,我剛剛閱讀了有關measurestring函數,這是一個比我的建議小得多的努力。
這是我想出的。一定要處理-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;
}
編輯:我應該在發佈之前查看標籤。不知道WPF可能會提供什麼解決方案。
我沒有任何證據來支持這一行動,但似乎(也可用於可變寬度字體,至少安裝在我的機器上所有的):
- 字體大小具有線性與給定的字符串
- 字體大小的寬度關係0的結果爲0
寬度這意味着你很可能在允許的最大字體大小使用MeasureString
一次,然後插值找到最佳字體大小。這個「線性道路」雖然有一些「像素顛簸」,所以你可能會有幾個像素 - 但它是度量循環的一個很好的選擇。
此解決方案意味着使用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。
而且這裏是一些例子
- 1. 更改超鏈接文本的大小
- 2. 如果文本長度超過兩行,Swift UITextView會更改字體大小
- 3. 更改字體大小以適合文本塊
- 4. CSS垂直文本:字體大小繼承和邊界半徑
- 5. GWT自動縮放文本字體大小以適合邊界
- 6. 如何在寫入文本文件時更改字體大小
- 7. 根據文本字體大小更改控件大小
- 8. 更改TextBox字體大小保持文本框大小(Height)
- 9. 自動更改字體大小以防止文本溢出
- 10. 在UIWebView中更改文本字體大小 - 如何設置文本的初始值字體大小
- 11. 如果文本大小增加,如何更改文本框大小(高度)?
- 12. 更改批處理文件中文本的字體和大小
- 13. 如何更改html中的文本框中的字體大小
- 14. 如何更改gw basic的字體和文本大小?
- 15. 如何更改textView文本程序的字體/大小/顏色?
- 16. 如何更改swift 2.2中pickerview中的文本/字體大小?
- 17. 如何更改UISegmentedControl上文本的字體大小?
- 18. 如何在我的文本視圖中更改字體大小
- 19. 如何更改javafx中的文本字體大小?
- 20. jquery對話框,更改文本字段的大小和字體
- 21. 文本塊邊距導致出界文字
- 22. 如果文本大小超過了字段邊界,如何在水晶報表中抑制字符串字段?
- 23. 如何更改自定義字體文本大小?
- 24. 如何從onchange()更改文本字體大小()
- 25. 如何以編程方式更改文本字體大小?
- 26. 使用xlswrite更改輸出中的字體大小和粗體文本
- 27. ExtJS4 - 更改TabPanel標題文本的字體大小
- 28. 更改特定文本的字體大小 - Python/Pygame
- 29. 更改整個頁面內容的文本字體大小
- 30. 我想更改文本流或標籤中的字體大小
我不想使用視框,因爲它縮小使得寬度小的文本塊。我想保留文本塊的尺寸,只是改變字體大小。 – patlimosnero
下面是一個使用TextRenderer.MeasureText的類似帖子:http://stackoverflow.com/questions/1453327/relation-between-length-and-font-size-of-a-string-and-width-of-a-textbox。 我不知道是否有一種方法來適應字體大小比例? – Josh
如果將您的TextBlock包裝在ScrollViewer中,然後在水平滾動條即將出現時處理事件。然後,您可以重新調整字體大小並取消顯示的滾動條。理論上...我還沒有檢查過這是否可能,但我會。 –