4

我编写了一个 Visual Studio 扩展,并让它记录与我的扩展相关的用户操作。我希望能够在日志中包含我的工具所做更改的撤消/重做信息,我希望能够通过在撤消/重做发生时调用事件侦听器并检查撤消/重做对象是否是与我的工具生成的动作相对应的那个。

目前,我有代码来获取ITextUndoHistorycurrent IWpfTextView,我使用ITextUndoHistoryRegistry我按照这个答案生成的。不幸的是,ITextUndoHistory我得到的对象没有实现足够有用的功能。具体来说,它的UndoRedoHappened事件被调用,但总是有一个事务null。此外,它的UndoStack/RedoStack属性 throw System.NotSupportedException。唯一有效的是CreateTransaction给我一个事务对象,让我为在 Visual Studio 的撤消/重做列表中显示的操作设置名称,尽管我不需要它来工作。

是否有其他方法可以访问 Visual Studio 中的撤消信息?或者也许我可以访问一些更有创意的黑客?

4

1 回答 1

4

我假设您想要记录编辑器扩展命令的撤消/重做。如果不是这种情况......下面的描述将没有用。:-)

您首先要做的是创建一个派生自ITextUndoPrimitive该小类的小类,该类代表一个小“操作”,该小“操作”包含在撤消事务的一部分中。这有两个重要的方法:Undo()当用户撤销事务时调用,当用户撤销Do()事务然后点击重做时调用。对于其余的方法,只需执行简单的实现:CanUndo/CanRedo应该始终返回 true,并使 Parent 成为一个简单的读/写属性。CanMerge应该总是返回 false,你可以不Merge()实现。您当然可以在 ITextUndoPrimitive 中保留您想要的任何其他状态。

至于你在 Do/Undo 中做什么,这取决于你。因此,如果您的扩展程序正在修改文本缓冲区并写入用户项目中的其他文件,您可以撤消文件写入。我感觉您只是在尝试跟踪用户撤消了哪些操作(也许是出于统计目的?),因此您可能只是在日志中更新“用户撤消了这个”位并完成它。

当您执行您的操作时,调用CreateTransaction以启动一个新事务,然后在该事务上调用 AddUndo() 传递您的撤消原语的新实例。然后,编辑器将根据需要调用 Do/Undo。

最后一点:当事务历史变得太长,或者在某些情况下历史被破坏并且必须重置时,编辑器将自动删除撤消事务。因此,期望在某些时候您的撤消原语会消失并被 GC 处理。最重要的是:不要在其他会导致它们泄漏的地方抓住它们。

于 2012-02-18T03:29:46.880 回答