Freigeben über


Innerhalb des Editors

Der Editor besteht aus mehreren verschiedenen Subsystemen, die so konzipiert sind, dass das Editortextmodell von der Textansicht und der Benutzeroberfläche getrennt bleibt.

In diesen Abschnitten werden verschiedene Aspekte des Editors beschrieben:

In diesen Abschnitten werden die Features des Editors beschrieben:

Die Subsysteme

Textmodell-Subsystem

Das Textmodellsubsystem ist für die Darstellung von Text und die Aktivierung seiner Manipulation verantwortlich. Das Textmodellsubsystem enthält die ITextBuffer Schnittstelle, die die Abfolge von Zeichen beschreibt, die vom Editor angezeigt werden sollen. Dieser Text kann auf viele Arten geändert, nachverfolgt und anderweitig bearbeitet werden. Das Textmodell bietet auch Typen für die folgenden Aspekte:

  • Ein Dienst, der Text dateien zuordnet und das Lesen und Schreiben in das Dateisystem verwaltet.

  • Ein unterschiedlicher Dienst, der die minimalen Unterschiede zwischen zwei Abfolgen von Objekten findet.

  • Ein System zur Beschreibung des Texts in einem Puffer in Bezug auf Teilmengen des Texts in anderen Puffern.

Das Textmodellsubsystem ist frei von Benutzeroberflächenkonzepten. Sie ist beispielsweise nicht für die Textformatierung oder das Textlayout verantwortlich, und sie verfügt nicht über visuelle Verzierungen, die dem Text zugeordnet werden können.

Die öffentlichen Typen des Textmodells-Subsystems sind in Microsoft.VisualStudio.Text.Data.dll und Microsoft.VisualStudio.CoreUtility.dll enthalten, die nur von der .NET Framework-Basisklassenbibliothek und dem Managed Extensibility Framework (MEF) abhängen.

Subsystem 'Textansicht'

Das Teilsystem für die Textansicht ist für die Formatierung und Anzeige von Text verantwortlich. Die Typen in diesem Subsystem sind in zwei Ebenen unterteilt, je nachdem, ob die Typen von Windows Presentation Foundation (WPF) abhängig sind. Die wichtigsten Typen sind ITextView und IWpfTextView, die den Satz von Textzeilen steuern, die angezeigt werden sollen, sowie das Caret, die Auswahl und die Möglichkeiten zum Schmücken des Texts mithilfe von WPF-UI-Elementen. Dieses Subsystem bietet auch Ränder um den Textanzeigebereich. Diese Ränder können erweitert werden und können verschiedene Arten von Inhalten und visuellen Effekten enthalten. Beispiele für Seitenränder sind Zeilennummernanzeigen und Bildlaufleisten.

Die öffentlichen Typen des Subsystems für die Textansicht sind in Microsoft.VisualStudio.Text.UI.dll und Microsoft.VisualStudio.Text.UI.Wpf.dll enthalten. Die erste Assembly enthält die plattformunabhängigen Elemente, und die zweite enthält die WPF-spezifischen Elemente.

Klassifizierungssubsystem

Das Klassifizierungssubsystem ist für die Ermittlung von Schriftarteigenschaften für Text verantwortlich. Ein Klassifizierer unterbricht den Text in verschiedene Klassen, z. B. "Schlüsselwort (keyword)" oder "Kommentar". Die Klassifizierungsformatzuordnung bezieht sich auf diese Klassen auf tatsächliche Schriftarteigenschaften, z. B. "Blue Consolas 10 pt". Diese Informationen werden von der Textansicht verwendet, wenn sie Text formatiert und gerendert. Durch Tagging, das weiter unten in diesem Thema beschrieben wird, können Daten mit Textabschnitten verknüpft werden.

Die öffentlichen Typen des Klassifizierungssubsystems sind in Microsoft.VisualStudio.Text.Logic.dll enthalten und interagieren mit den visuellen Aspekten der Klassifizierung, die in Microsoft.VisualStudio.Text.UI.Wpf.dll enthalten sind.

Operations-Subsystem

Das Operations-Subsystem definiert das Editorverhalten. Sie stellt die Implementierung für Visual Studio-Editorbefehle und das Rückgängig-System bereit.

Ein genauerer Blick auf das Textmodell und die Textansicht

Das Textmodell

Das Textmodellsubsystem besteht aus verschiedenen Gruppierungen von Texttypen. Dazu gehören der Textpuffer, text Momentaufnahme s und Textspannen.

Textpuffer und Text Momentaufnahme

