3

我正在尝试为我的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”。但这是一个不同的运行。这是否意味着生成了新的运行?!我真的很困惑。

谢谢。

4

1 回答 1

1

我错的可能性很大,但是当它是新的 paragrpah 时,尝试删除最后 2 个字符。我认为您收到此错误是因为当您按回车键时,它会插入两个字符:\r\n (carret return + new line)

于 2012-12-19T18:37:47.660 回答