Erweiterungspunkte für den Sprachdienst und den Editor

Der Editor stellt Erweiterungspunkte bereit, die Sie als MeF-Komponentenkomponenten (Managed Extensibility Framework) erweitern können, einschließlich der meisten Sprachdienstfeatures. Dies sind die Standard Erweiterungspunktkategorien:

  • Inhaltstypen

  • Klassifizierungstypen und Klassifizierungsformate

  • Seitenränder und Bildlaufleisten

  • Tags

  • Verzierungen

  • Mausprozessoren

  • Drophandler

  • Optionen

  • IntelliSense

Erweitern von Inhaltstypen

Inhaltstypen sind die Definitionen der Vom Editor behandelten Textarten, z. B. "Text", "Code" oder "CSharp". Sie definieren einen neuen Inhaltstyp, indem Sie eine Variable des Typs ContentTypeDefinition deklarieren und dem neuen Inhaltstyp einen eindeutigen Namen geben. Um den Inhaltstyp beim Editor zu registrieren, exportieren Sie ihn zusammen mit den folgenden Attributen:

  • NameAttribute ist der Name des Inhaltstyps.

  • BaseDefinitionAttribute ist der Name des Inhaltstyps, von dem dieser Inhaltstyp abgeleitet wird. Ein Inhaltstyp kann von mehreren anderen Inhaltstypen erben.

    Da die ContentTypeDefinition Klasse versiegelt ist, können Sie sie ohne Typparameter exportieren.

    Das folgende Beispiel zeigt Exportattribute für eine Inhaltstypdefinition.

[Export]
[Name("test")]
[BaseDefinition("code")]
[BaseDefinition("projection")]
internal static ContentTypeDefinition TestContentTypeDefinition;

Inhaltstypen können auf null oder mehr vorhandenen Inhaltstypen basieren. Dies sind die integrierten Typen:

  • Jeder: der grundlegende Inhaltstyp. Übergeordnetes Element aller anderen Inhaltstypen.

  • Text: der grundlegende Typ für Nicht-Projektionsinhalte. Erbt von "any".

  • Nur-Text: für Nicht-Code-Text. Erbt von "text".

  • Code: für Code aller Art. Erbt von "text".

  • Inert: schließt den Text aus jeder Art von Verarbeitung aus. Der Text dieses Inhaltstyps wird niemals auf ihn angewendet.

  • Projektion: für den Inhalt von Projektionspuffern. Erbt von "any".

  • IntelliSense: für den Inhalt von IntelliSense. Erbt von "text".

  • Sighelp: Signaturhilfe. Erbt von "intellisense".

  • Sighelp-doc: Dokumentation zur Signaturhilfe. Erbt von "intellisense".

    Dies sind einige der Inhaltstypen, die von Visual Studio definiert werden, und einige der Sprachen, die in Visual Studio gehostet werden:

  • Grundlegend

  • C/C++

  • ConsoleOutput

  • CSharp

  • CSS

  • ENC

  • FindResults

  • F#

  • HTML

  • JScript

  • XAML

  • XML

    Um die Liste der verfügbaren Inhaltstypen zu ermitteln, importieren Sie die IContentTypeRegistryService, die Standard die Sammlung von Inhaltstypen für den Editor enthält. Der folgende Code importiert diesen Dienst als Eigenschaft.

[Import]
internal IContentTypeRegistryService ContentTypeRegistryService { get; set; }

Um einen Inhaltstyp einer Dateinamenerweiterung zuzuordnen, verwenden Sie FileExtensionToContentTypeDefinition.

Hinweis

In Visual Studio werden Dateinamenerweiterungen mithilfe des ProvideLanguageExtensionAttribute Sprachdienstpakets registriert. Der FileExtensionToContentTypeDefinition ordnet einen MEF-Inhaltstyp einer Dateinamenerweiterung zu, die auf diese Weise registriert wurde.

Um die Dateinamenerweiterung in die Inhaltstypdefinition zu exportieren, müssen Sie die folgenden Attribute einschließen:

[Export]
[FileExtension(".test")]
[ContentType("test")]
internal static FileExtensionToContentTypeDefinition TestFileExtensionDefinition;

