サイズが511、高さ= 159のテキストブロックがあります。 FontSize = 28。すべてのテキストが表示されるように、テキストがテキストブロックのサイズを超えている場合は、フォントサイズを変更したいです。これを行う方法はありますか?数式は?テキストがテキストブロックの境界を超えた場合のフォントサイズの変更
答えて
私は実際WPFについてはわかりませんが、WinFormsではMeasureStringメソッドを使用して、指定されたフォントの文字列寸法を測定できます。したがって、テキストブロックの内容が変更されるたびに、このメソッドを使用するだけで、テキストのサイズがテキストブロックのサイズより大きい場合は、フォントサイズを小さくして再度測定します。
(私はこれを書いた後に、今、私はこのための簡単な方法があるはずだと思う)
それは、例えば、クーリエ新が各文字を有するように設計されて、あなたが使用するものフォントフェースに依存同じ幅なので、文字あたりの幅が何であるかを調べると、文字列の長さ関数(文字数を表す長さ)を取得し、その幅をピクセル単位で計算できます。幅が511pxを超える場合は、それに応じてサイズを調整します。
Arialのような別のフォントを使用すると、同じことをすることができますし、実際に正確にしたい場合は、アルファベットを 'i'、 'l'などのような狭い文字にグループ化し、 t '、大文字などの太字などがあります。次に、狭い、中位、太い文字の数を取得し、そのデータからサイズを計算しますが、個人的には、それはあまりにも多くのものです。
希望しました。
編集:これを無視して、私はちょうど私の提案よりもはるかに小さい努力をしています。
これは私が思いついたものです。 -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)を使用してほぼ同じ結果が得られます。 。
代わりの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>
利用可能なspacee、ありがとうWPF。
はまた、ここで私はそれが幅を作る小さなテキストブロックをズームアウトするのでViewBoxをを使用したくないいくつかの例
- 1. 長さが限界を超えた場合のブロック入力
- 2. insertRowsAtIndexPathsを使用する場合、空の配列の境界を超えるインデックス
- 3. NSArrayの境界を超えるインデックス4
- 4. マウスオーバー境界線をテキストブロック用のカスタムコントロール
- 5. ユーザーが特定の文字数を超えた場合の行の変更
- 6. log4net.Config.XmlConfigurator.Configure()は - "FileNotFoundExceptionがネイティブ/管理境界を超えました"
- 7. sifrテキストのフォントサイズを変更
- 8. カルチャー(言語)が変更された場合の動的フォントサイズ
- 9. 空の配列の境界を超えるインデックス '5'
- 10. 境界内のテキスト
- 11. ラベルがテキストを変更したときに、画像が画像ビューの境界を超えてしまうのはなぜですか?
- 12. Stackviewセルの境界を超えているカスタムコントロール
- 13. NSUserDefaultsで「境界3を超えるインデックス3」の問題
- 14. AutoLayout:子ビューは親ビューの境界を超えます
- 15. 画面の境界を超えて拡大するスピナー
- 16. NSArrayI objectAtIndex:]:インデックス7の境界を超えて[0 .. 6]
- 17. データポイントの限界を超えたPython fastKDE
- 18. FabricJs:オブジェクト境界がグリッドセルを超えて拡大
- 19. NetCDF:開始+カウントが次元境界を超えています
- 20. UWP InkCanvasが限界を超えた
- 21. 入力(type = text)要素のテキストがFireFoxの境界を超えているかどうかを検出
- 22. Excel - テキストが存在する場合は下部の境界線ですか?
- 23. UITextViewとUITextViewのUITextViewのテキストが1行を超えて拡大する場合
- 24. バックグラウンドスレッドの変数が変化し、インデックスが境界を超えてしまいます。swift ios
- 25. 境界線の幅を変更する
- 26. 値が100,000+を超えた場合のCintオーバーフローエラー
- 27. 変更のEditText境界線の色
- 28. z-indexホバーの境界線の変更
- 29. CSS - 境界線の半分だけが見える境界
- 30. Microsoft Wordのテキスト境界
です。私は、テキストブロックの寸法を保持し、フォントサイズを変更するだけです。 – patlimosnero
TextRenderer.MeasureTextを使用した同様の投稿があります:http://stackoverflow.com/questions/1453327/relation-between-length-and-font-size-string-and-width-of-a-textbox フォントサイズの比率にあわせる方法があるのだろうか? – Josh
TextBlockをScrollViewerにラップしてから、水平スクロールバーが表示される直前にイベントを処理する場合。次に、フォントのサイズを変更し、表示されるスクロールバーをキャンセルすることができます。理論的には...私はこれがまだ可能かどうかは確認していないが、私はそれを確認する。 –