Расширение VSIX: как сделать атомарную отмену после замены текста - PullRequest
0 голосов
/ 29 ноября 2018

Я пишу модуль расширения 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 голосов
/ 29 ноября 2018

Решение состоит в том, чтобы создать контекст отмены, в котором могут быть собраны все изменения, которые должны отображаться как одна транзакция:

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