Die ITextBuffer Schnittstelle stellt eine Abfolge von Unicode-Zeichen dar, die mithilfe von UTF-16 codiert werden. Dies ist die Codierung, die vom String Typ in .NET Framework verwendet wird. Ein Textpuffer kann als Dateisystemdokument beibehalten werden, dies ist jedoch nicht erforderlich.

Dies ITextBufferFactoryService wird verwendet, um einen leeren Textpuffer oder einen Textpuffer zu erstellen, der aus einer Zeichenfolge oder aus TextReaderinitialisiert wird. Der Textpuffer kann als ITextDocumentDateisystem beibehalten werden.

Jeder Thread kann den Textpuffer bearbeiten, bis ein Thread den Besitz des Textpuffers übernimmt, indem er aufruft TakeThreadOwnership. Danach kann nur dieser Thread Bearbeitungen ausführen.

Ein Textpuffer kann während seiner Lebensdauer viele Versionen durchlaufen. Bei jeder Bearbeitung des Puffers wird eine neue Version generiert, und eine unveränderliche ITextSnapshot Version stellt den Inhalt dieser Version des Puffers dar. Da Text Momentaufnahme unveränderlich ist, können Sie auf einen Text Momentaufnahme in einem beliebigen Thread ohne Einschränkungen zugreifen, auch wenn sich der von ihr dargestellte Textpuffer weiterhin ändert.

Text Momentaufnahme und Text Momentaufnahme Zeilen

Sie können den Inhalt eines Texts Momentaufnahme als Abfolge von Zeichen oder als Abfolge von Zeilen anzeigen. Zeichen und Zeilen werden beide beginnend bei Null indiziert. Ein leerer Text Momentaufnahme enthält Nullzeichen und eine leere Zeile. Eine Zeile wird durch eine beliebige gültige Unicode-Zeilenumbruchzeichensequenz oder durch den Anfang oder das Ende des Puffers getrennt. Zeilenumbruchzeichen werden explizit im Text Momentaufnahme dargestellt, und die Zeilenumbrüche in einem Text Momentaufnahme nicht alle identisch sein müssen.

Hinweis

Weitere Informationen zu Zeilenumbruchzeichen im Visual Studio-Editor finden Sie unter Codierungen und Zeilenumbrüche.

Eine Textzeile wird durch ein ITextSnapshotLine Objekt dargestellt, das aus einem Text Momentaufnahme für eine bestimmte Zeilennummer oder für eine bestimmte Zeichenposition abgerufen werden kann.

SnapshotPoints, SnapshotSpans und NormalizedSnapshotSpanCollections

A SnapshotPoint stellt eine Zeichenposition in einer Momentaufnahme dar. Die Position ist garantiert zwischen Null und der Länge des Momentaufnahme. A SnapshotSpan stellt eine Textspanne in einem Momentaufnahme dar. Ihre Endposition ist garantiert zwischen Null und der Länge des Momentaufnahme. Dies NormalizedSnapshotSpanCollection besteht aus einer Gruppe von SnapshotSpan Objekten aus demselben Momentaufnahme.

Spans and NormalizedSpanCollections

A Span stellt ein Intervall dar, das auf eine Textspanne in einem Text Momentaufnahme angewendet werden kann. Momentaufnahmenpositionen sind nullbasiert, sodass Spans an einer beliebigen Position beginnen können, einschließlich Null. Die End Eigenschaft eines Bereichs entspricht der Summe seiner Start Eigenschaft und seiner Length Eigenschaft. A Span enthält nicht das Zeichen, das von der End Eigenschaft indiziert wird. Beispielsweise enthält eine Spanne mit "Start=5" und "Length=3" "End=8", und sie enthält die Zeichen an den Positionen 5, 6 und 7. Die Schreibweise für diesen Bereich ist [5..8).

Zwei spannen sich überschneiden sich, wenn sie gemeinsame Positionen haben, einschließlich der Endposition. Daher ist die Schnittmenge von [3, 5) und [2, 7) [3, 5) und der Schnittpunkt von [3, 5) und [5, 7) [5, 5) [5, 5). (Beachten Sie, dass [5, 5) eine leere Spanne ist.)

Zwei Spannweiten überlappen sich, wenn sie gemeinsame Positionen haben, mit Ausnahme der Endposition. Eine leere Spanne überlappt niemals eine andere Spanne, und die Überlappung von zwei Spannen ist nie leer.

A NormalizedSpanCollection ist eine Liste von Spannen in der Reihenfolge der Starteigenschaften der Spannen. In der Liste werden überlappende oder überlappende Spannen zusammengeführt. Beispielsweise lautet die normalisierte Liste der Spans [5..9), [0..1), [3..6) und [9..10) [0,.1), [3..10).

