我正在构建Visual Studio扩展。我有一个命令(可以从代码窗口的上下文菜单中调用),还有一个用于突出显示文本的ITagger
和ITaggerProvider
实现(类似于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);
}