Die IFileExtensionRegistryService Zuordnungen zwischen Dateinamenerweiterungen und Inhaltstypen werden verwaltet.

Erweitern von Klassifizierungstypen und Klassifizierungsformaten

Sie können Klassifizierungstypen verwenden, um die Arten von Text zu definieren, für die Sie eine unterschiedliche Behandlung bereitstellen möchten (z. B. Die Farbe des "Schlüsselwort (keyword)"-Texts und des "Kommentartexts" grün). Definieren Sie einen neuen Klassifizierungstyp, indem Sie eine Variable vom Typ ClassificationTypeDefinition deklarieren und ihm einen eindeutigen Namen geben.

Um den Klassifizierungstyp beim Editor zu registrieren, exportieren Sie ihn zusammen mit den folgenden Attributen:

  • NameAttribute: der Name des Klassifizierungstyps.

  • BaseDefinitionAttribute: der Name des Klassifizierungstyps, von dem dieser Klassifizierungstyp erbt. Alle Klassifizierungstypen erben von "Text", und ein Klassifizierungstyp kann von mehreren anderen Klassifizierungstypen erben.

    Da die ClassificationTypeDefinition Klasse versiegelt ist, können Sie sie ohne Typparameter exportieren.

    Das folgende Beispiel zeigt Exportattribute für eine Klassifizierungstypdefinition.

[Export]
[Name("csharp.test")]
[BaseDefinition("test")]
internal static ClassificationTypeDefinition CSharpTestDefinition;

Der IStandardClassificationService Zugriff auf Standardklassifizierungen wird bereitgestellt. Zu den integrierten Klassifizierungstypen gehören die folgenden:

  • "text"

  • "natürliche Sprache" (abgeleitet von "Text")

  • "formale Sprache" (abgeleitet von "Text")

  • "string" (abgeleitet von "literal")

  • "character" (abgeleitet von "literal")

  • "numerisch" (abgeleitet von "literal")

    Eine Reihe unterschiedlicher Fehlertypen erben von ErrorTypeDefinition. Dazu gehören die folgenden Fehlertypen:

  • "Syntaxfehler"

  • "Compilerfehler"

  • "Anderer Fehler"

  • "Warnung"

    Um die Liste der verfügbaren Klassifizierungstypen zu ermitteln, importieren Sie die IClassificationTypeRegistryService, Standard die Sammlung von Klassifizierungstypen für den Editor enthält. Der folgende Code importiert diesen Dienst als Eigenschaft.

[Import]
internal IClassificationTypeRegistryService ClassificationTypeRegistryService { get; set; }

Sie können eine Klassifizierungsformatdefinition für ihren neuen Klassifizierungstyp definieren. Leiten Sie eine Klasse ab ClassificationFormatDefinition , und exportieren Sie sie mit dem Typ EditorFormatDefinitionzusammen mit den folgenden Attributen:

[Export(typeof(EditorFormatDefinition))]
[ClassificationType(ClassificationTypeNames = "test")]
[Name("test")]
[DisplayName("Test")]
[UserVisible(true)]
[Order(After = Priority.Default, Before = Priority.High)]
internal sealed class TestFormat : ClassificationFormatDefinition

Um die Liste der verfügbaren Formate zu ermitteln, importieren Sie die IEditorFormatMapService, die die Sammlung der Formate für den Editor Standard enthält. Der folgende Code importiert diesen Dienst als Eigenschaft.

[Import]
internal IEditorFormatMapService FormatMapService { get; set; }

Erweitern von Seitenrändern und Bildlaufleisten

Seitenränder und Bildlaufleisten sind die Standard Ansichtselemente des Editors zusätzlich zur Textansicht selbst. Sie können zusätzlich zu den Standardrändern, die um die Textansicht angezeigt werden, eine beliebige Anzahl von Seitenrändern angeben.

Implementieren Sie eine IWpfTextViewMargin Schnittstelle, um einen Rand zu definieren. Sie müssen auch die IWpfTextViewMarginProvider Schnittstelle implementieren, um den Rand zu erstellen.

