Points d'extension de l'éditeur

L'éditeur fournit des points d'extension que vous pouvez étendre comme éléments managées (MEF) managed extensibility framework. Il s'agit des catégories principales de point d'extension :

  • Types de contenu

  • Types de classification et formats de classification

  • Marges et les barres de défilement

  • Balises

  • Ornements

  • Processeurs de la souris

  • Gestionnaires de déplacement

  • Options

  • IntelliSense

Étendre des types de contenu

Les types de contenu sont les définitions des types de texte gérés par l'éditeur, par exemple, « texte », « code », ou « CSharp ». Vous définissez un nouveau type de contenu lorsque vous déclarez une variable du type ContentTypeDefinition et en donnant au nouveau type de contenu un nom unique. Pour stocker le type de contenu dans l'éditeur, l'exporter avec les attributs suivants :

  • NameAttribute est le nom du type de contenu.

  • BaseDefinitionAttribute est le nom du type de contenu à partir duquel ce type de contenu est dérivé. Un type de contenu peut hériter de plusieurs mappages d'autres types de contenu.

Étant donné que la classe d' ContentTypeDefinition est sealed, vous pouvez les exporter sans le paramètre de type.

L'exemple suivant montre des attributs d'exportation d'une définition de type de contenu.

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

Les types de contenu peuvent être basés sur les types de contenu zéro ou plus pré-existants. Ce sont les types intégrés :

  • Quels : le type de contenu de base. Parent de tous les autres types de contenu.

  • Texte : le type de base pour le contenu de non-projection. En hérite de «  ».

  • Texte brut : pour le texte du code. Hérite de « texte ».

  • Le code : pour le code de tous les types. Hérite de « texte ».

  • Inerte : exclut du texte de tout genre de gestion. Le texte de ce type de contenu ne sera jamais toute extension appliquée à celui-ci.

  • Projection : pour le contenu des mémoires tampons de projection. En hérite de «  ».

  • Intellisense : pour le contenu Intellisense. Hérite de « texte ».

  • Sighelp : assistance de signature. Hérite de « intellisense ».

  • Sighelp-doc : documentation d'assistance de signature. Hérite de « intellisense ».

Voici une partie des types de contenu qui sont définis par Visual Studio et certains langages hébergés dans Visual Studio :

  • Basic

  • C/C++

  • ConsoleOutput

  • CSharp

  • CSS

  • P.J.

  • FindResults

  • F#

  • HTML

  • JScript

  • XAML

  • XML

Pour obtenir la liste des types de contenu disponibles, importez IContentTypeRegistryService, qui gère la collection de types de contenu pour l'éditeur. Le code suivant importe ce service en tant que propriété.

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

Pour associer un type de contenu à une extension de nom de fichier, utilisez FileExtensionToContentTypeDefinition.

Notes

Dans Visual Studio, les extensions enregistrées à l'aide de ProvideLanguageExtensionAttribute sur un package de service de langage.FileExtensionToContentTypeDefinition associe un type de contenu MEF dont l'extension de nom de fichier qui a été signalée de cette manière.

Pour exporter l'extension de nom de fichier à la définition de type de contenu, vous devez inclure les attributs suivants :

Étant donné que la classe d' FileExtensionToContentTypeDefinition est sealed, vous pouvez les exporter sans le paramètre de type.

L'exemple suivant montre des attributs d'exportation sur une extension de nom de fichier à une définition de type de contenu.

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

IFileExtensionRegistryService gère les associations entre les extensions de nom de fichier et les types de contenu.

Étendre les types de classification et des formats de classification

Vous pouvez utiliser les types de classification pour définir les types de texte pour lequel vous souhaitez fournir la gestion différente (par exemple, couleur bleue de texte « motclé » et le vert de texte de commentaire «  »). Définissez un type de classification lorsque vous déclarez une variable de type ClassificationTypeDefinition et en lui attribuant un nom unique.

Pour stocker le type de classification avec l'éditeur, l'exporter avec les attributs suivants :

  • NameAttribute: le nom du type de classification.

  • BaseDefinitionAttribute: le nom du type de classification duquel ce type de classification hérite de. Tous les types de classifications héritent de « texte », et un type de classification peut hériter de plusieurs mappages d'autres types de classifications.

Étant donné que la classe d' ClassificationTypeDefinition est sealed, vous pouvez les exporter sans le paramètre de type.

L'exemple suivant montre des attributs d'exportation d'une définition de type de classification.

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

IStandardClassificationService permet d'accéder aux classifications standard. Les types prédéfinis de classification sont notamment :

  • "text"

  • « de langage naturel » (dérive de « texte »)

  • « langage formel » (dérive de « texte »)

  • « chaîne » (dérive de « littéral »)

  • « caractère » (dérive de « littéral »)

  • « numérique » (dérive de « littéral »)

