我编写了一个Visual Studio扩展,我记录了与我的扩展相关的用户操作。我希望能够包含我的工具在日志中所做的更改的撤消/重做信息,我希望能够通过在发生撤消/重做时调用事件监听器来执行此操作,并检查撤消/重做对象是否为与我的工具生成的动作相对应的那个。
目前,我有代码获取当前ITextUndoHistory
的{{1}},我使用IWpfTextView
生成ITextUndoHistoryRegistry
。不幸的是,我得到的ITextUndoHistory
对象没有实现足够的功能。具体来说,它的UndoRedoHappened
事件被调用,但总是有null
的事务。此外,其UndoStack
/ RedoStack
属性会抛出System.NotSupportedException
。唯一可行的是CreateTransaction
确实为我提供了一个事务对象,并允许我为Visual Studio的撤消/重做列表中显示的操作设置名称,尽管我不需要它可以工作。
是否有其他方法可以在Visual Studio中访问撤消信息?或者可能是一些更有创意的黑客攻击我可以访问的内容?
答案 0 :(得分:4)
我假设你想要记录你的编辑器扩展命令的撤销/重做。如果不是这样的话......下面的描述将没有用。 : - )
首先要做的是创建一个派生自ITextUndoPrimitive
的小类,它代表一个包含在撤销事务的一部分中的小“操作”。这有两个重要的方法:Undo()
在用户撤消事务时调用,Do()
在用户解除事务处理然后点击Redo时调用。对于其余的方法,只需执行简单的实现:CanUndo
/ CanRedo
应始终返回true,并使Parent成为简单的读/写属性。 CanMerge
应始终返回false,您可以将Merge()
保留为未实现状态。您当然可以在ITextUndoPrimitive中保留您想要的任何其他状态。
就你在Do / Undo中所做的事情而言,这取决于你。因此,如果您的扩展名是修改文本缓冲区并写入用户项目中的其他文件,则可以撤消文件写入。我感觉你只是试图跟踪用户撤销哪些操作(可能是出于统计目的?),所以你可能只是在日志中更新“用户解除这个”位并完成它。
当您执行操作时,请调用CreateTransaction
以启动新事务,然后在该事务上调用AddUndo(),传入undo原语的新实例。然后编辑器将根据需要调用Do / Undo。
最后一点:当事务历史记录过长时,或者在某些情况下,历史记录被破坏并且必须重置时,编辑器将自动清除撤消事务。所以期望在某些时候你的撤销原语会消失并被GC控制。最重要的是:不要在其他可能导致泄漏的地方抓住它们。