4

Visual Studio拡張機能を作成しました。拡張機能に関連するユーザー操作のログを残しています。アンドゥ/リドゥが発生したときにイベントリスナーが呼び出され、アンドゥ/リドゥオブジェクトが存在するかどうかを確認することで、ツールがログに行う変更のアンドゥ/リドゥ情報を含めることができるようにしたい私のツールが生成したアクションに対応するものです。Visual Studio拡張機能のログを元に戻す/やり直しを行う

現在、私は私が生成するthis answerを追っITextUndoHistoryRegistryを使用して取得し、現在のIWpfTextViewためITextUndoHistoryを取得するためのコードを持っています。残念ながら、私が得たITextUndoHistoryオブジェクトは、有用であるには十分な機能を実装していません。具体的には、そのUndoRedoHappenedイベントが呼び出されますが、常にnullのトランザクションがあります。また、そのUndoStack/RedoStackプロパティはSystem.NotSupportedExceptionをスローします。動作するのはCreateTransactionなので、私にトランザクションオブジェクトが与えられ、Visual Studioの元に戻す/やり直しリストに表示されるアクションの名前を設定することができますが、それは動作する必要はありません。

Visual Studioで元に戻す情報にアクセスする他の方法はありますか?それとも、私がアクセスできるもので、もっと創造的なハックをしているのだろうか?

+0

なぜユーザーアクションのログとして元に戻す/やり直しを使用していますか?元に戻す履歴は、任意の数の理由でクリアすることができるので、永久的ではありません。 –

+0

@ JasonMalinowski、ユーザーが自分のツールを使用して変更を行ったかどうかを知りたいのですが、その変更を元に戻すために元に戻すとヒットします。 – perelman

答えて

4

エディタ拡張機能の元に戻す/やり直しをログに記録したいと仮定しています。そうでない場合は、以下の説明は役に立ちません。 :-)

最初にやりたいことは、取り消しトランザクションの一部に含まれる小さな「操作」を表すITextUndoPrimitiveから派生した小さなクラスを作成することです。これには2つの重要なメソッドがあります:ユーザーがトランザクションを取り消すときに呼び出されるUndo()と、ユーザーがトランザクションを取り消してからやり直しを実行したときに呼び出されるDo()です。残りのメソッドについては、簡単な実装を行ってください:CanUndo/CanRedoは常にtrueを返し、Parentを単純な読み書きプロパティにする必要があります。 CanMergeは常にfalseを返し、Merge()は実装されていないままにすることができます。もちろん、ITextUndoPrimitiveに追加する任意の状態を保持することもできます。

Do/Undoで行うことは、あなた次第です。したがって、拡張機能がテキストバッファーを変更し、ユーザーのプロジェクトの他のファイルに書き込む場合は、ファイル書き込みを取り消すことができます。ユーザーがどの操作を(おそらく統計的な目的のために)取り消したのかを追跡しようとしているだけなので、あなたのログの「このユーザーを元に戻す」ビットを更新して完了させることができます。

を呼び出して新しいトランザクションを開始し、そのトランザクション呼び出しAddUndo()で元に戻すプリミティブの新しいインスタンスを渡します。エディタは、必要に応じてDo/Undoを呼び出します。

最後にメモ:トランザクション履歴が長すぎる場合、または履歴が破棄されリセットされる必要がある場合、エディタは自動的に取り消しトランザクションを取り除きます。だから、ある時点であなたの元に戻すプリミティブが消え去ってGCされることを期待してください。最も重要なことは:それらが漏れる原因となる他の場所でそれらを保持しないことです。

関連する問題