2011-08-18 9 views
7

サイズが511、高さ= 159のテキストブロックがあります。 FontSize = 28。すべてのテキストが表示されるように、テキストがテキストブロックのサイズを超えている場合は、フォントサイズを変更したいです。これを行う方法はありますか?数式は?テキストがテキストブロックの境界を超えた場合のフォントサイズの変更

+0

です。私は、テキストブロックの寸法を保持し、フォントサイズを変更するだけです。 – patlimosnero

+2

TextRenderer.MeasureTextを使用した同様の投稿があります:http://stackoverflow.com/questions/1453327/relation-between-length-and-font-size-string-and-width-of-a-textbox フォントサイズの比率にあわせる方法があるのだろうか? – Josh

+0

TextBlockをScrollViewerにラップしてから、水平スクロールバーが表示される直前にイベントを処理する場合。次に、フォントのサイズを変更し、表示されるスクロールバーをキャンセルすることができます。理論的には...私はこれがまだ可能かどうかは確認していないが、私はそれを確認する。 –

答えて

0

私は実際WPFについてはわかりませんが、WinFormsではMeasureStringメソッドを使用して、指定されたフォントの文字列寸法を測定できます。したがって、テキストブロックの内容が変更されるたびに、このメソッドを使用するだけで、テキストのサイズがテキストブロックのサイズより大きい場合は、フォントサイズを小さくして再度測定します。

(私はこれを書いた後に、今、私はこのための簡単な方法があるはずだと思う)

0

それは、例えば、クーリエ新が各文字を有するように設計されて、あなたが使用するものフォントフェースに依存同じ幅なので、文字あたりの幅が何であるかを調べると、文字列の長さ関数(文字数を表す長さ)を取得し、その幅をピクセル単位で計算できます。幅が511pxを超える場合は、それに応じてサイズを調整します。

Arialのような別のフォントを使用すると、同じことをすることができますし、実際に正確にしたい場合は、アルファベットを 'i'、 'l'などのような狭い文字にグループ化し、 t '、大文字などの太字などがあります。次に、狭い、中位、太い文字の数を取得し、そのデータからサイズを計算しますが、個人的には、それはあまりにも多くのものです。

希望しました。

編集:これを無視して、私はちょうど私の提案よりもはるかに小さい努力をしています。

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)を使用してほぼ同じ結果が得られます。 。

    代わりの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をを使用したくないいくつかの例

    text example

    関連する問題