VSIX扩展:如何在替换文本时进行原子撤消

时间:2018-11-28 23:31:23

标签: c# visual-studio vsix undo

我正在编写一个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编写。

1 个答案:

答案 0 :(得分:0)

解决方案是创建一个撤消上下文,在该上下文中可以收集所有更改,这些更改应显示为单个事务:

try
{
   ProjectHelpers.DTE.UndoContext.Open("Description of operation");
   selection.Text = newText;
}
finally
{
   ProjectHelpers.DTE.UndoContext.Close();
}