概述使您能够折叠复杂程序到概述或轮廓。 例如,在 c# 中所有方法可折叠为下一行,只显示方法签名。 此外,结构和类可以折叠显示结构和类的名称。 在单个方法中,复杂逻辑可以折叠显示整个流通过显示语句只有第一行例如 foreach、 if和 while。
启用对概述了支持
AutoOutlining 注册表项设置为 1 中启用 " 自动大纲显示。 ,加载文件或更改过为了标识隐藏区域以及显示概述的标志符号时,自动大纲显示设置了整个源分析。 概述可以由用户手动控件。
AutoOutlining 注册表项的值可以在 LanguagePreferences 类的 AutoOutlining 属性中获得的。 AutoOutlining 注册表项可以初始化命名参数。 ProvideLanguageServiceAttribute 属性 (请参见 注册语言服务 (托管包结构) 有关详细信息)。
隐藏的区域
若要提供大纲,语言服务必须支持隐藏的区域。 这些是可以展开或折叠的文本范围。 隐藏的区域可以用标准语言符号,如大括号,或者由自定义符号。 例如, C# 线 #region/#endregion 对分隔一个隐藏区域。
隐藏的区域由一个隐藏区域管理器管理,显示为 IVsHiddenTextSession 接口。
,当范围折叠时,大纲使用隐藏的区域 IVsHiddenRegion 接口并包含将显示该隐藏的区域、当前可见状态和标题区的大小。
,而 AddHiddenRegion 方法允许您自定义边框的外观和行为,语言服务分析器使用 AddHiddenRegion 方法将使用默认行为的一个新的隐藏区域隐藏区域的。 对于隐藏的区域为隐藏的区域会话, Visual Studio 管理语言服务的隐藏区域。
如果需要确定何时销毁的隐藏区域会话,更改一个隐藏区域,或者需要确定特定的隐藏区域是可见的,必须从 Source 类派生类并重写相应的方法, OnBeforeSessionEnd、 OnHiddenRegionChange和 MakeBaseSpanVisible,分别。
示例
这是创建所有的隐藏区域的简化示例对大括号。 假定,语言提供匹配的大括号,因此,要匹配的大括号至少包括大括号 ({和})。 此方法仅用于阐释目的。 完整实现将具有完整处理在 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();
}
}
}