Compartir a través de


Puntos de extensión del editor

El editor proporciona puntos de extensión que puede extender como partes (MEF) de managed extensibility framework. Estas son las categorías principales del punto de la extensión:

  • tipos de contenido

  • Tipos de clasificación y formatos de clasificación

  • márgenes y barras de desplazamiento

  • Etiquetas

  • Elementos gráficos

  • Procesadores del mouse

  • Controladores de entrega

  • Opciones

  • IntelliSense

tipos de contenido que extienden

Los tipos de contenido son las definiciones de las clases de texto controlan mediante el editor, por ejemplo, “texto”, “código”, o “CSharp”. Define un nuevo tipo de contenido declarar una variable de tipo ContentTypeDefinition y da al nuevo tipo de contenido un nombre único. Para registrar el tipo de contenido con el editor, exportelo junto con los atributos siguientes:

  • NameAttribute es el nombre del tipo de contenido.

  • BaseDefinitionAttribute es el nombre del tipo de contenido del que este tipo de contenido es derivado. Un tipo de contenido puede heredar de varios otros tipos de contenido.

Porque se sella la clase de ContentTypeDefinition , puede exportarla sin parámetros de tipo.

El ejemplo siguiente muestra atributos de exportación en una definición de tipo de contenido.

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

Los tipos de contenido pueden estar basados en tipos de contenido cero o más existente. éstos son los tipos integrados:

  • Ninguno: el tipo de contenido básico. elemento primario del resto de los tipos de contenido.

  • texto: el tipo básico para el contenido de la no-proyección. Hereda de “ninguno”.

  • texto simple: para el texto de sin código. Hereda “text”.

  • código: para el código de todas las clases. Hereda “text”.

  • inerte: excluye el texto de cualquier clase de administrar. El texto de este tipo de contenido nunca tendrá cualquier extensión aplicado al.

  • proyección: el contenido de los búferes de proyección. Hereda de “ninguno”.

  • Intellisense: el contenido de IntelliSense. Hereda “text”.

  • Sighelp: ayuda de la firma. hereda de “intellisense”.

  • Sighelp-doc: documentación de la ayuda para las firmas. hereda de “intellisense”.

Éstos son algunos de los tipos de contenido que son definidas por Visual Studio y algunos de los lenguajes que se hospedan en Visual Studio:

  • Basic

  • C/C++

  • ConsoleOutput

  • CSharp

  • CSS

  • ENC

  • FindResults

  • F#

  • HTML

  • JScript

  • XAML

  • XML

Para detectar la lista de tipos de contenido disponibles, importe IContentTypeRegistryService, que mantiene la colección de tipos de contenido del editor. el código siguiente importa este servicio como propiedad.

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

Para asociar un tipo de contenido con una extensión de nombre de archivo, use FileExtensionToContentTypeDefinition.

Nota

En Visual Studio, las extensiones de nombre de archivo se registran mediante ProvideLanguageExtensionAttribute en un paquete del servicio de lenguaje.FileExtensionToContentTypeDefinition asocia un tipo de contenido MEF a una extensión de nombre de archivo que se ha registrado de esta manera.

Para exportar la extensión de nombre de archivo a la definición de tipo de contenido, debe incluir los atributos siguientes:

Porque se sella la clase de FileExtensionToContentTypeDefinition , puede exportarla sin parámetros de tipo.

El ejemplo siguiente muestra atributos de exportación en una extensión de nombre de archivo a una definición de tipo de contenido.

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

IFileExtensionRegistryService administra las asociaciones entre las extensiones de nombre de archivo y los tipos de contenido.

Tipos de Clasificación y formatos de Clasificación que extienden

Puede utilizar tipos de clasificación para definir las clases de texto para la que desea proporcionar diferente administrar (por ejemplo, coloreando el azul de texto de “palabra clave” y el verde de texto de “comentario”). Defina un nuevo tipo de clasificación declarar una variable de ClassificationTypeDefinition escrito y proporcionando un nombre único.

Para registrar el tipo de clasificación que con el editor, exportelo junto con los atributos siguientes:

  • NameAttribute: el nombre del tipo de clasificación.

  • BaseDefinitionAttribute: el nombre del tipo de clasificación de la que este tipo de clasificación hereda. Todos los tipos de clasificación heredan “text”, y un tipo de clasificación pueden heredar de varios otros tipos de clasificación.

Porque se sella la clase de ClassificationTypeDefinition , puede exportarla sin parámetros de tipo.

El ejemplo siguiente muestra atributos de exportación en una definición de tipo de clasificación.

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

