大綱 (受管理的封裝架構)
大綱可以讓摺疊成概觀或外框的複雜的程式。 比方說,在 C# 中的所有方法可以摺都疊成一行,顯示 [方法簽章。 此外,結構和類別可以摺疊顯示的結構和類別名稱。 在單一方法,複雜的邏輯可以摺疊以顯示整個流程所顯示的陳述式的第一行,例如foreach, if,以及while。
啟用大綱的支援
AutoOutlining登錄項目,會啟用自動大綱設為 1。 自動大綱設定剖析的完整的來源,當檔案載入或變更,以找出隱藏的區域,並顯示大綱的圖像 (glyph)。 大綱可以也控制手動使用者。
值為AutoOutlining登錄項目可透過AutoOutlining屬性在LanguagePreferences類別。 AutoOutlining登錄項目可以初始化具名的參數,以ProvideLanguageServiceAttribute屬性 (請參閱正在註冊語言服務 (管理的套件架構)如需詳細資訊)。
隱藏的區域
若要提供大綱,您的語言服務必須支援隱藏的區域。 這些是文字的合併的可展開或摺疊。 標準語言符號,包括大括弧,或是自訂的符號來分隔隱藏的區域。 例如,C# 的#region/#endregion組,用來分隔了隱藏的區域。
隱藏的區域由隱藏的區域管理員,它會公開為IVsHiddenTextSession介面。
大綱隱藏的區域會使用IVsHiddenRegion介面,而且包含隱藏的區域、 目前可見的狀態和範圍已摺疊時,所顯示的橫幅的範圍。
語言服務的剖析器會使用AddHiddenRegion方法來加入新的隱藏的區域,以預設方式隱藏區域,而AddHiddenRegion方法可讓您自訂的外觀和行為的外框。 一旦隱藏的區域提供給隱藏的區域的工作階段, Visual Studio管理語言服務的隱藏的區域。
如果您需要判斷何時隱藏的區域的工作階段時終結,變更了隱藏的區域,或者您需要確定特定的隱藏的區域是可見的。 您必須衍生的類別,從Source類別並覆寫適當的方法, OnBeforeSessionEnd, OnHiddenRegionChange,和MakeBaseSpanVisible,分別。
範例
以下是建立用於所有的括號,大括號的隱藏的區域的一個簡單的例子。 它會假設語言會提供比對的大括號和大括號,要比對至少包含大括號 ({和})。 這種方法是僅供說明。 完整的實作會有完整的處理的情況下,在ParseSource。 本範例也示範如何設定AutoOutlining對偏好true暫時。 若要指定替代方法是AutoOutlining中的參數名稱ProvideLanguageServiceAttribute語言套件中的屬性。
本範例假設 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();
}
}
}