RichTextBlock 文本行数

RichTextBlock text line count

我正在处理 Windows Phone 8.1 应用程序,我遇到了这个问题:

我有一个 RichTextBlock 控件来保存我的文本,如果我的控件高度比我的屏幕大,我需要在用户阅读文本时自动逐行滚动。

有什么方法可以确定我的行数 RichTextBlock 或者几何计算是唯一的方法吗?

我尝试遍历 Blocks 集合,但似乎没有任何相关内容。

我唯一的方法是使用 TextPointer.GetCharacterRect 函数:

if(msgContainer.Blocks.Any())
{
    var item = msgContainer.Blocks.FirstOrDefault();

    var height = item.LineHeight;
    var startRect = item.ContentStart.GetCharacterRect(LogicalDirection.Forward);

    var lineHeight = startRect.Height;
    var lineCount = (int)_fatAssTextMessage.ActualHeight / lineHeight;
}

但它不准确 - 有时它会错过一两行,因为 int 转换和除法...

任何帮助将不胜感激

如果你在完成除法后进行转换,你会得到稍微更准确的计数:

var lineCount = (int)(_fatAssTextMessage.ActualHeight / lineHeight);

目前您正在将实际高度转换为整数,然后然后进行除法,这总是会低估行数。

这偶尔也会少算 - 当您有半条线可见时。为确保您始终获得最大可能的价值,请执行以下操作:

var lineCount = (int)Math.Ceiling(_fatAssTextMessage.ActualHeight / lineHeight);

[Math.Ceiling] Returns the smallest integral value that is greater than or equal to the specified double-precision floating-point number.

Source