gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 00:04:01 34 4
gpt4 key购买 nike

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

我知道如何使用以 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 中返回一个指针,而当前行的结尾是a 最后一个 TableCell 中最后一个段落中最后一个 Run 的结尾,......你明白了。

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

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

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com