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

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

我知道如何通过使用带有0作为参数的GetLineStartPosition来获取当前行的开始处的TextPointer,但现在想要在行尾获得TextPointer。 在我之前的问题中提出,使用GetLineStartPosition方法是可行的。

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

预先感谢您的帮助。


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中返回一个指针,而当前行的结尾是最后一个Run的结尾在最后一个TableCell的最后一段,...你明白了。

    最好让WPF处理围绕FlowDocument移动TextPointers所有复杂性,这意味着使用GetInsertionPosition找到原始TextPointer指向的同一行的TextPointer


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

    var currentLine = new TextRange(rtb.CaretPosition.GetLineStartPosition(0), rtb.CaretPosition.GetLineStartPosition(1) ?? rtb.CaretPosition.DocumentEnd).Text;
    
    链接地址: http://www.djcxy.com/p/61121.html

    上一篇: Using GetLineStartPosition to get the end of a line in WPF RichTextBox

    下一篇: Select Range of Text in WPF RichTextBox (FlowDocument) Programmatically