c# - 根据TextWrapping 属性获取TextBlock 的行数?

标签 c# wpf textblock word-wrap

我在 WPF 应用程序中有一个 TextBlock

(Text, Width, Height, TextWrapping, FontSize, FontWeight, FontFamily) 此 TextBlock 的属性是动态的(由用户在运行时输入)。

每次用户更改先前的属性之一时,TextBlockContent 属性都会在运行时更改。 (到这里一切正常)

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

换句话说,我需要一个单独的字符串中的每一行,或者我需要一个带有 Scape Sequence \n 的字符串。

有什么想法吗?

最佳答案

如果没有公开的方式来做到这一点,我会感到惊讶(尽管人们永远不知道,尤其是使用 WPF)。
确实看起来像TextPointer class是我们的 friend ,所以这是一个基于 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);
    }
}

这里就不多解释了
获取该行的起始位置,减去上一行的起始位置以获得该行文本的长度,这就是我们。
唯一棘手(或不明显)的部分是需要将 ContentStart 偏移一个,因为根据设计此属性返回的 TextPointer 始终将其 LogicalDirection 设置为向后。,因此我们需要获取指向相同(!?)位置的指针,但 LogicalDirection 设置为 Forward,无论如何这意味着。

关于c# - 根据TextWrapping 属性获取TextBlock 的行数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30378441/

相关文章:

c# - 如何将 WPF 椭圆的高度绑定(bind)到它自己的宽度?

c# - 调整大小时将组框对齐到包含的控件

c# - 使用CustomSort对ListCollectionView进行排序

c# - 如何在一个组合框中显示多列

WPF 验证问题 : how to work with validation which involves 2 fields

c# - 如何在 WPF 工具包日历控件中绑定(bind) BlackoutDates?

c# - 如何使用 YouTube API 获取随机 YouTube 视频?

WPF:将主窗体属性传递给用户控件

wpf - TextBlock 填充垂直空间

html - 将超链接添加到文本 block WPF