5

ページがあり、その上にFixedDocument配置したいのですが、高さがページに収まらない場合があります。 そのため、 generated withから行を取得し、高さに合わせて new を作成してページに配置したいと考えています。私有財産を持っているということは、ラッピング後にそれを持っていることを意味し、どうにかしてそれを手に入れることができます。ランで 作成する:TextBlockTextblock
TextBlockTextWrappingTextBlock
TextBlockLineCountTextLines
TextBlock

public TextItem(PageType pageType, Run[] runs, Typeface typeFace, double fontSize)
        : base(pageType)
{
     this.TextBlock = new TextBlock();
     this.TextBlock.Inlines.AddRange(runs);
     if (typeFace != null)
          this.TextBlock.FontFamily = typeFace.FontFamily;

     if (fontSize > 0)
           this.TextBlock.FontSize = fontSize;
     this.TextBlock.TextWrapping = TextWrapping.Wrap;   //wrapping
}

TextBlockテキストによる作成:

public TextItem(PageType pageType, String text, Typeface typeFace, double fontSize)
        : base(pageType)
{
    if (typeFace == null || fontSize == 0)
        throw new Exception("Wrong textitem parameters");

    this.TextBlock = new TextBlock();
    this.TextBlock.Text = text;
    this.TextBlock.FontFamily = typeFace.FontFamily;
    this.TextBlock.FontSize = fontSize;
    this.TextBlock.TextWrapping = TextWrapping.Wrap;
    this.TextBlock.TextAlignment = TextAlignment.Justify;

    this.TypeFace = typeFace;
}

幅を に設定しTextBlockて取得DesiredSize:

this.TextBlock.Width = document.CurrentPage.Content.ActualWidth;
this.TextBlock.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));
4

1 に答える 1

2

私はまったく同じ問題に直面し、しばらくの間、希望を失い、これに対する解決策はないと思っていました.
しかし、私は間違っていました。それには多くの解決策があります (少なくとも 3 つ) 。その
とおりです。そのうちの 1 つはLineCountリフレクションを使用してプロパティを使用します。
そしてそれを使用する2番目は、行を取得するための独自のアルゴリズムです。
そして、私が好む3番目は、あなたが望む結果を得るための非常にエレガントな方法を持っています.

この質問を参照して、この 3 つの回答を確認してください。
TextWrapping プロパティに従って TextBlock の行を取得しますか?


これが最良の解決策のコピーです(私の意見では)

public static class TextUtils
{
    public static IEnumerable<string> GetLines(this TextBlock source)
    {
        var text = source.Text;
        int offset = 0;
        TextPointer lineStart = source.ContentStart.GetPositionAtOffset(1, LogicalDirection.Forward);
        do
        {
            TextPointer lineEnd = lineStart != null ? lineStart.GetLineStartPosition(1) : null;
            int length = lineEnd != null ? lineStart.GetOffsetToPosition(lineEnd) : text.Length - offset;
            yield return text.Substring(offset, length);
            offset += length;
            lineStart = lineEnd;
        }
        while (lineStart != null);
    }
}
于 2015-10-20T08:21:43.677 に答える