【问题标题】:Log undo/redo actions in Visual Studio extension在 Visual Studio 扩展中记录撤消/重做操作
【发布时间】:2012-03-09 09:49:51
【问题描述】:

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

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

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

【问题讨论】:

  • 您为什么使用撤消/重做作为用户操作的日志?撤消历史记录可以出于多种原因被清除,因此它根本不会是永久性的。
  • @JasonMalinowski,我想知道用户是否使用我的工具执行更改,然后点击撤消以撤消该更改。

标签: c# visual-studio-2010 undo-redo visual-studio-extensions


【解决方案1】:

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2010-12-21
    • 2013-10-21
    相关资源
    最近更新 更多