当一个新的Paragraph被添加到Document的Blocks时,为什么run的Parent变为null?

时间:2012-12-19 18:22:43

标签: c# wpf richtextbox

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

感谢。

1 个答案:

答案 0 :(得分:1)

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