2016-05-18 7 views
1

テキストを表示するのにFormattedTextを使用しています。私は、提供されたオプションごとにテキストを水平に整列させる必要があります。 "MaxTextWidth"プロパティを設定するまでは、すべてがうまく動作します(単語のトリミングにはこれが必要です)。単語トリミングを有効にしてテキストを整列させるにはどうすればよいですか?MaxTextWidthが設定されているときにWPFの単語の配置に問題が発生する

FormattedText formatted_text = new FormattedText(
      text, System.Globalization.CultureInfo.GetCultureInfo("en-US"), 
      FlowDirection.LeftToRight, 
      typeface, em_size, brush); 
    formatted_text.TextAlignment = TextAlignment.Right; 
    drawingContext.DrawText(formatted_text, origin); 

これは、期待どおりにコードを整列して正しく動作します。しかし、私は単語w.r.t MaxTextWidthをトリムする必要があります。 MaxTextWidthを設定する際に問題が発生します。 MaxTextWidthを計算するにはどうすればよいですか?

画像内の点が原点です。

これは私が私が私がMaxTextWidthを計算しますので、私はトリミングを揃えることができますどのように= 100

MaxTextWidthを設定するときMaxTextWidth

これを設定してはいけないときに私が得るものです文?

編集:追加もっとスクリーンショット Before setting MaxTextWidth, properly aligned

enter image description here

私はワードアライメントを失う設定した後MaxTextWidth、適切に整列、 を設定する前に、それはある

+0

これは 'MaxTextWidth'を原点のX座標に追加されていることを奇妙な行動です。あなたは最も長い単語の幅を計算しますか? – VV5198722

+0

MaxTextWidthを最も長い単語の幅に設定すると、ここで問題が解決されますか? – Joga

+0

私はあなたが解決したい問題を理解しようとしています。あなたはあなたの質問を編集し、正確に希望するアライメントを記述できますか? – VV5198722

答えて

1

を示す基準点をWRT見ます奇妙な振る舞い DrawingContext.DrawText そのMaxTextWidth は、originFormattedTextが右揃えで、MaxTextWidth = 0の場合、つまりデフォルトのDrawTextは、 のテキストを原点の左に置きます。 MaxTextWidth > 0の場合、DrawTextは原点のテキストを置きます。

したがって、 と中央に置かれている場合は、右に揃えている場合は、をorigin.Xから引く必要があります。ここに例があります。青い点は欲しい原点で、赤い点は補正されています。 DrawText origin example

using System.Windows; 
using System.Windows.Media; 

public void DrawTextTest(DrawingContext dc) { 
    var y = 100.0; 
    foreach (var align in new TextAlignment[]{ 
     TextAlignment.Left, TextAlignment.Center, TextAlignment.Right}) { 
     foreach (var width in new double[] { 0.0, 150.0 }) { 
      DrawText(dc, new Point(400, y), align, width); 
      y += 25.0; 
     } 
     y += 45.0; 
    } 
} 

private void DrawText(DrawingContext dc, Point origin, 
    TextAlignment align, double maxTextWidth) { 
    var f = new FormattedText(
     "This is a text with TextAlignment = " + align.ToString() 
      + " and MaxTextWidth = " + maxTextWidth.ToString() + ".", 
     System.Globalization.CultureInfo.CurrentCulture, 
     FlowDirection.LeftToRight, 
     new Typeface("Arial"), 12.0, Brushes.Black 
    ) { 
     TextAlignment = align, 
     MaxTextWidth = maxTextWidth 
    }; 

    dc.DrawEllipse(Brushes.Blue, null, origin, 1.0, 1.0); 
    var correctionX = -maxTextWidth * (align == TextAlignment.Right ? 1.0 
     : (align == TextAlignment.Center ? 0.5 : 0.0)); 
    origin.Offset(correctionX, 0.0); 
    dc.DrawEllipse(Brushes.Red, null, origin, 1.0, 1.0); 
    dc.DrawText(f, origin); 
} 
+0

おい、あなたの答えは私の問題を解決した、ありがとう!要するにこれは私が必要としていたすべてのものでした:** MaxTextWidthをorigin.Xから右揃えに、そして半分を中心に**から差し引かなければなりません。 – luizfelippe

関連する問題