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.
我正在处理 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.