ITextEdit-, TextVersion- und Textänderungsbenachrichtigungen

Der Inhalt eines Textpuffers kann mithilfe eines ITextEdit Objekts geändert werden. Das Erstellen eines solchen Objekts (mithilfe einer der CreateEdit() Methoden von ITextBuffer) startet eine Texttransaktion, die aus Textbearbeitungen besteht. Jede Bearbeitung ist ein Ersatz für einige Textspannen im Puffer durch eine Zeichenfolge. Die Koordinaten und inhalte jeder Bearbeitung werden relativ zum Momentaufnahme des Puffers ausgedrückt, wenn die Transaktion gestartet wurde. Das ITextEdit Objekt passt die Koordinaten von Bearbeitungen an, die von anderen Bearbeitungen in derselben Transaktion betroffen sind.

Ziehen Sie beispielsweise einen Textpuffer in Betracht, der diese Zeichenfolge enthält:

abcdefghij

Wenden Sie eine Transaktion an, die zwei Bearbeitungen enthält, eine Bearbeitung, die die Spanne bei [2..4) durch die Verwendung des Zeichens X und eine zweite Bearbeitung ersetzt, die die Spanne bei [6..9) mithilfe des Zeichens Yersetzt. Das Ergebnis ist dieser Puffer:

abXefYj

Die Koordinaten für die zweite Bearbeitung wurden im Hinblick auf den Inhalt des Puffers am Anfang der Transaktion berechnet, bevor die erste Bearbeitung angewendet wurde.

Die Änderungen am Puffer werden wirksam, wenn das ITextEdit Objekt durch Aufrufen seiner Apply() Methode zugesichert wird. Wenn mindestens eine nicht leere Bearbeitung vorhanden war, wird eine neue ITextVersion erstellt, eine neue ITextSnapshot erstellt, und ein Changed Ereignis wird ausgelöst. Jede Textversion weist einen anderen Text Momentaufnahme auf. Ein Text Momentaufnahme stellt den vollständigen Status des Textpuffers nach einer Bearbeitungstransaktion dar, aber eine Textversion beschreibt nur die Änderungen von einem Momentaufnahme zum nächsten. Im Allgemeinen sollen Text Momentaufnahme einmal verwendet und dann aufgehoben werden Karte, während Textversionen einige Zeit wieder Standard lebendig werden müssen.

Eine Textversion enthält eine INormalizedTextChangeCollection. Diese Auflistung beschreibt die Änderungen, die bei Anwendung auf das Momentaufnahme die nachfolgenden Momentaufnahme erzeugen. Jede ITextChange In der Auflistung enthält die Zeichenposition der Änderung, die ersetzte Zeichenfolge und die Ersetzungszeichenfolge. Die ersetzte Zeichenfolge ist für eine einfache Einfügung leer, und die Ersetzungszeichenfolge ist für einen einfachen Löschvorgang leer. Die normalisierte Auflistung ist immer null für die neueste Version des Textpuffers vorgesehen.

Es kann immer nur ein ITextEdit Objekt für einen Textpuffer instanziiert werden, und alle Textbearbeitungen müssen für den Thread ausgeführt werden, der den Textpuffer besitzt (wenn der Besitz beansprucht wurde). Eine Textbearbeitung kann durch Aufrufen seiner Cancel Methode oder Dispose seiner Methode abgebrochen werden.

ITextBufferstellt Insert()außerdem Methoden bereitReplace(), Delete()die denen auf der ITextEdit Schnittstelle ähneln. Das Aufrufen dieser Elemente hat die gleiche Auswirkung wie das Erstellen eines ITextEdit Objekts, das einen ähnlichen Aufruf macht und dann die Bearbeitung anwendet.

Nachverfolgen von Punkten und Nachverfolgungsspannen

Ein Wert ITrackingPoint stellt eine Zeichenposition in einem Textpuffer dar. Wenn der Puffer so bearbeitet wird, dass die Position des Zeichens verschoben wird, wird der Nachverfolgungspunkt damit verschoben. Wenn beispielsweise ein Nachverfolgungspunkt auf Position 10 in einem Puffer verweist und fünf Zeichen am Anfang des Puffers eingefügt werden, bezieht sich der Nachverfolgungspunkt dann auf Position 15. Wenn eine Einfügung genau an der Position erfolgt, die durch den Nachverfolgungspunkt gekennzeichnet ist, wird sein Verhalten durch dessen PointTrackingModeVerhalten bestimmt, das entweder Positive oder Negativesein kann. Wenn der Nachverfolgungsmodus positiv ist, bezieht sich der Nachverfolgungspunkt auf dasselbe Zeichen, das sich jetzt am Ende der Einfügemarke befindet. Wenn der Nachverfolgungsmodus negativ ist, bezieht sich der Nachverfolgungspunkt auf das erste eingefügte Zeichen an der ursprünglichen Position. Wenn das Zeichen an der Position, die durch einen Nachverfolgungspunkt dargestellt wird, gelöscht wird, verschiebt sich der Nachverfolgungspunkt auf das erste Zeichen, das dem gelöschten Bereich folgt. Wenn beispielsweise ein Nachverfolgungspunkt auf das Zeichen an Position 5 verweist und die Zeichen an Positionen 3 bis 6 gelöscht werden, bezieht sich der Nachverfolgungspunkt auf das Zeichen an Position 3.

