我正在尝试为RichTextBox
控件创建自定义撤消/重做管理器。我在运行中插入char
并在Undo Stack
中保存插入位置和运行及其他信息。
当我尝试撤消时,我删除了插入的char
。之后我用这行代码设置了CaretPosition:
CaretPosition = run.ContentStart.GetPositionAtOffset(position);
当我没有开始新的Paragraph
时,一切都很好。
当我按下回车并开始一个新的段落而我想撤消时,会发生一些奇怪的事情。让我解释一下:
1 - 我按下返回并生成新的Paragraph
2 - 我致电Undo
3 - 它到达上面的代码行并抛出此异常:Cannot set CaretPosition to be outside of RichTextBox.
我认为这是因为run.Parent==null
而不是它的父段(这个运行在第一段,我的意思是我按下的段落返回)。 当我将此次运行保存到Undo Stack
时,其父级不为空。
我看到了ContentElement.cs
(Run的基类)的源代码。写道:
internal DependencyObject _parent;
internal DependencyObject Parent { get { return _parent; } }
如果某些更改后此_parent
属性如何变为空,我该如何防止这种情况发生?
更新
(假设我在第1段写“123”。)
第一段存在于Document.Blocks中,并且其中有一个带有“123”的运行。但这是一个不同的运行。这是否意味着生成了新的运行?!我真的很困惑。
感谢。
答案 0 :(得分:1)
我很可能错了,但是当它是新的paragrpah时,尝试删除最后2个字符。我认为您收到此错误是因为当您按回车键时会插入两个字符: \ r \ n (carret return + new line)