使用GetLineStartPosition获取WPF RichTextBox中一行的结尾
一点背景。 我希望能够在WPF RichTextBox中处理插入符号所在行的文本。 请参阅我之前关于TextPointer类的问题: 如何在WPF RichTextBox中跟踪TextPointer? 。
我知道如何通过使用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
而不是仅使用GetNextContextPosition
或GetPointerAtOffset
移动一个符号的原因是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;
- WebBrowser-Control – 单击链接打开默认浏览器
- 的ExecuteScalar(); 使用scope_identity()生成“System.InvalidCastException:指定的强制转换无效”
- 如何从可执行文件中获取图标只有C#中的Process实例
- uniqueidentifier C#中的等效数据类型
- Crystal Report不显示在使用VS 2013构建的ASP.net网页中
- 在浏览器中打开PDF而不是下载它
- 我可以将我的缓存行添加到global.asax吗?
- 使用C#更新Windows窗体中的文本框时,如何编写“闪存”效果?
- 在WinRT应用程序中处理2,3,4,5手指轻敲,双击并保持手势