Как добавить тег под курсором при запуске команды в расширении Visual Studio - PullRequest
0 голосов
/ 20 декабря 2018

Я строю расширение 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);
    }
...