Um den Margin-Anbieter beim Editor zu registrieren, müssen Sie den Anbieter zusammen mit den folgenden Attributen exportieren:

  • NameAttribute: der Name des Rands.

  • OrderAttribute: die Reihenfolge, in der der Rand angezeigt wird, relativ zu den anderen Seitenrändern.

    Dies sind die integrierten Seitenränder:

    • "Wpf Horizontaler Bildlaufleiste"

    • "Wpf Vertical Scrollbar"

    • "Wpf Line Number Margin"

      Horizontale Ränder mit einem Order-Attribut After="Wpf Horizontal Scrollbar" werden unterhalb des integrierten Rands angezeigt, und horizontale Seitenränder mit einem Order-Attribut Before ="Wpf Horizontal Scrollbar" werden über dem integrierten Rand angezeigt. Rechte vertikale Seitenränder mit einem Order-Attribut After="Wpf Vertical Scrollbar" werden rechts neben der Bildlaufleiste angezeigt. Linke vertikale Seitenränder mit einem Order-Attribut After="Wpf Line Number Margin" links neben dem Zeilennummernrand (sofern sichtbar).

  • MarginContainerAttribute: Die Art des Rands (links, rechts, oben oder unten).

  • ContentTypeAttribute: Die Art des Inhalts (z. B. "Text" oder "Code"), für den der Rand gültig ist.

    Das folgende Beispiel zeigt Exportattribute für einen Seitenrandanbieter für einen Rand, der rechts neben dem Zeilennummernrand angezeigt wird.

[Export(typeof(IWpfTextViewMarginProvider))]
[Name("TestMargin")]
[Order(Before = "Wpf Line Number Margin")]
[MarginContainer(PredefinedMarginNames.Left)]
[ContentType("text")]

Erweitern von Tags

Tags sind eine Möglichkeit zum Zuordnen von Daten zu verschiedenen Textarten. In vielen Fällen werden die zugehörigen Daten als visueller Effekt angezeigt, aber nicht alle Tags weisen eine visuelle Präsentation auf. Sie können ihre eigene Art von Tag definieren, indem Sie diese implementieren ITag. Sie müssen auch implementieren ITagger<T> , um die Tags für einen bestimmten Satz von Textspannen bereitzustellen, und einen ITaggerProvider , um den Tagger bereitzustellen. Sie müssen den Tagger-Anbieter zusammen mit den folgenden Attributen exportieren:

  • ContentTypeAttribute: Die Art des Inhalts (z. B. "Text" oder "Code"), für den Ihr Tag gültig ist.

  • TagTypeAttribute: die Art von Tag.

    Das folgende Beispiel zeigt Exportattribute für einen Tagger-Anbieter.

<CodeContentPlaceHolder>8 Die folgenden Arten von Tag sind integriert:

[Import]
internal IViewTagAggregatorFactoryService ViewTagAggregatorFactoryService { get; set; }

Tags und MarkerFormatDefinitions

Sie können die MarkerFormatDefinition Klasse erweitern, um die Darstellung eines Tags zu definieren. Sie müssen Ihre Klasse (als ) EditorFormatDefinitionmit den folgenden Attributen exportieren:

  • NameAttribute: Der Name, der verwendet wird, um auf dieses Format zu verweisen

  • UserVisibleAttribute: Dies bewirkt, dass das Format in der Benutzeroberfläche angezeigt wird.

    Im Konstruktor definieren Sie den Anzeigenamen und die Darstellung des Tags. BackgroundColor definiert die Füllfarbe und ForegroundColor definiert die Rahmenfarbe. Dies DisplayName ist der lokalisierbare Name der Formatdefinition.

    Im Folgenden sehen Sie ein Beispiel für eine Formatdefinition:

[Export(typeof(EditorFormatDefinition))]
[Name("MarkerFormatDefinition/HighlightWordFormatDefinition")]
[UserVisible(true)]
internal class HighlightWordFormatDefinition : MarkerFormatDefinition
{
    public HighlightWordFormatDefinition()
    {
        this.BackgroundColor = Colors.LightBlue;
        this.ForegroundColor = Colors.DarkBlue;
        this.DisplayName = "Highlight Word";
        this.ZOrder = 5;
    }
}

