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

Ala*_*ark 4 c# wpf richtextbox

一点背景.我希望能够在WPF RichTextBox中处理插入符号所在行的文本.请参阅我之前关于TextPointer类的问题:如何在WPF RichTextBox中跟踪TextPointer?.

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

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

在此先感谢您的帮助.

Ray*_*rns 13

GetLineStartPosition能够返回一行的开头而不是一行的结尾.为此你必须将它与它结合起来GetInsertionPosition.

这是如何GetLineStartPosition工作:

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

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

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

pointer.GetLineStartPosition(1).GetInsertionPosition(LogicalDirection.Backward);
Run Code Online (Sandbox Code Playgroud)

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

解决它的简单方法是这样做:

var nextStart = pointer.GetLineStartPosition(1)
var lineEnd = (nextStart !=null ? nextStart : pointer.DocumentEnd).GetInsertionPosition(LogicalDirection.Backward);
Run Code Online (Sandbox Code Playgroud)

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

最好是让WPF处理移动的所有复杂TextPointers周围FlowDocument,这意味着使用GetInsertionPosition找到相同的线在原有的结束TextPointer点.