将分类器添加到自定义OutputWindow窗格

时间:2015-09-08 12:14:23

标签: visual-studio-sdk

基本上,是否可以将分类器添加到自定义的OutputWindow窗格?

我可以使用以下代码将新窗格添加到输出窗口:

      IVsOutputWindow outputWindow = null;
    outputWindow = ServiceProvider.GlobalProvider.GetService(typeof(SVsOutputWindow)) as IVsOutputWindow;
    if (outputWindow.CreatePane(ref GuidList.guidDebugOutputFilteredPane, "FilteredOutput", 1, 1) == Microsoft.VisualStudio.VSConstants.S_OK)
    {
        if (outputWindow.GetPane(ref GuidList.guidDebugOutputFilteredPane, out filteredPane) == Microsoft.VisualStudio.VSConstants.S_OK)
        {
            filteredPane.OutputString("Created filtered pane. Need to add a classifier...");
        }
    }

但我不知道如何为它添加分类器。我已经在“输出”窗口的“调试”窗格中添加了一个分类器,我想在FilteredOutput窗格中显示一些其他语法着色之前进行一些重新格式化和过滤。

我使用自己的ContentTypeDefinition(来自MSDN)创建了FilteredOutput分类器:

  internal sealed class Components
{
    [Export]
    [Name("FilteredOutput")]
    [BaseDefinition("Output")]
    internal static ContentTypeDefinition FilteredOutputContentTypeDefinition;
}

然后我用它来创建一个新的IClassiferProvider:

  [ContentType("FilteredOutput")]
[Export(typeof(IClassifierProvider))]
public class FilteredOutputClassifierProvider : IClassifierProvider
{
    [Import]
    internal IClassificationTypeRegistryService ClassificationRegistry;
    public static FilteredOutputClassifier FilteredOutputClassifier { get; private set; }
    public IClassifier GetClassifier(ITextBuffer textBuffer)
    {
        return FilteredOutputClassifier ?? (FilteredOutputClassifier = new FilteredOutputClassifier(ClassificationRegistry));
    }
}
调用DebugOutput会调用

GetClassifier(),但不会调用FilteredOutput。使用VSPackage类型扩展是否可行?这是在VS2013中使用最新的VSSDK。

1 个答案:

答案 0 :(得分:0)

在挖掘文档的同时偶然找到解决方案;使用CreatePane2()界面中的IVsOutputWindow3,该界面允许您按名称指定内容类型。类似的东西:

IVsOutputWindow outputWindow = null;
IVsOutputWindow3 outputWindow3 = null;
outputWindow = ServiceProvider.GlobalProvider.GetService(typeof(SVsOutputWindow)) as IVsOutputWindow;
outputWindow3 = ServiceProvider.GlobalProvider.GetService(typeof(SVsOutputWindow)) as IVsOutputWindow3;
if (outputWindow3.CreatePane2(ref GuidList.guidDebugOutputFilteredPane, "Filtered Output", 1, 1, "FilteredOutput", PredefinedTextViewRoles.Debuggable) == Microsoft.VisualStudio.VSConstants.S_OK)
{
    if (outputWindow.GetPane(ref GuidList.guidDebugOutputFilteredPane, out filteredPane) == Microsoft.VisualStudio.VSConstants.S_OK)
    {
        filteredPane.OutputString("Created filtered pane. Need to add a classifier...");
    }
}