将RichTextBox的文本设置为字符串T后,RichTextBox中的插入符号位置“丢失”(它转到它的开头)。下面是我尝试在它“丢失”后“恢复”它所做的事情:
public static int GetCaretIndex(RichTextBox C)
{
return new TextRange(C.Document.ContentStart, C.CaretPosition).Text.Length;
}
...
int CaretIndex = GetCaretIndex(C); // Get the Caret position before setting the text of the RichTextBox
new TextRange(C.Document.ContentStart, C.Document.ContentEnd).Text = T; // Set the text of the RichTextBox
C.CaretPosition = C.Document.ContentStart.GetPositionAtOffset(CaretIndex, LogicalDirection.Forward); // Set the Caret Position based on the "Caret Index" variable
然而,这段代码不起作用。“恢复的”插入符号与“原始”插入符号的位置不同(由于某种原因,总是在“原始”插入符号的后面)。
将RichTextBox的CaretPosition“保存”为TextPointer似乎也不起作用。
谁能给我一个“恢复”插入符号的替代方法,或者一个修复上面代码的方法?
4条答案
按热度按时间f5emj3cl1#
似乎(对我)有效:
C.CaretPosition = C.Document.ContentStart; C.CaretPosition = C.CaretPosition.GetPositionAtOffset(CaretIndex, LogicalDirection.Forward);
(顺便说一句,我讨厌RichTextBox。)
hc2pp10m2#
我最近处理了一个类似的问题,这是我的解决方案。在我的例子中,我创建了一个新的RichTextBox.document内容,当我这样做的时候,我希望保留插入符号的位置。
我的想法是脱字符偏移函数是有偏差的,这要归功于用于文本表示的数据结构(段落、游程......),这些数据结构也以某种方式计算偏移位置。
TextRange是一个很好的方法来获得文本中插入符号的精确位置。问题在于它的恢复。但是当我知道我的文档是由哪些组件构造的时,它就变得很容易了。在我的例子中,只有段落和运行。
剩下的是访问文档结构,找到插入符号应该在的确切运行位置,并将插入符号设置到找到的运行的正确位置。
代码:
代码没有经过测试。我从我的应用程序的各个部分组装它。让我知道如果你发现任何问题。
7tofc5zh3#
在我的情况下,我有一个RichTextBox,它只有一个段落,只允许输入文本和换行符。我更改了RichTextBox的结构(通过创建不同颜色的Run示例),但没有更改文本,并在更改后恢复。
ohfgkhjo4#
我发现最简单的解决办法就是比较修改前后的文本。
它看起来是这样的:
那么在实践中,您只需将这两个方法夹在更新的周围。
这样,如果您更改了底层结构,只要文本相同,就很容易找到新的FlowDocument位置。