An ITrackingSpan stellt einen Bereich von Zeichen anstelle von nur einer Position dar. Das Verhalten wird durch sein SpanTrackingModeVerhalten bestimmt. Wenn der SpanTrackingMode.EdgeInclusive-Modus ist, wächst die Nachverfolgungsspanne, um Text zu integrieren, der an seinen Rändern eingefügt wurde. Wenn der SpanTrackingMode.EdgeExclusive-Modus ist, enthält die Nachverfolgungsspanne keinen Text, der an seinen Rändern eingefügt wurde. Wenn der SpanTrackingMode.EdgePositive-Modus jedoch der SpanTrackingMode.EdgePositive ist, verschiebt eine Einfügeposition die aktuelle Position an den Anfang, und wenn der SpanTrackingMode.EdgeNegative-Modus ist, wird die aktuelle Position an das Ende verschoben.

Sie können die Position eines Nachverfolgungspunkts oder die Spanne einer Nachverfolgungsspanne für alle Momentaufnahme des Textpuffers abrufen, zu dem sie gehören. Nachverfolgungspunkte und Nachverfolgungsspannen können von jedem Thread sicher referenziert werden.

Inhaltstypen

Inhaltstypen sind ein Mechanismus zum Definieren verschiedener Arten von Inhalten. Ein Inhaltstyp kann ein Dateityp wie "text", "code" oder "binary" oder ein Technologietyp wie "xml", "vb" oder "c#" sein. Beispielsweise ist das Wort "using" ein Schlüsselwort (keyword) in C# und Visual Basic, aber nicht in anderen Programmiersprachen. Daher wäre die Definition dieser Schlüsselwort (keyword) auf die Inhaltstypen "c#" und "vb" beschränkt.

Inhaltstypen werden als Filter für Schmücken und andere Elemente des Editors verwendet. Viele Editorfeatures und Erweiterungspunkte werden pro Inhaltstyp definiert. Beispielsweise unterscheidet sich die Textfarbe für Nur-Text-Dateien, XML-Dateien und Visual Basic-Quellcodedateien. Textpuffern wird in der Regel beim Erstellen ein Inhaltstyp zugewiesen, und der Inhaltstyp eines Textpuffers kann geändert werden.

Inhaltstypen können von anderen Inhaltstypen mehrfach erben. Auf ContentTypeDefinition diese Weise können Sie mehrere Basistypen als übergeordnete Elemente eines bestimmten Inhaltstyps angeben.

Entwickler können ihre eigenen Inhaltstypen definieren und mithilfe der IContentTypeRegistryService Viele Editorfeatures können in Bezug auf einen bestimmten Inhaltstyp mithilfe der ContentTypeAttributeFolgenden definiert werden. Beispielsweise können Editorränder, Schmücken und Maushandler definiert werden, sodass sie nur für Editoren gelten, die bestimmte Inhaltstypen anzeigen.

Die Textansicht

Der Ansichtsteil des Modellansichtscontrollers (MVC) definiert die Textansicht, die Formatierung der Ansicht, Grafikelemente wie die Bildlaufleiste und das Caret. Alle Präsentationselemente des Visual Studio-Editors basieren auf WPF.

Textansichten

Die ITextView Schnittstelle ist eine plattformunabhängige Darstellung einer Textansicht. Es wird hauptsächlich verwendet, um Textdokumente in einem Fenster anzuzeigen, kann aber auch für andere Zwecke verwendet werden, z. B. in einer QuickInfo.

Die Textansicht verweist auf verschiedene Arten von Textpuffern. Die TextViewModel Eigenschaft bezieht sich auf ein ITextViewModel Objekt, das auf diese drei verschiedenen Textpuffer verweist: der Datenpuffer, der puffer auf oberster Datenebene, der Bearbeitungspuffer, in dem die Bearbeitung erfolgt, und der visuelle Puffer, der in der Textansicht angezeigt wird.

