我有一个标记器(ITagger的子类),并且试图调用GetClassificationSpans,因此我可以使用分类查找使用标记格式化的注释。这在Visual Studio 2013中有效,但是现在在Visual Studio 2015中运行它时,GetClassificationSpans始终返回一个空列表-即使当我在调试器中检查范围时,它肯定会在其中传递带注释的范围。
有谁知道在调用GetClassificationSpans方面可能在2015年发生了什么变化?
顺便说一句:通过在标记提供程序(ITaggerProvider的子类)中导入IClassifierAggregatorService并将其传递给标记创建程序,我得到了分类器:
[import]
IClassifierAggregatorService aggregator;
然后,我在从提供程序获得的聚合器上的标记器中使用以下调用:
IList<ClassificationSpan> lstClassifiers = aggregator.GetClassifier(span.Snapshot.TextBuffer).GetClassificationSpans(span);
而且,正如我所说,lstClassifiers列表始终为空。在VS2013中找到了完全相同的代码。我似乎在网上找不到任何提及VS2015可能导致此问题的更改。
谢谢,
最佳答案
我遇到了同样的问题,尽管背景不同。从我的谷歌搜索来看,好像他们已经改变了分类器,以便它们被懒惰地初始化了……我猜GetClassificationSpans()
不会强行初始化它们。 MSFT仍然认为这是一个错误,因此您可能希望对问题on VS Connect进行投票。
一个潜在的解决方法(由MSFT建议)是切换为使用TagAggregator
而不是IClassifier
。所以代替:
var service = container.GetService<IClassifierAggregatorService>();
var classifier = service.GetClassifier(textView.TextBuffer);
var spans = classifier.GetClassificationSpans(new SnapshotSpan(...));
您可以改为这样写:
var service = container.GetService<IViewTagAggregatorFactoryService>();
var aggregator = service.CreateTagAggregator<IClassificationTag>(textView);
var tags = aggregator.GetTags(new SnapshotSpan(...)));
这将返回
IMappingTagSpan<IClassificationTag>
列表而不是ClassificationSpan
列表,因此您使用它们的方式会稍有不同。但是基础数据似乎基本相同-即,您可以获得每个词汇元素的分类和范围。有一些细微的差异(请参阅VS Connect上的描述),但是结果对于我的应用程序来说已经足够了。关于visual-studio-2015 - Visual Studio 2015中的GetClassificationSpans不返回任何内容,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33587744/