IStandardClassificationService proporciona acceso a las clasificaciones estándar. Los tipos integrados de clasificación son:

  • "texto"

  • “de lenguaje natural” (deriva “text”)

  • “lenguaje formal” (deriva “text”)

  • “cadena” (deriva de “literal”)

  • “carácter” (deriva de “literal”)

  • “numérico” (deriva de “literal”)

Un conjunto de tipos diferentes de error heredar de ErrorTypeDefinition. incluyen los tipos de error siguientes:

  • “error de sintaxis”

  • “error del compilador”

  • “otro error”

  • “warning”

Para detectar la lista de tipos disponibles de Clasificación, importe IClassificationTypeRegistryService, que mantiene la colección de tipos de clasificación del editor. el código siguiente importa este servicio como propiedad.

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

Puede crear una definición de formato de clasificación para el nuevo tipo de clasificación. derive una clase de ClassificationFormatDefinition y exportela con el tipo EditorFormatDefinition, así como los atributos siguientes:

El ejemplo siguiente muestra atributos de exportación en una definición de formato de clasificación.

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

Para detectar la lista de formatos disponibles, importe IEditorFormatMapService, que mantiene la colección de formatos para el editor. el código siguiente importa este servicio como propiedad.

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

Márgenes que extiende y barras de desplazamiento

Los márgenes y las barras de desplazamiento son los elementos principales del editor además de la vista de texto propia de la vista. Puede proporcionar cualquier número de márgenes además de los márgenes estándar que aparecen en la vista de texto.

Implementa una interfaz de IWpfTextViewMargin para definir un margen. También debe implementar la interfaz de IWpfTextViewMarginProvider para crear el margen.

Para registrar el proveedor de código con el editor, debe exportar el proveedor junto con los atributos siguientes:

  • NameAttribute: el nombre del margen.

  • OrderAttribute: el orden en que el margen aparece, en relación con los demás márgenes.

    éstos son los márgenes integrados:

    • “Barra de desplazamiento horizontal de WPF”

    • “Barra de desplazamiento vertical de WPF”

    • “El número de línea de WPF”

    Los márgenes horizontales que tienen un atributo de orden de After="Wpf Horizontal Scrollbar" se muestran debajo del integrado, y los márgenes horizontales que tienen un atributo de orden de Before ="Wpf Horizontal Scrollbar" se muestran el marcado integrado. Los márgenes verticales correctos que tienen un atributo de orden de After="Wpf Vertical Scrollbar" se muestran a la derecha de la barra de desplazamiento. Márgenes verticales izquierdo que tienen un atributo de orden de After="Wpf Line Number Margin" aparecerá a la izquierda del margen del número de línea (si está visible).

  • MarginContainerAttribute: la clase de margen (izquierdo, derecho, superior, o inferior).

  • ContentTypeAttribute: la clase de contenido (por ejemplo, “text” o “código”) para la que el margen es válido.

El ejemplo siguiente muestra atributos de exportación en un proveedor de margen para un margen que aparece a la derecha del número de línea.

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

etiquetas que extienden

Las etiquetas son una manera de asociar los datos a los diferentes tipos de texto. En muchos casos, los datos asociados se muestra como efecto visual, pero no todas las etiquetas tienen una presentación visual. Puede definir dispone la clase label implementando ITag. También debe implementar ITagger para proporcionar etiquetas para un determinado conjunto de intervalos de texto, y ITaggerProvider para proporcionar el etiquetador. Debe exportar el proveedor del etiquetador junto con los atributos siguientes:

El ejemplo siguiente muestra atributos de exportación en un proveedor de etiquetador.

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

Las siguientes clases de etiqueta se integran:

Para buscar y utilizar etiquetas para los búferes y vistas, importe IViewTagAggregatorFactoryService o IBufferTagAggregatorFactoryService, que proporcionan ITagAggregator del tipo solicitado. el código siguiente importa este servicio como propiedad.

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

etiquetas y MarkerFormatDefinitions

Puede extender la clase de MarkerFormatDefinition para definir el aspecto de una etiqueta. Debe exportar la clase (como EditorFormatDefinition) con los atributos siguientes:

En el constructor, se define el nombre para mostrar y el aspecto de la etiqueta. BackgroundColor define el color de relleno, y ForegroundColor define el color del borde. DisplayName es el nombre localizable de la definición de formato.

A continuación se muestra un ejemplo de una definición de formato:

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

Para aplicar esta definición de formato a una etiqueta, haga referencia al nombre se establece en el atributo de nombre de clase (no el nombre para mostrar).

