Я строю расширение Visual Studio.У меня есть команда (вызывается из контекстного меню в окне кода) и реализации ITagger
и ITaggerProvider
для выделения текста (аналогично https://docs.microsoft.com/en-us/visualstudio/extensibility/walkthrough-highlighting-text?view=vs-2017).
. Я хотел бы разместить тег вtagger только для слова, которое находилось под курсором в момент запуска команды (если запущена другая команда, тег должен быть заменен).
Проблема, я не понимаю, как подключить обработчик команд менютегеру. Я попытался подписаться на событие в команде, но поскольку оно инициализируется асинхронно, оно еще не доступно при создании экземпляра тегера.
Tagger.cs
public Tagger(ITextView view, ITextBuffer sourceBuffer)
{
this.View = view;
this.SourceBuffer = sourceBuffer;
this.CurrentWord = null;
// BAD
Command.Instance.Executed += TagNow;
}
void TagNow(object sender, EventArgs e)
{
UpdateAtCaretPosition(View.Caret.Position);
}
Command.cs
public static Command Instance
{
get;
private set;
}
public static async Task InitializeAsync(AsyncPackage package)
{
await ThreadHelper.JoinableTaskFactory.SwitchToMainThreadAsync(package.DisposalToken);
var commandService = await package.GetServiceAsync(typeof(IMenuCommandService))
as OleMenuCommandService;
Instance = new Command(package, commandService);
}
private void Execute(object sender, EventArgs e)
{
ThreadHelper.ThrowIfNotOnUIThread();
Executed?.Invoke(this, e);
}