【问题标题】:WPF TextBlock get lines after textwrappingWPF TextBlock在文本换行后获取行
【发布时间】:2013-01-16 10:19:36
【问题描述】:

我有FixedDocument 页面,我想在其上放置TextBlock,但可能是Textblock 不适合页面的高度。
所以我想从生成的TextBlockTextWrapping 中提取线条,然后创建新的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

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

【问题讨论】:

  • pastebin.com/b6cZD5pp 我知道一种从文本块中获取线条的方法,但这仅在已绘制控件时才有效。
  • 你看过 wpf FlowDocument 吗?指向msdn的链接。
  • 是的,但 FlowDocument 不适合我。我m try layout elements manual on single FixedPage, that have A4 size. Thats 为什么如果它不适合我需要拆分文本块。

标签: wpf textblock fixeddocument line-count


【解决方案1】:

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

请参考这个问题,看这个的三个答案。
Get the lines of the TextBlock according to the TextWrapping property?


这是最佳解决方案的副本(在我看来)
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);
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-28
    • 1970-01-01
    • 2013-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多