共用方式為


大綱 (受管理的封裝架構)

大綱可以讓摺疊成概觀或外框的複雜的程式。 比方說,在 C# 中的所有方法可以摺都疊成一行,顯示 [方法簽章。 此外,結構和類別可以摺疊顯示的結構和類別名稱。 在單一方法,複雜的邏輯可以摺疊以顯示整個流程所顯示的陳述式的第一行,例如foreach, if,以及while。

啟用大綱的支援

AutoOutlining登錄項目,會啟用自動大綱設為 1。 自動大綱設定剖析的完整的來源,當檔案載入或變更,以找出隱藏的區域,並顯示大綱的圖像 (glyph)。 大綱可以也控制手動使用者。

值為AutoOutlining登錄項目可透過AutoOutlining屬性在LanguagePreferences類別。 AutoOutlining登錄項目可以初始化具名的參數,以ProvideLanguageServiceAttribute屬性 (請參閱正在註冊語言服務 (管理的套件架構)如需詳細資訊)。

隱藏的區域

若要提供大綱,您的語言服務必須支援隱藏的區域。 這些是文字的合併的可展開或摺疊。 標準語言符號,包括大括弧,或是自訂的符號來分隔隱藏的區域。 例如,C# 的#region/#endregion組,用來分隔了隱藏的區域。

隱藏的區域由隱藏的區域管理員,它會公開為IVsHiddenTextSession介面。

大綱隱藏的區域會使用IVsHiddenRegion介面,而且包含隱藏的區域、 目前可見的狀態和範圍已摺疊時,所顯示的橫幅的範圍。

語言服務的剖析器會使用AddHiddenRegion方法來加入新的隱藏的區域,以預設方式隱藏區域,而AddHiddenRegion方法可讓您自訂的外觀和行為的外框。 一旦隱藏的區域提供給隱藏的區域的工作階段, Visual Studio管理語言服務的隱藏的區域。

如果您需要判斷何時隱藏的區域的工作階段時終結,變更了隱藏的區域,或者您需要確定特定的隱藏的區域是可見的。 您必須衍生的類別,從Source類別並覆寫適當的方法, OnBeforeSessionEndOnHiddenRegionChange,和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();
        }
    }
}

請參閱

概念

正在註冊語言服務 (管理的套件架構)

其他資源

語言服務功能 (受管理的封裝架構)