我正在编写一个Visual Studio扩展模块(VSIX),该模块允许用户选择文本,并通过菜单命令将所选文本替换为新文本:
var document = ProjectHelpers.DTE.ActiveDocument;
var selection = (TextSelection)document.Selection;
var text = selection.Text;
string newText = doSomethingWith(text);
selection.Text = newText;
现在的问题是,当我希望撤消操作时(例如通过Ctrl-Z),一次只删除一行新文本,最后恢复原始文本(需要使用Ctrl-Z很多次)。
如何实现原子撤消,其中只有一个Ctrl-Z命令会撤消整个过程?
如果有问题,我正在为VS2017编写。
答案 0 :(得分:0)
解决方案是创建一个撤消上下文,在该上下文中可以收集所有更改,这些更改应显示为单个事务:
try
{
ProjectHelpers.DTE.UndoContext.Open("Description of operation");
selection.Text = newText;
}
finally
{
ProjectHelpers.DTE.UndoContext.Close();
}