Nota

Para obtener un ejemplo de MarkerFormatDefinition, vea la clase de HighlightWordFormatDefinition en tutorial: Resaltar texto.

Elementos gráficos que extienden

Las opciones gráficas definen los efectos visuales que se pueden agregar cualquiera al texto que se muestra en una vista de texto o a la vista de texto en sí. Puede definir dispone adornment como cualquier tipo de UIElement.

En la clase del elemento gráfico, debe declarar AdornmentLayerDefinition. Para registrar el nivel del elemento gráfico, exportelo junto con los atributos siguientes:

  • NameAttribute: el nombre del elemento gráfico.

  • OrderAttribute: el orden del elemento gráfico con respecto a otros niveles de elemento gráfico. la clase PredefinedAdornmentLayers define cuatro niveles predeterminados: selección, esquematización, símbolo de intercalación, y texto.

El ejemplo siguiente muestra atributos de exportación en una definición de nivel de elemento gráfico.

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

Debe crear una segunda clase que implemente IWpfTextViewCreationListener y controle el evento de TextViewCreated creando instancias del elemento gráfico. Debe exportar esta clase junto con los atributos siguientes:

  • ContentTypeAttribute: la clase de contenido (por ejemplo, “text” o “código”) para la que el elemento gráfico es válida.

  • TextViewRoleAttribute: la clase de vista de texto para la que este elemento gráfico es válida. la clase PredefinedTextViewRoles tiene el conjunto de roles predefinidos de la vista de texto. Por ejemplo, Document se utiliza principalmente para las vistas de texto de archivos. Interactive se utiliza para las vistas de texto que un usuario puede modificar o navegar con el mouse y el teclado. Los ejemplos de las vistas de Interactive son la vista de texto del editor y la ventana de Resultados .

El ejemplo siguiente muestra atributos export en el proveedor del elemento gráfico.

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

Un elemento gráfico de negociación de espacios es una ocupa espacio en el mismo nivel que el texto. Para crear este tipo de elemento gráfico, debe definir una clase de etiqueta que herede de SpaceNegotiatingAdornmentTag, que define la cantidad de espacio que el elemento gráfico ocupa.

Como con todas las opciones gráficas, debe exportar la definición del elemento gráfico.

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

Para crear instancias del elemento gráfico de negociación de espacios, debe crear una clase que implemente ITaggerProvider, además de la clase que implementa IWpfTextViewCreationListener (como con otras clases de gráficos).

Para registrar el proveedor del etiquetador, debe exportarlo junto con los atributos siguientes:

  • ContentTypeAttribute: la clase de contenido (por ejemplo, “text” o “código”) para la que el elemento gráfico es válida.

  • TextViewRoleAttribute: la clase de vista de texto para el que esta etiqueta o elemento gráfico es válida. la clase PredefinedTextViewRoles tiene el conjunto de roles predefinidos de la vista de texto. Por ejemplo, Document se utiliza principalmente para las vistas de texto de archivos. Interactive se utiliza para las vistas de texto que un usuario puede modificar o navegar con el mouse y el teclado. Los ejemplos de las vistas de Interactive son la vista de texto del editor y la ventana de Resultados .

  • TagTypeAttribute: la clase label o elemento gráfico que tiene definido. Debe agregar un segundo TagTypeAttribute para SpaceNegotiatingAdornmentTag.

El ejemplo siguiente muestra atributos export en el proveedor del etiquetador para una etiqueta de negociación de espacios del elemento gráfico.

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

Procesadores del mouse que extienden

Puede agregar un control especial para la entrada del mouse. Cree una clase que herede de MouseProcessorBase y reemplace los eventos del mouse para la entrada que desea controlar. También debe implementar IMouseProcessorProvider en otra clase y exportarlo así como ContentTypeAttribute que especifique el tipo de contenido (por ejemplo, “text” o “código”) para la que el controlador del mouse es válido.

El ejemplo siguiente muestra atributos de exportación en un proveedor de procesador de mouse.

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

Controladores de entrega que extienden