Wenn Sie diese Formatdefinition auf ein Tag anwenden möchten, verweisen Sie auf den Namen, den Sie im Namensattribute der Klasse festgelegt haben (nicht auf den Anzeigenamen).

Hinweis

Ein Beispiel für ein Beispiel für ein MarkerFormatDefinition, siehe die HighlightWordFormatDefinition-Klasse in Exemplarische Vorgehensweise: Hervorheben von Text.

Erweitern von Schmücken

Schmücken definieren visuelle Effekte, die entweder dem Text hinzugefügt werden können, der in einer Textansicht oder der Textansicht selbst angezeigt wird. Sie können Ihre eigene Dekoration als jede Art von UIElement.

In Ihrer Schmückenklasse müssen Sie eine AdornmentLayerDefinitiondeklarieren. Um Ihre Verzierungsebene zu registrieren, exportieren Sie sie zusammen mit den folgenden Attributen:

  • NameAttribute: der Name des Zierchens.

  • OrderAttribute: die Anordnung des Zierchens in Bezug auf andere Zierschichten. Die Klasse PredefinedAdornmentLayers definiert vier Standardebenen: Selection, Outlining, Caret und Text.

    Das folgende Beispiel zeigt Exportattribute in einer Schmückenebenendefinition.

[Export]
[Name("TestEmbeddedAdornment")]
[Order(After = PredefinedAdornmentLayers.Selection, Before = PredefinedAdornmentLayers.Text)]
internal AdornmentLayerDefinition testLayerDefinition;

Sie müssen eine zweite Klasse erstellen, die das TextViewCreated Ereignis implementiert IWpfTextViewCreationListener und behandelt, indem Sie die Dekoration instanziieren. Sie müssen diese Klasse zusammen mit den folgenden Attributen exportieren:

  • ContentTypeAttribute: Die Art des Inhalts (z. B. "Text" oder "Code"), für den die Verzierung gültig ist.

  • TextViewRoleAttribute: die Art der Textansicht, für die dieses Zierelement gültig ist. Die Klasse PredefinedTextViewRoles verfügt über den Satz vordefinierter Textansichtsrollen. Wird beispielsweise Document hauptsächlich für Textansichten von Dateien verwendet. Interactive wird für Textansichten verwendet, die ein Benutzer mithilfe einer Maus und Tastatur bearbeiten oder navigieren kann. Beispiele für Interactive Ansichten sind die Editortextansicht und das Ausgabefenster .

    Das folgende Beispiel zeigt Exportattribute für den Zieranbieter.

[Export(typeof(IWpfTextViewCreationListener))]
[ContentType("csharp")]
[TextViewRole(PredefinedTextViewRoles.Document)]
internal sealed class TestAdornmentProvider : IWpfTextViewCreationListener

Ein Raumverhandlungszierer ist ein Platz, der Platz auf derselben Ebene wie der Text belegt. Um diese Art von Verzierung zu erstellen, müssen Sie eine Tagklasse definieren, von SpaceNegotiatingAdornmentTagder geerbt wird, die den Raum definiert, den die Verzierung belegt.

Wie bei allen Schmücken müssen Sie die Definition der Zierschicht exportieren.

[Export]
[Name("TestAdornment")]
[Order(After = DefaultAdornmentLayers.Text)]
internal AdornmentLayerDefinition testAdornmentLayer;

Um die Raumverhandlung zu instanziieren, müssen Sie eine Klasse erstellen, die zusätzlich ITaggerProviderzu der Klasse implementiert wird, die implementiert IWpfTextViewCreationListener wird (wie bei anderen Arten von Schmücken).

Um den Taggeranbieter zu registrieren, müssen Sie ihn zusammen mit den folgenden Attributen exportieren:

  • ContentTypeAttribute: Die Art des Inhalts (z. B. "Text" oder "Code"), für den Ihre Dekoration gültig ist.

  • TextViewRoleAttribute: Die Art der Textansicht, für die dieses Tag oder dieses Zierzeichen gültig ist. Die Klasse PredefinedTextViewRoles verfügt über den Satz vordefinierter Textansichtsrollen. Wird beispielsweise Document hauptsächlich für Textansichten von Dateien verwendet. Interactive wird für Textansichten verwendet, die ein Benutzer mithilfe einer Maus und Tastatur bearbeiten oder navigieren kann. Beispiele für Interactive Ansichten sind die Editortextansicht und das Ausgabefenster .

  • TagTypeAttribute: die Art von Tag oder Zierung, die Sie definiert haben. Sie müssen eine Sekunde TagTypeAttribute für SpaceNegotiatingAdornmentTag.

    Das folgende Beispiel zeigt Exportattribute des Tagger-Anbieters für ein Tagger-Ziertag mit Platzverhandlung.