Un jeu divers types d'erreurs héritent d' ErrorTypeDefinition. Ils comprennent des types d'erreur suivante :

  • « erreur de syntaxe »

  • « erreur du compilateur »

  • La « autre erreur »

  • « avertissement »

Pour obtenir la liste des types disponibles classification, importez IClassificationTypeRegistryService, qui gère la collection de types de classification pour l'éditeur. Le code suivant importe ce service en tant que propriété.

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

Vous pouvez définir une définition de format de classification pour votre nouveau type de classification. Dérivez une classe d' ClassificationFormatDefinition et exportez-la avec le type EditorFormatDefinition, avec les attributs suivants :

Les attributs d'exportation de l'exemple suivant d'une définition de format de classification.

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

Pour obtenir la liste de formats disponibles, importez IEditorFormatMapService, qui gère la collection de formats pour l'éditeur. Le code suivant importe ce service en tant que propriété.

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

Étendre les marges et les barres de défilement

Les marges et les barres de défilement sont des éléments d'affichage principaux de l'éditeur en plus de l'affichage de texte lui-même. Vous pouvez fournir un certain nombre de marges en plus de les marges standard qui apparaissent autour de l'affichage de texte.

Implémentez une interface d' IWpfTextViewMargin pour définir une marge. Vous devez également implémenter l'interface d' IWpfTextViewMarginProvider pour créer la marge.

Pour enregistrer le fournisseur de marge avec l'éditeur, vous devez exporter le fournisseur avec les attributs suivants :

  • NameAttribute: le nom de la marge.

  • OrderAttribute: l'arrêt dans lequel la marge apparaît, par rapport à les autres marges.

    Ce sont les marges prédéfinies :

    • « Barre de défilement horizontale de WPF »

    • « Barre de défilement verticale de WPF »

    • « Marge de numéro de ligne de WPF »

    Les marges horizontales qui ont un attribut de commande des After="Wpf Horizontal Scrollbar" s'affichent sous la marge prédéfinie, et les marges horizontales qui ont un attribut de commande des Before ="Wpf Horizontal Scrollbar" s'affichent au-dessus de la marge prédéfinie. De bonnes marges verticales qui ont un attribut de commande des After="Wpf Vertical Scrollbar" sont affichées à droite de la barre de défilement. Marges verticales gauche qui font apparaître un attribut de commande des After="Wpf Line Number Margin" à gauche de la marge de numéro de ligne (si elle est visible).

  • MarginContainerAttribute: le type de marge (gauche, correct, haut, ou bas).

  • ContentTypeAttribute: le type de contenu (par exemple, « texte » ou « code ») pour lequel votre marge est valide.

L'exemple suivant montre des attributs d'exportation sur un fournisseur de marge d'une marge qui apparaît à droite de la marge de numéro de ligne.

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

Étendre des balises

Les balises permettent d'associer des données avec différents types de texte. Dans de nombreux cas, les données associée est affichée sous l'effet visuel, mais pas toutes les balises ont une présentation visuelle. Vous pouvez définir votre propre type de balise en implémentant ITag. Vous devez également implémenter ITagger pour fournir des balises pour un ensemble donné d'étendues de texte, et ITaggerProvider pour fournir le balises. Vous devez exporter le fournisseur de balises avec les attributs suivants :

L'exemple suivant montre des attributs d'exportation sur un fournisseur de balises.

[Export(typeof(ITaggerProvider))]
[ContentType("text")]
[TagType(typeof(TestTag))]
internal class TestTaggerProvider : ITaggerProvider

Les types suivants de balise sont intégrés :

Pour rechercher et d'utiliser des balises pour les mémoires tampons et des vues, importez IViewTagAggregatorFactoryService ou IBufferTagAggregatorFactoryService, qui vous permettent ITagAggregator du type demandé. Le code suivant importe ce service en tant que propriété.

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

Balises et MarkerFormatDefinitions

Vous pouvez étendre la classe d' MarkerFormatDefinition pour définir l'apparence d'une balise. Vous devez exporter votre classe (comme EditorFormatDefinition) avec les attributs suivants :

Dans le constructeur, vous définissez le nom complet et l'apparence de la balise. BackgroundColor définit la couleur de remplissage, et ForegroundColor définit la couleur de la bordure. DisplayName est le nom localisé de la définition de format.

Voici un exemple de définition de format :

[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;
    }
}

Pour appliquer cette définition de format à une balise, référencez le nom définie à l'attribut de nom de la classe (pas le nom complet).

Notes

