概述 (托管包结构)

概述使您能够折叠复杂程序到概述或轮廓。 例如,在 c# 中所有方法可折叠为下一行,只显示方法签名。 此外,结构和类可以折叠显示结构和类的名称。 在单个方法中,复杂逻辑可以折叠显示整个流通过显示语句只有第一行例如 foreach、 if和 while。

启用对概述了支持

AutoOutlining 注册表项设置为 1 中启用 " 自动大纲显示。 ,加载文件或更改过为了标识隐藏区域以及显示概述的标志符号时,自动大纲显示设置了整个源分析。 概述可以由用户手动控件。

AutoOutlining 注册表项的值可以在 LanguagePreferences 类的 AutoOutlining 属性中获得的。 AutoOutlining 注册表项可以初始化命名参数。 ProvideLanguageServiceAttribute 属性 (请参见 注册语言服务 (托管包结构) 有关详细信息)。

隐藏的区域

若要提供大纲,语言服务必须支持隐藏的区域。 这些是可以展开或折叠的文本范围。 隐藏的区域可以用标准语言符号,如大括号,或者由自定义符号。 例如, C# 线 #region/#endregion 对分隔一个隐藏区域。

隐藏的区域由一个隐藏区域管理器管理,显示为 IVsHiddenTextSession 接口。

,当范围折叠时,大纲使用隐藏的区域 IVsHiddenRegion 接口并包含将显示该隐藏的区域、当前可见状态和标题区的大小。

,而 AddHiddenRegion 方法允许您自定义边框的外观和行为,语言服务分析器使用 AddHiddenRegion 方法将使用默认行为的一个新的隐藏区域隐藏区域的。 对于隐藏的区域为隐藏的区域会话, Visual Studio 管理语言服务的隐藏区域。

如果需要确定何时销毁的隐藏区域会话,更改一个隐藏区域,或者需要确定特定的隐藏区域是可见的,必须从 Source 类派生类并重写相应的方法, OnBeforeSessionEndOnHiddenRegionChangeMakeBaseSpanVisible,分别。

示例

这是创建所有的隐藏区域的简化示例对大括号。 假定,语言提供匹配的大括号,因此,要匹配的大括号至少包括大括号 ({和})。 此方法仅用于阐释目的。 完整实现将具有完整处理在 ParseSource的大小写。 此示例还演示如何暂时将 AutoOutlining 首选项到 true 。 另一种方法是指定在 ProvideLanguageServiceAttribute 属性命名的参数 AutoOutlining 在语言包。

此示例假定注释、字符串和文本的 C# 规则。

using Microsoft.VisualStudio.Package;
using Microsoft.VisualStudio.TextManager.Interop;

namespace MyLanguagePackage
{

    public class MyLanguageService : LanguageService
    {
        private LanguagePreferences m_preferences;

        public override LanguagePreferences  GetLanguagePreferences()
        {
            if (m_preferences == null)
            {
                m_preferences = new LanguagePreferences(this.Site,
                                                        typeof(MyLanguageService).GUID,
                                                        Name);
                m_preferences.Init();
                // Temporarily enabled auto-outlining
                m_preferences.AutoOutlining = true;
            }
            return m_preferences;
        }

        public override AuthoringScope  ParseSource(ParseRequest req)
        {
            Source source = (Source) this.GetSource(req.FileName);
            switch (req.Reason)
            {
               case ParseReason.HighlightBraces:
               case ParseReason.MatchBraces:
               case ParseReason.MemberSelectAndHighlightBraces:
                  if (source.Braces != null)
                  {
                      foreach (TextSpan[] brace in source.Braces)
                      {
                         if (brace.Length == 2)
                         {
                             if (req.Sink.HiddenRegions == true 
                                   && source.GetText(brace[0]).Equals("{") 
                                   && source.GetText(brace[1]).Equals("}"))
                             {
                                //construct a TextSpan of everything between the braces
                                TextSpan hideSpan = new TextSpan();
                                hideSpan.iStartIndex = brace[0].iStartIndex;
                                hideSpan.iStartLine = brace[0].iStartLine;
                                hideSpan.iEndIndex = brace[1].iEndIndex;
                                hideSpan.iEndLine = brace[1].iEndLine;
                                req.Sink.ProcessHiddenRegions = true;
                                req.Sink.AddHiddenRegion(hideSpan);
                             }
                             req.Sink.MatchPair(brace[0], brace[1], 1);
                         }
                         else if (brace.Length >= 3)
                             req.Sink.MatchTriple(brace[0], brace[1], brace[2], 1);
                  }
        }
                   break;
               default:
                   break;
      }
            // Must always return a valid AuthoringScope object.
            return new MyAuthoringScope();
        }
    }
}

请参见

概念

注册语言服务 (托管包结构)

其他资源

语言服务功能 (托管包结构)