c# - 在 Visual Studio 扩展中记录撤消/重做操作

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

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

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

有没有其他方法可以在 Visual Studio 中访问撤消信息?或者,也许我可以使用一些更有创意的技巧?

最佳答案

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

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

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

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

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

关于c# - 在 Visual Studio 扩展中记录撤消/重做操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9337683/

相关文章:

c# - 如何在 MSTest 中忽略

c# - 调整 WPF 应用程序的大小,直到仅保留窗口栏

c++ - 在 Visual Studio 2010 中使用 log4cxx。应用程序初始化错误

尝试向 JTextPane 添加撤消时出现 java.lang.NullPointerException

c# - 正则表达式替换

c++ - Release 与 Debug 版本中变量的奇怪行为

c++ - VS2010 : afxcw. lib(appcore.obj):错误 LNK2001:无法解析的外部符号 ___wargv

c# - 是否有任何库/框架用于撤消/重做数据库中行的更改?

android - 将撤消重做功能添加到 FingerPaint 应用程序(谷歌的示例应用程序之一)

c# - 为什么引用的 DLL 与 EXE 一起存储