Pour obtenir un exemple d' MarkerFormatDefinition, consultez la classe de HighlightWordFormatDefinition dans Procédure pas - à - pas : Mettre le texte en surbrillance.

Étendre les ornements

Les ornements définissent des effets visuels qui peuvent être ajoutés l'un ou l'autre au texte affiché dans un affichage de texte ou à l'affichage de texte lui-même. Vous pouvez définir votre propre ornement comme n'importe quel type d' UIElement.

Dans votre classe d'ornement, vous devez déclarer AdornmentLayerDefinition. Pour enregistrer votre couche d'ornement, exportez-la avec les attributs suivants :

Les attributs d'exportation de l'exemple suivant d'une définition de couche d'ornement.

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

Vous devez créer une deuxième classe qui implémente IWpfTextViewCreationListener et gère son événement d' TextViewCreated en instanciant l'ornement. Vous devez exporter cette classe avec les attributs suivants :

  • ContentTypeAttribute: le type de contenu (par exemple, « texte » ou « code ») pour lequel l'ornement est valide.

  • TextViewRoleAttribute: le type d'affichage de texte pour lequel cet ornement est valide. La classe PredefinedTextViewRoles a l'ensemble de rôles d'affichage de texte prédéfinis. Par exemple, Document est essentiellement utilisé pour les affichages de texte des fichiers. Interactive est utilisé pour les affichages de texte qu'un utilisateur peut modifier ou la navigation à l'aide d'un clavier et de souris. Les exemples des vues d' Interactive sont l'affichage de texte d'éditeur et la fenêtre de Sortie .

L'exemple suivant montre des attributs d'exportation sur le fournisseur d'ornements.

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

Un ornement à espace négocié est un qui occupe l'espace au même niveau que le texte. Pour créer ce genre d'ornement, vous devez définir une classe de balise qui hérite d' SpaceNegotiatingAdornmentTag, qui définit la quantité d'espace que l'ornement occupe.

Comme avec tous les ornements, vous devez exporter la définition de couche d'ornement.

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

Pour instancier l'ornement à espace négocié, vous devez créer une classe qui implémente ITaggerProvider, en plus de la classe qui implémente IWpfTextViewCreationListener (comme avec d'autres types d'ornements).

Pour enregistrer le fournisseur de balises, vous devez les exporter avec les attributs suivants :

  • ContentTypeAttribute: le type de contenu (par exemple, « texte » ou « code ») pour lequel l'ornement est valide.

  • TextViewRoleAttribute: le type d'affichage de texte pour lequel cette balise ou ornement est valide. La classe PredefinedTextViewRoles a l'ensemble de rôles d'affichage de texte prédéfinis. Par exemple, Document est essentiellement utilisé pour les affichages de texte des fichiers. Interactive est utilisé pour les affichages de texte qu'un utilisateur peut modifier ou la navigation à l'aide d'un clavier et de souris. Les exemples des vues d' Interactive sont l'affichage de texte d'éditeur et la fenêtre de Sortie .

  • TagTypeAttribute: le type de balise ou ornement que vous avez définis. Vous devez ajouter une seconde TagTypeAttribute pour SpaceNegotiatingAdornmentTag.

L'exemple suivant montre des attributs d'exportation sur le fournisseur de balises pour une balise à espace négocié d'ornement.

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

Étendre les processeurs de la souris

Vous pouvez ajouter une gestion spéciale pour les entrées de la souris. Créez une classe qui hérite d' MouseProcessorBase et substituez les événements de souris pour l'entrée que vous souhaitez gérer. Vous devez également implémenter IMouseProcessorProvider dans une deuxième classe et l'exportation avec ContentTypeAttribute qui spécifie le type de contenu (par exemple, « texte » ou « code ») pour lequel votre gestionnaire de la souris est valide.

L'exemple suivant montre des attributs d'exportation sur un fournisseur de processeur de souris.

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

Étendre les gestionnaires de déplacement

Vous pouvez personnaliser le comportement des gestionnaires de déplacement des types spécifiques de texte en créant une classe qui implémente IDropHandler et une deuxième classe qui implémente IDropHandlerProvider pour créer le gestionnaire de déplacement. Vous devez exporter le gestionnaire de déplacement avec les attributs suivants :

  • DropFormatAttribute: le format texte pour lequel ce gestionnaire de déplacement est valide. Les formats suivants sont gérés par ordre de priorité de la plus élevée à la plus faible :

    1. Tout format personnalisé

    2. FileDrop

    3. EnhancedMetafile

    4. WaveAudio

    5. Riff

    6. Dif

    7. Paramètres régionaux

    8. Palette

    9. PenData

    10. Sérialisable

    11. SymbolicLink

    12. XAML

    13. XamlPackage

    14. Tiff

    15. Bitmap

    16. Pêchez à la ligne flottante

    17. MetafilePicture

    18. CSV

    19. System.String

    20. Format HTML

    21. UnicodeText

    22. OEMText

    23. Texte

  • NameAttribute: le nom du gestionnaire de déplacement.

  • OrderAttribute: le classement du gestionnaire de déplacement avant ou après le gestionnaire par défaut de déplacement. Le gestionnaire par défaut de déplacement pour Visual Studio est nommé « DefaultFileDropHandler ».

