#c# #visual-studio-2019 #mef #visual-studio-extensions #vsix
#c# #visual-studio-2019 #mef #visual-studio-extensions #vsix
Вопрос:
Я пытаюсь написать расширение для анализа кода для Visual Studio, используя MEF. Я реализовал ITagger
интерфейс для an 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));
}
}
}
}
}
}
Результат выглядит так:
всплывающая подсказка не отображается
Чего мне не хватает для отображения всплывающей подсказки?
Комментарии:
1. Попробуйте обратиться к этому документу .
2. Спасибо, фатер, я уже пробовал это, но в моем случае это не помогло.
Ответ №1:
Комментарий Фатера выше заставил меня снова задуматься о проблеме. Поскольку я уже безуспешно пробовал предложения в документе, опубликованном fater, я начал думать, может ли проблема быть в другом месте.
Оказывается ITagger
, проблема не в реализации, а ITaggerProvider
в том, что реализация вызвала странное поведение. Для этого я в значительной степени следовал примеру списка ошибок VSIX, реализующему средство проверки орфографии, которое содержит следующий код
/// <summary>
/// Create a tagger that does spell checking on the view/buffer combination.
/// </summary>
public ITagger<T> CreateTagger<T>(ITextView textView, ITextBuffer buffer) where T : ITag
{
ITagger<T> tagger = null;
// Only attempt to spell check on the view's edit buffer (and multiple views could have that buffer open simultaneously so
// only create one instance of the spell checker.
if ((buffer == textView.TextBuffer) amp;amp; (typeof(T) == typeof(IErrorTag)))
{
var spellChecker = buffer.Properties.GetOrCreateSingletonProperty(typeof(SpellChecker), () => new SpellChecker(this, textView, buffer));
// This is a thin wrapper around the SpellChecker that can be disposed of without shutting down the SpellChecker
// (unless it was the last tagger on the spell checker).
tagger = new SpellCheckerTagger(spellChecker) as ITagger<T>;
}
return tagger;
}
Дело в том, что приведенный выше код создает только ITagger
для определенного представления. В этом случае созданный теггер используется только для предоставления закорючек в окне редактора. Visual Studio использует другой экземпляр теггера для предоставления всплывающих подсказок для закорючек и другой экземпляр теггера для раскрашивания полосы прокрутки в окне редактора. Я предполагал, что это будет сделано одним экземпляром теггера.