根据TextWrapping属性获取TextBlock的行?

Hak*_*tık 6 c# wpf textblock word-wrap

我有一个TextBlockWPF应用程序.

的(Text,Width,Height,TextWrapping,FontSize,FontWeight,FontFamily的这个)性质TextBlock是动态的(由用户在运行时输入).

每次用户更改以前的某个属性时,都会在运行时更改其Content属性TextBlock.(一切都好,直到这里)

现在,我需要TextBlock根据之前指定的属性获取该行.
这意味着我需要TextWrapping算法将产生的线条.

换句话说,我需要在一个单独的字符串中的每一行,或者我需要一个带Scape序列的字符串\n.

有什么想法吗?

Iva*_*oev 6

如果没有公开的方式,我会感到惊讶(尽管人们从来不知道,特别是对于WPF).
确实看起来像TextPointer类是我们的朋友,所以这里有一个基于TextBlock.ContentStart,TextPointer.GetLineStartPositionTextPointer.GetOffsetToPosition的解决方案:

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

这里没有太多要解释
获取线的起始位置,减去前一行的起始位置以获得线文本的长度,这里我们是.
唯一棘手的(或非显而易见的)部分是ContentStart因为设计需要偏移一个The TextPointer returned by this property always has its LogicalDirection set to Backward.,所以我们需要得到相同(!?)位置的指针,但LogicalDirection set to Forward无论如何都是这样.