L'exemple suivant montre des attributs d'exportation sur un fournisseur de gestionnaires de déplacement.

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

Étendre les options de l'éditeur

Vous pouvez définir des options d'être valable uniquement dans une portée, par exemple, dans un affichage de texte. L'éditeur fournit ce jeu d'options prédéfinies : options de l'éditeur, options d'affichage, et options (WPF) d'affichage de Windows Presentation Foundation. Ces options peuvent se trouver dans DefaultOptions, DefaultTextViewOptions, et DefaultWpfViewOptions.

Pour ajouter une nouvelle option, dérivez une classe à partir d'une de ces classes de définition de l'option :

L'exemple suivant montre comment exporter une définition de l'option qui a une valeur booléenne.

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

Étendre Intellisense

Intellisense est un terme général désignant un groupe de fonctionnalités qui fournissent des informations à propos de texte structuré, et la saisie semi-automatique des instructions pour celui-ci. Ces fonctionnalités incluent la saisie semi-automatique des instructions, l'assistance de signature, info express, et des balises actives. Les utilisateurs à de saisie semi-automatique des instructions tapez un mot clé ou un nom de membre de langage correctement. L'assistance de signature affiche la signature ou les signatures pour la méthode que l'utilisateur a juste tapée. Info express affiche une signature complète d'un type ou un nom de membre lorsque la souris est placé dessus. Les balises actives fournissent des actions supplémentaires pour certains identificateurs dans certains contextes, par exemple, le changement de nom toutes les occurrences d'une variable après qu'une occurrence a été renommée.

La création d'une fonctionnalité Intellisense est très similaire dans tous les cas :

  • Un service broker Intellisense est responsable du processus global.

  • Une session Intellisense représente la séquence d'événements entre le déclenchement du présentateur et de l'incarcération ou l'annulation de la sélection. La session est généralement levée par un certain mouvement d'utilisateur.

  • Un contrôleur Intellisense est chargé de déterminer quand la session doit commencer et se terminer. Il détermine également si les informations doivent être validées et lorsque la session doit être annulée.

  • Une source d'Intellisense fournit le contenu et détermine la meilleure correspondance.

  • Un présentateur Intellisense est responsable de l'affichage du contenu.

Dans la plupart des cas, nous recommandons que vous fournissez au moins une source et un contrôleur. Vous pouvez également fournir un présentateur si vous souhaitez personnaliser l'affichage.

Implémenter une source d'Intellisense

Pour personnaliser une source, vous devez implémenter une (ou plus) des interfaces sources suivantes :

En outre, vous devez implémenter un fournisseur du même type :

Vous devez exporter le fournisseur avec les attributs suivants :

  • NameAttribute: le nom de la source.

  • ContentTypeAttribute: le type de contenu (par exemple, « texte » ou « code ») auquel la source s'applique.

  • OrderAttribute: l'ordre dans lequel la source doit apparaître (par rapport à d'autres sources).

  • L'exemple suivant montre des attributs d'exportation sur un fournisseur de sources d'achèvement.

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

Pour plus d'informations sur l'implémentation des sources d'Intellisense, consultez les procédures pas - à - pas suivantes :

Procédure pas - à - pas : Afficher les info-bulles info Express

Procédure pas - à - pas : Afficher l'assistance de signature

Procédure pas - à - pas : afficher la saisie semi-automatique des instructions

Implémenter un contrôleur Intellisense

Pour personnaliser un contrôleur, vous devez implémenter l'interface d' IIntellisenseController . En outre, vous devez implémenter un fournisseur de contrôleur avec les attributs suivants :

  • NameAttribute: le nom du contrôleur.

  • ContentTypeAttribute: le type de contenu (par exemple, « texte » ou « code ») auquel le contrôleur s'applique.

  • OrderAttribute: l'ordre dans lequel le contrôleur doit apparaître (par rapport à d'autres contrôleurs).

L'exemple suivant montre des attributs d'exportation sur un fournisseur de contrôleur d'achèvement.

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

Pour plus d'informations sur l'utilisation des contrôleurs Intellisense, consultez les procédures pas - à - pas suivantes :

Procédure pas - à - pas : Afficher les info-bulles info Express