Der Text wird basierend auf den Klassifizierern formatiert, die an den zugrunde liegenden Textpuffer angefügt sind, und wird mit den Anmutungsanbietern versehen, die an die Textansicht selbst angefügt sind.

Das Koordinatensystem für die Textansicht

Das Koordinatensystem für die Textansicht gibt Positionen in der Textansicht an. In diesem Koordinatensystem entspricht der x-Wert 0,0 dem linken Rand des angezeigten Texts, und der y-Wert 0,0 entspricht dem oberen Rand des angezeigten Texts. Die x-Koordinate nimmt von links nach rechts zu, und die Y-Koordinate nimmt von oben nach unten zu.

Ein Viewport (der Teil des im Textfenster sichtbaren Texts) kann nicht horizontal gescrollt werden, wie er vertikal gescrollt wird. Ein Viewport wird horizontal gescrollt, indem seine linke Koordinate so geändert wird, dass er in Bezug auf die Zeichnungsoberfläche verschoben wird. Ein Viewport kann jedoch nur vertikal gescrollt werden, indem der gerenderte Text geändert wird, wodurch ein LayoutChanged Ereignis ausgelöst wird.

Entfernungen im Koordinatensystem entsprechen logischen Pixeln. Wenn die Textrenderingoberfläche ohne Skalierungstransformation angezeigt wird, entspricht eine Einheit im Textrenderingkoordinatensystem einem Pixel auf der Anzeige.

Ränder

Die ITextViewMargin Schnittstelle stellt einen Rand dar und ermöglicht die Kontrolle über die Sichtbarkeit des Rands und deren Größe. Es gibt vier vordefinierte Ränder, die den Namen "Oben", "Links", "Rechts" und "Unten" haben und am oberen, unteren, linken oder rechten Rand einer Ansicht angefügt sind. Diese Ränder sind Container, in denen andere Seitenränder platziert werden können. Die Schnittstelle definiert Methoden, die die Größe des Seitenrands und die Sichtbarkeit eines Seitenrands zurückgeben. Ränder sind visuelle Elemente, die zusätzliche Informationen zur Textansicht bereitstellen, an die sie angefügt sind. Der Zeilenrand zeigt z. B. Zeilennummern für die Textansicht an. Der Glyphenrand zeigt UI-Elemente an.

Die IWpfTextViewMarginProvider Schnittstelle behandelt die Erstellung und Platzierung von Seitenrändern. Seitenränder können in Bezug auf andere Seitenränder sortiert werden. Seitenränder mit höherer Priorität befinden sich näher an der Textansicht. Wenn z. B. zwei linke Ränder vorhanden sind, der Rand A und der Rand B eine niedrigere Priorität als der Rand A haben, wird der Rand B links neben dem Rand A angezeigt.

Der Textansichtshost

Die IWpfTextViewHost Schnittstelle enthält die Textansicht und alle Zusätze, die die Ansicht begleiten, z. B. Bildlaufleisten. Der Textansichtshost enthält auch Ränder, die an einen Rahmen der Ansicht angefügt sind.

Formatierter Text

Der text, der in einer Textansicht angezeigt wird, besteht aus ITextViewLine Objekten. Jede Textansichtszeile entspricht einer Textzeile in der Textansicht. Lange Zeilen im zugrunde liegenden Textpuffer können entweder teilweise verdeckt (wenn der Textumbruch nicht aktiviert ist) oder in mehrere Textansichtszeilen unterteilt werden. Die ITextViewLine Schnittstelle enthält Methoden und Eigenschaften für die Zuordnung zwischen Koordinaten und Zeichen sowie für die Schmücken, die der Linie zugeordnet werden können.

ITextViewLine Objekte werden mithilfe einer IFormattedLineSource Schnittstelle erstellt. Wenn Sie sich nur gedanken über den Text machen, der derzeit in der Ansicht angezeigt wird, können Sie die Formatierungsquelle ignorieren. Wenn Sie sich für das Format von Text interessieren, der nicht in der Ansicht angezeigt wird (z. B. zur Unterstützung eines Rich-Text-Ausschneidens und Einfügens), können IFormattedLineSource Sie Text in einem Textpuffer formatieren.

Die Textansicht formatiert jeweils einzeln ITextSnapshotLine .

Editor-Funktionen

Die Features des Editors sind so konzipiert, dass die Definition des Features von der Implementierung getrennt ist. Der Editor enthält die folgenden Features:

  • Kategorien und Klassifizierer

  • Verzierungen

  • Projektion

  • Gliedern

  • Maus- und Tastenbindungen

  • Vorgänge und Grundtypen

  • IntelliSense

Kategorien und Klassifizierer

