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」を含む実行があります。しかし、それは別の実行です。これは、新しい実行が生成されることを意味しますか?! 私は本当に混乱しています。
ありがとう。