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

我知道如何通过使用GetLineStartPosition(以0作为参数)在当前行的开头获取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处理在TextPointers周围移动FlowDocument的所有复杂性,这意味着使用GetInsertionPosition查找原始TextPointer指向的同一行的末尾。

    关于c# - 使用GetLineStartPosition获取WPF RichTextBox中的行尾,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3060108/

    10-12 12:43