[Export(typeof(ITaggerProvider))]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Document)]
[TagType(typeof(SpaceNegotiatingAdornmentTag))]
[TagType(typeof(TestSpaceNegotiatingTag))]
internal sealed class TestTaggerProvider : ITaggerProvider

Erweitern von Mausprozessoren

Sie können spezielle Behandlung für Mauseingaben hinzufügen. Erstellen Sie eine Klasse, die von MouseProcessorBase den Mausereignissen erbt und sie für die Eingabe überschreibt, die Sie behandeln möchten. Sie müssen sie auch in einer zweiten Klasse implementieren IMouseProcessorProvider und zusammen mit der, die ContentTypeAttribute die Art des Inhalts (z. B. "Text" oder "Code") angibt, für die der Maushandler gültig ist.

Das folgende Beispiel zeigt Exportattribute für einen Mausprozessoranbieter.

[Export(typeof(IMouseProcessorProvider))]
[Name("test mouse processor")]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Interactive)]
internal sealed class TestMouseProcessorProvider : IMouseProcessorProvider

Erweitern von Drophandlern

Sie können das Verhalten von Drophandlern für bestimmte Textarten anpassen, indem Sie eine Klasse erstellen, die implementiert IDropHandler wird, und eine zweite Klasse, die zum Erstellen des Drophandlers IDropHandlerProvider implementiert wird. Sie müssen den Drophandler zusammen mit den folgenden Attributen exportieren:

  • DropFormatAttribute: das Textformat, für das dieser Drophandler gültig ist. Die folgenden Formate werden in der Reihenfolge der Priorität von der höchsten bis zur niedrigsten Behandelt:

    1. Beliebiges benutzerdefiniertes Format

    2. Filedrop

    3. EnhancedMetafile

    4. Waveaudio

    5. Riff

    6. Dif

    7. Gebietsschema

    8. Palette

    9. PenData

    10. Serialisierbar

    11. SymbolicLink

    12. XAML

    13. XamlPackage

    14. Tiff

    15. Bitmap

    16. Dib

    17. MetafilePicture

    18. CSV

    19. System.String

    20. HTML-Format

    21. Unicodetext

    22. OEMText

    23. Text

  • NameAttribute: der Name des Drophandlers.

  • OrderAttribute: die Sortierung des Drophandlers vor oder nach dem Standardablagehandler. Der Standardmäßige Drophandler für Visual Studio heißt "DefaultFileDropHandler".

    Das folgende Beispiel zeigt Exportattribute für einen Drophandleranbieter.

[Export(typeof(IDropHandlerProvider))]
[DropFormat("Text")]
[Name("TestDropHandler")]
[Order(Before="DefaultFileDropHandler")]
internal class TestDropHandlerProvider : IDropHandlerProvider

Erweitern von Editoroptionen

Sie können Optionen definieren, die nur in einem bestimmten Bereich gültig sind, z. B. in einer Textansicht. Der Editor bietet diese Gruppe vordefinierter Optionen: Editoroptionen, Ansichtsoptionen und WPF-Ansichtsoptionen (Windows Presentation Foundation). Diese Optionen finden Sie in DefaultOptions, DefaultTextViewOptionsund DefaultWpfViewOptions.

Um eine neue Option hinzuzufügen, leiten Sie eine Klasse von einer der folgenden Optionsdefinitionsklassen ab:

[Export(typeof(EditorOptionDefinition))]
internal sealed class TestOption : EditorOptionDefinition<bool>

Erweitern von IntelliSense

