在Visual Studio扩展中激发命令时如何在光标下添加标签

时间:2018-12-20 09:53:47

标签: c# visual-studio-2017 vsix

我正在构建Visual Studio扩展。我有一个命令(可以从代码窗口的上下文菜单中调用),还有一个用于突出显示文本的ITaggerITaggerProvider实现(类似于https://docs.microsoft.com/en-us/visualstudio/extensibility/walkthrough-highlighting-text?view=vs-2017)。

我只想在触发命令的那一刻将标记放置在标记器中的某个单词处(如果触发了另一个命令,则应替换标记)。

问题,我不明白如何将菜单命令处理程序连接到标记器。我试图在命令上订阅一个事件,但是由于它是异步初始化的,因此在实例化标记程序时它尚不可用。

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);
    }

0 个答案:

没有答案