Tags sind Markierungen, die einer Textspanne zugeordnet sind. Sie können auf unterschiedliche Weise dargestellt werden, z. B. mithilfe von Textfarbe, Unterstreichungen, Grafiken oder Popups. Klassifizierer sind eine Art von Tag.

Andere Arten von Tags dienen TextMarkerTag zum Hervorheben von Text, OutliningRegionTag zum Gliedern und ErrorTag zum Kompilieren von Fehlern.

Klassifizierungstypen

Eine IClassificationType Schnittstelle stellt eine Äquivalenzklasse dar, bei der es sich um eine abstrakte Textkategorie handelt. Klassifizierungstypen können von anderen Klassifizierungstypen mehrfach erben. Programmierspracheklassifizierungen können z. B. "Schlüsselwort (keyword)", "Kommentar" und "Bezeichner" enthalten, die alle von "Code" erben. Klassifizierungstypen für natürliche Sprachen können "Substantiv", "Verb" und "Adjektiv" enthalten, die alle von "natürlicher Sprache" erben.

Klassifizierungen

Eine Klassifizierung ist eine Instanz eines bestimmten Klassifizierungstyps, in der Regel über einen Textbereich. A ClassificationSpan wird verwendet, um eine Klassifizierung darzustellen. Eine Klassifikationsspanne kann als Bezeichnung betrachtet werden, die eine bestimmte Textspanne abdeckt, und teilt dem System mit, dass diese Textspanne von einem bestimmten Klassifizierungstyp ist.

Classifiers

Ein IClassifier Mechanismus, der Text in eine Reihe von Klassifizierungen umbricht. Klassifizierer müssen für bestimmte Inhaltstypen definiert und für bestimmte Textpuffer instanziiert werden. Clients müssen implementieren IClassifier , um an der Textklassifizierung teilzunehmen.

Klassifiziereraggregatoren

Ein Klassifiziereraggregator ist ein Mechanismus, der alle Klassifizierer für einen Textpuffer in nur einer Gruppe von Klassifizierungen kombiniert. Beispielsweise könnten sowohl ein C#-Klassifizierer als auch ein englischer Klassifizierer Klassifizierungen über einen Kommentar in einer C#-Datei erstellen. Beachten Sie diesen Kommentar:

// This method produces a classifier

Ein C#-Klassifizierer bezeichnet möglicherweise den gesamten Bereich als Kommentar, und der Englische Sprachklassifizierer klassifiziert "produziert" als "Verb" und "Methode" als "Substantiv". Der Aggregator erzeugt eine Reihe von nicht überlappenden Klassifizierungen, und der Typ des Satzes basiert auf allen Beiträge.

Ein Klassifiziereraggregator ist auch ein Klassifizierer, da er Text in eine Reihe von Klassifizierungen umbricht. Der Klassifiziereraggregator stellt außerdem sicher, dass es keine überlappenden Klassifizierungen gibt und dass die Klassifizierungen sortiert sind. Einzelne Klassifizierer können beliebige Klassifikationen in beliebiger Reihenfolge zurückgeben und sich auf irgendeine Weise überlappen.

Klassifizierungsformatierung und Textfarbe

Die Textformatierung ist ein Beispiel für ein Feature, das auf der Textklassifizierung basiert. Sie wird von der Textansichtsebene verwendet, um die Anzeige von Text in einer Anwendung zu bestimmen. Der Textformatierungsbereich hängt von WPF ab, die logische Definition von Klassifizierungen ist jedoch nicht.

Ein Klassifizierungsformat ist eine Reihe von Formatierungseigenschaften für einen bestimmten Klassifizierungstyp. Diese Formate erben vom Format des übergeordneten Elements des Klassifizierungstyps.

Eine IClassificationFormatMap Zuordnung von einem Klassifizierungstyp zu einer Reihe von Textformatierungseigenschaften ist eine Zuordnung. Die Implementierung der Formatzuordnung im Editor behandelt alle Exporte von Klassifizierungsformaten.

Verzierungen

Schmücken sind Grafikeffekte, die nicht direkt mit der Schriftart und Farbe der Zeichen in der Textansicht zusammenhängen. Beispielsweise ist die rote Wellenlinie, die verwendet wird, um Nichtkompilierungscode in vielen Programmiersprachen zu markieren, eine eingebettete Schmücken, und QuickInfos sind Popup-Schmücken. Schmücken werden von UIElement und implementieren ITag. Zwei spezielle Arten von Ziertags sind die SpaceNegotiatingAdornmentTag, für Schmücken, die den gleichen Raum wie der Text in einer Ansicht belegen, und die ErrorTag, für die Wellenlinie unterstrichen.