IntelliSense ist ein allgemeiner Begriff für eine Gruppe von Features, die Informationen über strukturierten Text und den Abschluss von Anweisungen dafür bereitstellen. Zu diesen Features gehören Anweisungsabschluss, Signaturhilfe, QuickInfo und Glühbirnen. Der Abschluss der Anweisung hilft Benutzern, eine Sprache Schlüsselwort (keyword) oder Membernamen richtig einzugeben. Die Signaturhilfe zeigt die Signatur oder Signaturen für die Methode an, die der Benutzer gerade eingegeben hat. QuickInfo zeigt eine vollständige Signatur für einen Typ- oder Elementnamen an, wenn die Maus darauf zeigt. Glühbirne bietet zusätzliche Aktionen für bestimmte Bezeichner in bestimmten Kontexten, z. B. das Umbenennen aller Vorkommen einer Variablen, nachdem ein Vorkommen umbenannt wurde.

Das Design eines IntelliSense-Features ist in allen Fällen ähnlich:

  • Ein IntelliSense-Broker ist für den gesamten Prozess verantwortlich.

  • Eine IntelliSense-Sitzung stellt die Abfolge von Ereignissen zwischen dem Auslösen des Referenten und dem Commit oder Abbruch der Auswahl dar. Die Sitzung wird in der Regel durch eine Benutzergeste ausgelöst.

  • Ein IntelliSense-Controller ist für die Entscheidung verantwortlich, wann die Sitzung gestartet und beendet werden soll. Sie entscheidet auch, wann die Informationen zugesichert werden sollen und wann die Sitzung abgebrochen werden soll.

  • Eine IntelliSense-Quelle stellt den Inhalt bereit und entscheidet über die beste Übereinstimmung.

  • Ein IntelliSense-Referenten ist für die Anzeige des Inhalts verantwortlich.

    In den meisten Fällen wird empfohlen, mindestens eine Quelle und einen Controller bereitzustellen. Sie können auch einen Referenten bereitstellen, wenn Sie die Anzeige anpassen möchten.

Implementieren einer IntelliSense-Quelle

Zum Anpassen einer Quelle müssen Sie eine (oder mehrere) der folgenden Quellschnittstellen implementieren:

Wichtig

ISmartTagSource wurde zugunsten von ISuggestedActionsSource.

Darüber hinaus müssen Sie einen Anbieter derselben Art implementieren:

Sie müssen den Anbieter zusammen mit den folgenden Attributen exportieren:

  • NameAttribute: der Name der Quelle.

  • ContentTypeAttribute: die Art des Inhalts (z. B. "Text" oder "Code"), auf den die Quelle angewendet wird.

  • OrderAttribute: die Reihenfolge, in der die Quelle angezeigt werden soll (in Bezug auf andere Quellen).

  • Das folgende Beispiel zeigt Exportattribute für einen Abschlussquellanbieter.

Export(typeof(ICompletionSourceProvider))]
[Name(" Test Statement Completion Provider")]
[Order(Before = "default")]
[ContentType("text")]
internal class TestCompletionSourceProvider : ICompletionSourceProvider

Weitere Informationen zum Implementieren von IntelliSense-Quellen finden Sie in den folgenden exemplarischen Vorgehensweisen:

Implementieren eines IntelliSense-Controllers

Zum Anpassen eines Controllers müssen Sie die IIntellisenseController Schnittstelle implementieren. Darüber hinaus müssen Sie einen Controlleranbieter zusammen mit den folgenden Attributen implementieren:

  • NameAttribute: der Name des Controllers.

  • ContentTypeAttribute: die Art des Inhalts (z. B. "Text" oder "Code"), auf den der Controller angewendet wird.

  • OrderAttribute: die Reihenfolge, in der der Verantwortliche angezeigt werden soll (im Hinblick auf andere Verantwortliche).

    Das folgende Beispiel zeigt Exportattribute für einen Abschlusscontrolleranbieter.

Export(typeof(IIntellisenseControllerProvider))]
[Name(" Test Controller Provider")]
[Order(Before = "default")]
[ContentType("text")]
internal class TestIntellisenseControllerProvider : IIntellisenseControllerProvider

Weitere Informationen zur Verwendung von IntelliSense-Controllern finden Sie in den folgenden exemplarischen Vorgehensweisen: