我正在尝试为我的RichTextBox
控件创建一个自定义撤消/重做管理器。我char
在 Run 中插入 a 并将插入位置和 Run 等信息保存在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
变为 null,如何防止这种情况发生?
更新
(假设我在第一段中写了“123”。)第一段存在于 Document.Blocks 中,其中包含“123”。但这是一个不同的运行。这是否意味着生成了新的运行?!我真的很困惑。
谢谢。