GetClassificationSpans

GetClassificationSpans

我有一个标记器(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/

10-12 04:59