WPF TextBlock获取行后的文本置换



我有FixedDocument页,我想把TextBlock放在它上面,但它可以是Textblock不适合页面的高度。
所以我想用TextWrapping从生成的TextBlock中取行,然后创建新的TextBlock,按高度匹配并将其放在页面上。
TextBlockLineCount私有属性,这意味着包装后它有TextLines,我可以以某种方式获得它。
创建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, text:

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));

我遇到了完全相同的问题,有一段时间,我失去了希望,我认为没有办法解决这个问题。
但是,我错了,有很多解决方案(至少三个)
你是对的,其中一个通过反射使用LineCount属性。
第二种是使用它自己的算法来获取行。
第三种,我更喜欢,它有一种非常优雅的方式来得到你想要的结果。

请参考这个问题,看看这三个答案。
根据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);
    }
}

相关内容

  • 没有找到相关文章

最新更新