3

RichTextBoxコントロール用にカスタムの元に戻す/やり直しマネージャーを作成しようとしています。Runに を挿入しchar、挿入位置と Run およびその他の情報を に保存しますUndo Stack

元に戻そうとすると、挿入されcharた . その後、次のコード行で CaretPosition を設定します。

CaretPosition = run.ContentStart.GetPositionAtOffset(position);

新しい を開始しなければ、すべて問題ありませんParagraph

Enter キーを押して新しい段落を開始し、元に戻したい場合、何かおかしなことが起こります。もっと説明しましょう:

1-リターンを押すと、新しいParagraphものが生成されます。
2-私は電話しますUndo
3-上記のコード行に到達すると、次の例外がスローされます。Cannot set CaretPosition to be outside of RichTextBox.

これは、親段落ではないために発生すると思いますrun.Parent==null(この実行は最初の段落にあります。つまり、リターンを押した段落です)。この実行を に保存するとUndo Stack、その親は null ではありません。

ContentElement.cs(Runの基底クラス)のソースコードを見ました。それは書かれている:

internal DependencyObject _parent;
internal DependencyObject Parent  { get { return _parent; } }

いくつかの変更後にこの_parentプロパティが null になる方法と、これを防ぐ方法を教えてください。

更新
(最初の段落に「123」と書いたとします。)最初の段落は Document.Blocks に存在し、「123」を含む実行があります。しかし、それは別の実行です。これは、新しい実行が生成されることを意味しますか?! 私は本当に混乱しています。

ありがとう。

4

1 に答える 1

1

私が間違っている可能性が高いですが、新しい段落の場合は最後の 2 文字を削除してみてください。リターンを押すと\r\n (キャレットリターン+改行)の2文字が挿入されるため、このエラーが発生していると思います

于 2012-12-19T18:37:47.660 に答える