Puede personalizar el comportamiento de los controladores de entrega para las clases específicas de texto creando una clase que implemente IDropHandler y una segunda clase que implemente IDropHandlerProvider para crear el controlador de entrega. Debe exportar el controlador de colocación junto con los atributos siguientes:

  • DropFormatAttribute: el formato de texto para el que este controlador de colocación es válido. Los siguientes formatos se administran en la prioridad ordenada de mayor a menor:

    1. cualquier formato personalizado

    2. Filedrop

    3. EnhancedMetafile

    4. WaveAudio

    5. riff

    6. Dif

    7. Configuración regional

    8. Palette

    9. PenData

    10. Serializable

    11. SymbolicLink

    12. XAML

    13. XamlPackage

    14. TIFF

    15. Mapa de bits

    16. DIB

    17. MetafilePicture

    18. CSV

    19. System.String

    20. Formato HTML

    21. UnicodeText

    22. OEMText

    23. Text

  • NameAttribute: el nombre del controlador de colocación.

  • OrderAttribute: el orden de controlador de colocación antes o después del controlador predeterminado de entrega. Se llama al controlador predeterminado de entrega para Visual Studio “DefaultFileDropHandler”.

El ejemplo siguiente muestra atributos de exportación en un proveedor de controlador de colocación.

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

Opciones del editor que extienden

Puede definir opciones de ser válido únicamente en un ámbito, por ejemplo, en una vista de texto. el editor proporciona a este conjunto de opciones predefinidas: opciones del editor, opciones de vista, y opciones (WPF) de la vista de Windows Presentation Foundation. Estas opciones se encuentran en DefaultOptions, DefaultTextViewOptions, y DefaultWpfViewOptions.

Para agregar una nueva opción, derive una clase de una de estas clases de definición de la opción:

el ejemplo siguiente muestra cómo exportar una definición de la opción que tenga un valor booleano.

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

IntelliSense que extiende

IntelliSense es un término general para un grupo de características que proporcionan información sobre el texto estructurado, y la finalización de instrucciones para ella. Estas características incluyen finalización de instrucciones, la ayuda de la firma, información rápida, y etiquetas inteligentes. Los usuarios de la finalización de instrucciones escriben una palabra clave o un nombre de miembro de lenguaje correctamente. Ayuda para las firmas muestra la firma o las firmas del método que el usuario acaba de escribir. Muestra de información rápidamente una firma completa para un tipo o un nombre de miembro cuando el mouse se encuentra sobre él. Las etiquetas inteligentes proporcionan identificadores adicionales de acciones para ciertos en ciertos contextos, por ejemplo, cambiar de nombre todas las apariciones de una variable después de que se ha cambiado una aparición.

El diseño de una característica IntelliSense es igual en todos los casos:

  • Un agente de IntelliSense es responsable del proceso general.

  • Una sesión de IntelliSense representa la secuencia de eventos entre desencadenar de presentador y la perpetración o cancelar la selección. Algún gestos del usuario activa la sesión normalmente.

  • Un controlador de IntelliSense es responsable de decidir cuando la sesión debe iniciar y finalizar. También decide cuando la información debe ser de confianza y a cuando la sesión se debe cancelar.

  • Un origen de IntelliSense proporciona contenido y decide la mejor coincidencia.

  • Un presentador de IntelliSense es responsable de mostrar contenido.

En la mayoría de los casos, recomendamos proporciona al menos un origen y un controlador. También puede proporcionar un presentador si desea personalizar la presentación.

implementar un origen de IntelliSense

Para personalizar un origen, debe implementar una (o más) de las siguientes interfaces de origen:

Además, debe implementar un proveedor de la misma clase:

Debe exportar el proveedor junto con los atributos siguientes:

  • NameAttribute: el nombre del origen.

  • ContentTypeAttribute: la clase de contenido (por ejemplo, “text” o “código”) al que el origen aplica.

  • OrderAttribute: el orden en que el origen debe aparecer (con respecto a otros orígenes).

  • El ejemplo siguiente muestra atributos de exportación en un proveedor de origen de finalización.

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

Para obtener más información sobre cómo implementar los orígenes de IntelliSense, vea los siguientes tutoriales:

tutorial: Mostrar información sobre herramientas de QuickInfo

tutorial: Mostrar la Ayuda para las firmas

tutorial: Mostrar la finalización de instrucciones

implementar un controlador de IntelliSense

Para personalizar un controlador, debe implementar la interfaz de IIntellisenseController . Además, debe implementar un proveedor de controlador junto con los atributos siguientes:

  • NameAttribute: el nombre del controlador.

  • ContentTypeAttribute: la clase de contenido (por ejemplo, “text” o “código”) al que el controlador aplica.

  • OrderAttribute: el orden en el que el controlador debe aparecer (con respecto a otros controladores).

El ejemplo siguiente muestra atributos de exportación en un proveedor de controlador de finalización.

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

Para obtener más información sobre cómo utilizar controladores de IntelliSense, vea los siguientes tutoriales:

tutorial: Mostrar información sobre herramientas de QuickInfo