VSIX:IErrorTag工具提示内容未显示

时间:2020-10-21 07:49:49

标签: c# visual-studio-2019 mef visual-studio-extensions vsix

我正在尝试使用MEF为Visual Studio编写代码分析扩展。我已经为ITagger实现了IErrorTag接口,并需要了ITaggerProvider。结果,在代码分析中发现的问题中,我在编辑器窗口中得到了预期的花样。但是,当用鼠标悬停在波浪形上方时,永远不会显示相应的工具提示内容。

这是一个具有相同问题的简约示例:

using Microsoft.VisualStudio.Text.Adornments;
using Microsoft.VisualStudio.Text.Editor;
using Microsoft.VisualStudio.Text.Tagging;
using System;
using System.Collections.Generic;

namespace CodeAnalyzer
{
  struct DummyIssue
  {
    public int Line; // one based line
    public string ToolTip;

    public DummyIssue(int line, string toolTip)
    {
      Line = line;
      ToolTip = toolTip;
    }
  }

  internal class DummyCodeCheckTagger : ITagger<IErrorTag>
  {
    readonly List<DummyIssue> mIssues;
    readonly ITextView TextView;

    public DummyCodeCheckTagger(ITextView textView)
    {
      TextView = textView;
      mIssues = new List<DummyIssue>
      {
        new DummyIssue(1, "asldfjoqwet"),
        new DummyIssue(7, "ASASDAER")
      };

      textView.LayoutChanged += Update;
    }

    public event EventHandler<SnapshotSpanEventArgs> TagsChanged;

    private void Update(object sender, TextViewLayoutChangedEventArgs args)
    {
      TagsChanged?.Invoke(this, new SnapshotSpanEventArgs(new SnapshotSpan(args.NewSnapshot, 0, args.NewSnapshot.Length)));
    }

    IEnumerable<ITagSpan<IErrorTag>> ITagger<IErrorTag>.GetTags(NormalizedSnapshotSpanCollection spans)
    {
      var issues = mIssues;
      foreach (var span in spans)
      {
        foreach (var issue in issues)
        {
          int zeroBasedLine = issue.Line - 1;
          ITextSnapshotLine snapshotLine = TextView.TextSnapshot.GetLineFromLineNumber(zeroBasedLine);
          SnapshotSpan snapshotSpan = snapshotLine.Extent;
          if (spans.IntersectsWith(snapshotSpan))
          {
            yield return new TagSpan<IErrorTag>(snapshotSpan, new ErrorTag(PredefinedErrorTypeNames.SyntaxError, issue.ToolTip));
          }
        }
      }
    }
  }
}

结果如下所示: tooltip not displaying

要显示工具提示,我缺少什么?

1 个答案:

答案 0 :(得分:0)

上面Fater的评论使我再次考虑这个问题。由于我已经尝试过发胖的document中的建议,但没有成功,所以我开始考虑问题是否可能在其他地方。

事实证明,if #available(iOS 12.0, *) { textField.textContentType = .username } 实现不是问题,但是keyboardType = .numberPad 实现导致了奇怪的行为。为了那个原因, 我几乎遵循VSIX ErrorList示例实现了SpellChecker,其中包含以下代码

ITagger

要点是,上面的代码仅为特定视图创建ITaggerProvider。在这种情况下,创建的标记器仅用于在编辑器窗口视图中提供花体。 Visual Studio使用一个不同的tagger实例为花体提供工具提示,并使用另一个tagger实例为编辑器窗口中的滚动条着色。我以为这将由单个标记程序实例完成。