Eingebettete Schmücken sind Grafiken, die Teil der formatierten Textansicht sind. Sie sind in verschiedenen Z-Ordnungsebenen organisiert. Es gibt drei integrierte Ebenen, wie folgt: Text, Caret und Auswahl. Entwickler können jedoch weitere Ebenen definieren und sie in Bezug aufeinander platzieren. Die drei Arten eingebetteter Schmücken sind textrelative Schmücken (die beim Verschieben des Texts verschoben werden und beim Löschen des Texts gelöscht werden), Ansichtsrelative Schmücken (die mit nicht textbezogenen Teilen der Ansicht zu tun haben) und besitzergesteuerte Schmücken (der Entwickler muss ihre Platzierung verwalten).

Popup-Schmücken sind Grafiken, die in einem kleinen Fenster oberhalb der Textansicht angezeigt werden, z. B. QuickInfos.

Projektion

Projektion ist eine Technik zum Erstellen einer anderen Art von Textpuffer, die text nicht tatsächlich speichert, sondern Text aus anderen Textpuffern kombiniert. Beispielsweise kann ein Projektionspuffer verwendet werden, um den Text aus zwei anderen Puffern zu verketten und das Ergebnis so darzustellen, als wäre er nur in einem Puffer enthalten oder um Teile des Texts in einem Puffer auszublenden. Ein Projektionspuffer kann als Quellpuffer für einen anderen Projektionspuffer fungieren. Eine Reihe von Puffern, die durch Projektion zusammenhängen, können so konstruiert werden, dass Text auf vielfältige Weise neu anordnen kann. (Ein solcher Satz wird auch als Pufferdiagramm bezeichnet.) Das Visual Studio-Textausleitungsfeature wird mithilfe eines Projektionspuffers implementiert, um den reduzierten Text auszublenden, und der Visual Studio-Editor für ASP.NET Seiten verwendet Projektion, um eingebettete Sprachen wie Visual Basic und C# zu unterstützen.

Es IProjectionBuffer wird mithilfe IProjectionBufferFactoryServicevon . Ein Projektionspuffer wird durch eine geordnete Abfolge von ITrackingSpan Objekten dargestellt, die als Quellspannen bezeichnet werden. Der Inhalt dieser Spannen wird als Abfolge von Zeichen dargestellt. Die Textpuffer, aus denen die Quellspanne gezeichnet werden, sind benannte Quellpuffer. Clients eines Projektionspuffers müssen nicht beachten, dass sie sich von einem normalen Textpuffer unterscheidet.

Der Projektionspuffer lauscht auf Textänderungsereignisse in den Quellpuffern. Wenn sich der Text in einer Quellspanne ändert, ordnet der Projektionspuffer die geänderten Textkoordinaten seinen eigenen Koordinaten zu und löst entsprechende Textänderungsereignisse aus. Betrachten Sie z. B. Quellpuffer A und B mit den folgenden Inhalten:

A: ABCDE
B: vwxyz

Wenn der Projektionspuffer P aus zwei Textabschnitten gebildet wird, eine mit dem gesamten Puffer A und dem anderen, der alle Puffer B enthält, hat P den folgenden Inhalt:

P: ABCDEvwxyz

Wenn die Teilzeichenfolge xy aus Puffer B gelöscht wird, löst Puffer P ein Ereignis aus, das angibt, dass die Zeichen an den Positionen 7 und 8 gelöscht wurden.

Der Projektionspuffer kann auch direkt bearbeitet werden. Es verteilt Bearbeitungen an die entsprechenden Quellpuffer. Wenn beispielsweise eine Zeichenfolge an Position 6 (die ursprüngliche Position des Zeichens "v") in Puffer P eingefügt wird, wird die Einfügung an Puffer B an Position 1 weitergegeben.

Es gibt Einschränkungen für die Quellspanne, die zu einem Projektionspuffer beitragen. Die Quellspanne überlappt möglicherweise nicht; Eine Position in einem Projektionspuffer kann nicht mehreren Speicherorten in einem Quellpuffer zugeordnet werden, und eine Position in einem Quellpuffer kann nicht mehreren Speicherorten in einem Projektionspuffer zugeordnet werden. In der Quellpufferbeziehung sind keine Zirkelitäten zulässig.

Ereignisse werden ausgelöst, wenn sich der Satz von Quellpuffern für einen Projektionspuffer ändert und wenn sich der Quellsatz über änderungen erstreckt. Ein Elisionpuffer ist eine spezielle Art von Projektionspuffer. Es wird in erster Linie für Die Gliederung und für Vorgänge verwendet, die Textblöcke erweitern und reduzieren. Ein Elisionpuffer basiert nur auf einem Quellpuffer, und die Spannen im Elisionpuffer müssen mit der Reihenfolge im Quellpuffer sortiert werden.

