使用GetLineStartPosition获取WPF RichTextBox中一行的结尾

时间:2010-06-17 08:38:00

标签: c# wpf richtextbox

一点背景知识。我希望能够在WPF RichTextBox中处理插入符号所在行的文本。请参阅我之前关于TextPointer类的问题:How to keep track of TextPointer in WPF RichTextBox?

我知道如何通过使用GetLineStartPosition并将0作为参数来获取当前行开头的TextPointer,但现在想要在行的末尾获取TextPointer。在我之前的问题中建议使用GetLineStartPosition方法可以实现这一点。

如果有人可以解释一下GetLineStartPosition如何处理行尾指针,我将不胜感激。

提前感谢您的帮助。

2 个答案:

答案 0 :(得分:11)

GetLineStartPosition能够返回一行的开头而不是一行的结尾。为此,您必须将其与GetInsertionPosition结合使用。

以下是GetLineStartPosition的工作原理:

  • GetLineStartPosition(-1)获取上一行的开头
  • GetLineStartPosition(0)获取当前行的开头
  • GetLineStartPosition(1)获取下一行的开头

你也可以用更大的整数来调用它来获得更远的线条。

要获得一行的结尾,只需获取下一行的开头,然后获取先前的插入位置。基本上是这样的:

pointer.GetLineStartPosition(1).GetInsertionPosition(LogicalDirection.Backward);

但是当您在文档的最后一行时,这不起作用:GetLineStartPosition返回null。

解决问题的简单方法是:

var nextStart = pointer.GetLineStartPosition(1)
var lineEnd = (nextStart !=null ? nextStart : pointer.DocumentEnd).GetInsertionPosition(LogicalDirection.Backward);

必须使用GetInsertionPosition而不是仅使用GetNextContextPositionGetPointerAtOffset移动一个符号的原因是FlowDocument元素树中的每个元素都是符号。因此,例如,如果当前行是表中的最后一行,GetLineStartPosition(1)将在表后面的第一个段落中的第一个Run内返回一个指针,而当前行的末尾是最后一行的结尾在最后一个TableCell的最后一段中运行,...你明白了。

最好让WPF处理在TextPointers周围移动FlowDocument的所有复杂性,这意味着使用GetInsertionPosition查找原始{{1}的同一行的结尾指向。

答案 1 :(得分:2)

当前行的结尾与下一行的开头相同,因此您可以使用GetLineStartPosition(1)。请注意,当您在最后一行时,这将返回null,因此在这种情况下您可能希望使用DocumentEnd

var currentLine = new TextRange(rtb.CaretPosition.GetLineStartPosition(0), rtb.CaretPosition.GetLineStartPosition(1) ?? rtb.CaretPosition.DocumentEnd).Text;