4

Visual Studio拡張機能を作成し、拡張機能に関連するユーザーアクションのログを保持しています。ツールが行った変更の取り消し/やり直し情報をログに含めたいのですが、取り消し/やり直しが発生したときにイベントリスナーを呼び出して、取り消し/やり直しオブジェクトが私のツールが生成したアクションに対応するもの。

ITextUndoHistory現在、現在のを取得するためのコードがあります。これは、この回答に従って生成IWpfTextViewしたものを使用して取得します。残念ながら、私が取得したオブジェクトは、役立つ機能を十分に実装していません。具体的には、そのイベントが呼び出されますが、常に。のトランザクションがあります。また、その/プロパティはスローします。動作するのは、トランザクションオブジェクトを取得し、Visual Studioの元に戻す/やり直しリストに表示されるアクションの名前を設定できるようにすることだけですが、動作する必要はありません。ITextUndoHistoryRegistryITextUndoHistoryUndoRedoHappenednullUndoStackRedoStackSystem.NotSupportedExceptionCreateTransaction

Visual Studioで元に戻る情報にアクセスする他の方法はありますか?それとも、私がアクセスできるものを使ったもっとクリエイティブなハックですか?

4

1 に答える 1

4

エディター拡張機能のコマンドの取り消し/やり直しをログに記録したいとしますそうでない場合...以下のこの説明は役に立ちません。:-)

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

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

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

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

于 2012-02-18T03:29:46.880 に答える