Pufferdiagramm

Die IBufferGraph Schnittstelle ermöglicht die Zuordnung über ein Diagramm von Projektionspuffern. Alle Textpuffer und Projektionspuffer werden in einem gerichteten azyklischen Diagramm gesammelt, ähnlich wie die abstrakte Syntaxstruktur, die von einem Sprachcompiler erstellt wird. Das Diagramm wird durch den oberen Puffer definiert, bei dem es sich um einen beliebigen Textpuffer handelt. Das Pufferdiagramm kann von einem Punkt im oberen Puffer zu einem Punkt in einem Quellpuffer oder von einer Spanne im oberen Puffer bis zu einer Reihe von Spans in einem Quellpuffer zuordnen. Ebenso kann er einen Punkt oder eine Spanne von einem Quellpuffer zu einem Punkt im oberen Puffer zuordnen. Pufferdiagramme werden mithilfe der IBufferGraphFactoryService.

Ereignisse und Projektionspuffer

Wenn ein Projektionspuffer geändert wird, werden die Änderungen vom Projektionspuffer an die Puffer gesendet, die davon abhängig sind. Nachdem alle Puffer geändert wurden, werden Pufferänderungsereignisse ausgelöst, beginnend mit dem tiefsten Puffer.

Gliedern

Das Gliedern ist die Möglichkeit, unterschiedliche Textblöcke in einer Textansicht zu erweitern oder zu reduzieren. Die Gliederung wird als eine Art von ITag, auf die gleiche Weise wie Schmücken definiert. A OutliningRegionTag ist ein Tag, das einen Textbereich definiert, der erweitert oder reduziert werden kann. Um die Gliederung verwenden zu können, müssen Sie das IOutliningManagerService Element importieren, um ein IOutliningManagerElement abzurufen. Der Glieder-Manager listet auf, reduziert und erweitert die verschiedenen Blöcke, die als ICollapsible Objekte dargestellt werden, und löst Ereignisse entsprechend aus.

Mausbindungen

Mausbindungen verknüpfen Mausbewegungen mit verschiedenen Befehlen. Mausbindungen werden mithilfe einer IMouseProcessorProviderTaste definiert, und Tastenbindungen werden mithilfe einer IKeyProcessorProvider. Alle IWpfTextViewHost Bindungen werden automatisch instanziiert und mit Mausereignissen in der Ansicht verbunden.

Die IMouseProcessor Schnittstelle enthält Vorprozess- und Nachprozessereignishandler für verschiedene Mausereignisse. Um eines der Ereignisse zu behandeln, können Sie einige der Methoden in überschreiben.MouseProcessorBase

Editorvorgänge

Editorvorgänge können verwendet werden, um die Interaktion mit dem Editor für Skripts oder andere Zwecke zu automatisieren. Sie können die IEditorOperationsFactoryService Zugriffsvorgänge für einen bestimmten ITextViewTyp importieren. Anschließend können Sie diese Objekte verwenden, um die Auswahl zu ändern, die Ansicht zu scrollen oder das Caret in verschiedene Teile der Ansicht zu verschieben.

IntelliSense

IntelliSense unterstützt anweisungserledigung, Signaturhilfe (auch als Parameterinformationen bezeichnet), QuickInfo und Glühbirnen.

Der Abschluss der Anweisung enthält Popuplisten potenzieller Fertigstellungen für Methodennamen, XML-Elemente und andere Codierungs- oder Markupelemente. Im Allgemeinen ruft eine Benutzergeste eine Abschlusssitzung auf. In der Sitzung wird die Liste der potenziellen Fertigstellungen angezeigt, und der Benutzer kann eine liste auswählen oder schließen. Dies ICompletionBroker ist für das Erstellen und Auslösen der ICompletionSession. Die ICompletionSource Berechnung der CompletionSet Abschlusselemente für die Sitzung.

Problembehandlung bei Import-/Exportproblemen: Zugreifen auf das MEF-Kompositionsfehlerprotokoll

Möglicherweise treten Probleme auf, wenn Sie versuchen, etwas zu importieren, das in der aktuellen VS-Installation nicht vorhanden ist, oder wenn Sie den Import oder Export falsch erstellen. Die primäre Möglichkeit, diese Probleme zu finden und zu beheben, besteht darin, auf das MEF-Kompositionsfehlerprotokoll (Managed Extensibility Framework) zu verweisen, das unter %localappdata%\Microsoft\VisualStudio[yourVSVersion]\ComponentModelCache\Microsoft.VisualStudio.Default.err gespeichert ist.