Freigeben über


Gliedern (Managed Paketframework)

Gliederungen ermöglicht es, ein komplexes Programm in eine Übersicht über oder Kontur zu reduzieren. In C# können alle Methoden in einer einzelnen Zeile reduziert sind und nur die Methodensignatur anzeigen. Außerdem können Strukturen und Klassen reduziert werden, um nur die Namen von Strukturen und Klassen anzuzeigen. Innerhalb einer einzelnen Methode kann komplexe Logik reduziert werden, um den allgemeinen Ablauf anzuzeigen, indem nur die erste Zeile von Anweisungen, z. B. foreach, ifund whileanzeigt.

Unterstützung für die Gliederung aktiviert

Der AutoOutlining Registrierungseintrag wird auf 1 festgelegt, um die automatische Gliederung zu aktivieren. Automatische Gliederung eine Analyse der gesamten Quelle eingerichtet, wenn eine Datei geladen oder geändert wird, um ausgeblendete Bereiche zu identifizieren und die Symbole Gliedern anzuzeigen. Gliederung kann auch manuell vom Benutzer gesteuert werden.

Der Wert des AutoOutlining Registrierungseintrags kann über die AutoOutlining-Eigenschaft für die LanguagePreferences-Klasse abgerufen werden. Der AutoOutlining Registrierungseintrag kann mit einem benannten Parameter an den ProvideLanguageServiceAttribute-Attribut initialisiert werden (siehe Wenn Sie einen Sprachdienst registrieren (Managed Paketframework) für Details).

Die verborgene Region

Um Gliederung bereitzustellen, muss der Sprachdienst ausgeblendete Bereiche unterstützen. Hierbei handelt es sich um Textabschnitte, die erweitert oder reduziert werden können. Ausgeblendete Bereiche können durch Symbole Standardsprache, z. B. geschweifte Klammern oder benutzerdefinierten Symbolen getrennt sein. Beispielsweise hat C# ein #region/#endregion Paar, das einen ausgeblendeten Gültigkeitsbereich begrenzt.

Ausgeblendete Bereiche werden von einem verborgenen Bereich Manager verwaltet, der als IVsHiddenTextSession-Schnittstelle verfügbar gemacht wird.

Gliedernd verwendet ausgeblendete Bereiche die IVsHiddenRegion-Schnittstelle und enthält die Spanne des aktuellen Bereichs des ausgeblendeten und sichtbaren Zustand des Banners angezeigt werden soll, wenn die Spanne reduziert wird.

Der Sprachdienst mithilfe der Parser AddHiddenRegion-Methode, um einen neuen verborgenen Bereich mit dem Standardverhalten für ausgeblendete Bereiche hinzuzufügen, während die AddHiddenRegion-Methode ermöglicht, um die Darstellung und das Verhalten der Kontur anzupassen. Sobald eine verborgene Bereiche der verborgenen Bereich angegeben wurden, verwaltet Visual Studio die ausgeblendeten Bereiche für den Sprachdienst.

Wenn Sie bestimmen müssen, wenn die ausgeblendete Bereichs eine zerstört wird, wird ein ausgeblendeter Bereich geändert oder Anforderung, eines bestimmten Bereichs zu ausgeblendeten sicher sind sichtbar. Sie müssen eine Klasse von der Source-Klasse ableiten und die entsprechenden Methoden, OnBeforeSessionEnd, OnHiddenRegionChangeund MakeBaseSpanVisibleüberschreiben.

Beispiel

Hier ist ein vereinfachtes Beispiel zum Erstellen einer ausgeblendeten Bereiche für alle Paare geschweiften Klammern. Es wird davon ausgegangen, dass die Sprache der abgleichende geschweifte Klammer enthält und dass die geschweiften Klammern einschließen, um übereinstimmende mindestens auf die geschweiften Klammern ({und}). Dieser Ansatz ist nur zur Veranschaulichung. Eine vollständige Implementierung würde eine vollständige Behandlung von Fällen in ParseSourcehaben. In diesem Beispiel wird auch gezeigt, wie die AutoOutlining Einstellung true vorübergehend festlegt. Eine Alternative besteht darin, den AutoOutlining benannten Parameter im ProvideLanguageServiceAttribute-Attribut im Paket Sprachen anzugeben.

Bei diesem Beispiel wird vorausgesetzt, dass C#-Regeln für Kommentare, Zeichenfolgen und Literale an.

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();
        }
    }
}

Siehe auch

Konzepte

Wenn Sie einen Sprachdienst registrieren (Managed Paketframework)

Weitere Ressourcen

Sprachendienst-Funktionen (Managed Paketframework)