Compartilhar via


Pontos de extensão do Editor

O editor fornece pontos de extensão que você pode estender como partes de componente Managed Extensibility Framework (MEF). Estas são as categorias de ponto de extensão principal:

  • Tipos de conteúdo

  • Tipos de classificação e formatos de classificação

  • Margens e barras de rolagem

  • Marcas

  • Ornamentos

  • Processadores de mouse

  • Solte os manipuladores

  • Opções

  • O IntelliSense

Estendendo os tipos de conteúdo

Tipos de conteúdo são as definições dos tipos de texto manipuladas pelo editor, por exemplo, "texto", "código" ou "CSharp". Você define um novo tipo de conteúdo, declarando uma variável do tipo ContentTypeDefinition e dando o novo tipo de conteúdo de um nome exclusivo. Para registrar o tipo de conteúdo com o editor, exportá-lo juntamente com os seguintes atributos:

  • NameAttributeé o nome do tipo de conteúdo.

  • BaseDefinitionAttributeé o nome do tipo de conteúdo da qual deriva este tipo de conteúdo. Um tipo de conteúdo pode herdar de vários tipos de conteúdo.

Porque o ContentTypeDefinition classe estiver selada, você poderá exportá-las com nenhum parâmetro de tipo.

O exemplo a seguir mostra os atributos de exportação em uma definição de tipo de conteúdo.

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

Tipos de conteúdo podem ser baseados em zero ou mais tipos de conteúdo pré-existente. Estes são os tipos internos:

  • Qualquer: o tipo de conteúdo básico. Pai de todos os outros tipos de conteúdo.

  • Texto: o tipo básico de conteúdo não-projeção. Herda de "qualquer".

  • Texto sem formatação: para texto que não são do código. Herda de "text".

  • Código: código de todos os tipos. Herda de "text".

  • Inert: exclui o texto de qualquer tipo de tratamento. O texto desse tipo de conteúdo nunca terá qualquer extensão aplicado a ele.

  • Projeção: para o conteúdo dos buffers de projeção. Herda de "qualquer".

  • IntelliSense: para o conteúdo de IntelliSense. Herda de "text".

  • Sighelp: a Ajuda de assinatura. Herda do "intellisense".

  • Sighelp-doc: documentação de ajuda assinatura. Herda do "intellisense".

Estes são alguns dos tipos de conteúdo são definidos pelo Visual Studio e alguns dos idiomas que são hospedados em Visual Studio:

  • Básico

  • C/C++.

  • ConsoleOutput

  • CSharp

  • CSS

  • ENC

  • FindResults

  • F#

  • HTML

  • JScript

  • XAML

  • XML

Para descobrir a lista de tipos de conteúdo disponíveis, importe o IContentTypeRegistryService, que mantém a coleção de tipos de conteúdo para o editor. O código a seguir importa esse serviço como uma propriedade.

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

Para associar um tipo de conteúdo com uma extensão de nome de arquivo, use FileExtensionToContentTypeDefinition.

Dica

Em Visual Studio, as extensões de nome de arquivo são registradas usando o ProvideLanguageExtensionAttribute em um pacote de idioma do serviço.O FileExtensionToContentTypeDefinition associa um tipo de conteúdo MEF com uma extensão de nome de arquivo que tenha sido registrada dessa maneira.

Para exportar a extensão de nome de arquivo para a definição de tipo de conteúdo, você deve incluir os seguintes atributos:

Porque o FileExtensionToContentTypeDefinition classe estiver selada, você poderá exportá-las com nenhum parâmetro de tipo.

O exemplo a seguir mostra os atributos de exportação em uma extensão de nome de arquivo a uma definição de tipo de conteúdo.

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

O IFileExtensionRegistryService gerencia as associações entre extensões de nome de arquivo e tipos de conteúdo.

Estendendo a classificação e a tipos de classificação de formatos

Você pode usar os tipos de classificação para definir os tipos de texto para o qual você deseja oferecer tratamento diferente (por exemplo, colorir o texto de "palavra-chave" azul e o texto "comentário" verde). Definir um novo tipo de classificação, declarando uma variável do tipo ClassificationTypeDefinition e dando a ele um nome exclusivo.

Para registrar o tipo de classificação com o editor, exportá-lo juntamente com os seguintes atributos:

  • NameAttribute: o nome do tipo de classificação.

  • BaseDefinitionAttribute: o nome do tipo de classificação do qual esse tipo de classificação herda. Herdam de todos os tipos de classificação de "texto" e um tipo de classificação pode herdar de vários outros tipos de classificação.

Porque o ClassificationTypeDefinition classe estiver selada, você poderá exportá-las com nenhum parâmetro de tipo.

O exemplo a seguir mostra os atributos de exportação em uma definição de tipo de classificação.

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

O IStandardClassificationService fornece acesso a classificações padrão. Tipos de classificação interna incluem:

  • "texto"

  • "idioma natural" (deriva de "texto")

  • "linguagem formal" (deriva de "texto")

  • "string" (deriva de "literal")

  • "caractere" (deriva de "literal")

  • "numérico" (deriva de "literal")

Herdar de um conjunto de tipos de erro diferente de ErrorTypeDefinition. Eles incluem os seguintes tipos de erro:

  • "Erro de sintaxe"

  • "Erro do compilador"

  • "outro erro"

  • "aviso"

Para descobrir a lista de tipos de classificação disponíveis, importe o IClassificationTypeRegistryService, que mantém a coleção de tipos de classificação para o editor. O código a seguir importa esse serviço como uma propriedade.

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

Você pode definir uma definição de formato de classificação para o novo tipo de classificação. Derive uma classe de ClassificationFormatDefinition e exportá-los com o tipo de EditorFormatDefinition, junto com os seguintes atributos:

O exemplo a seguir mostra os atributos de exportação em uma definição de formato de classificação.

[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 descobrir a lista de formatos disponíveis, importe o IEditorFormatMapService, que mantém a coleção de formatos para o editor. O código a seguir importa esse serviço como uma propriedade.

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

Barras de rolagem e estendendo margens

Margens e barras de rolagem são os elementos de exibição principal do editor com o modo de exibição de texto propriamente dito. Você pode fornecer qualquer número de margens com as margens padrão que aparecem em torno do modo de exibição de texto.

Implementar um IWpfTextViewMargin interface para definir uma margem. Você também deve implementar a IWpfTextViewMarginProvider interface para criar a margem.

Para registrar o provedor de margem com o editor, você deve exportar o provedor em conjunto com os seguintes atributos:

  • NameAttribute: o nome da margem.

  • OrderAttribute: a ordem em que aparece na margem, em relação às outras margens.

    Estas são as margens internas:

    • "Barra de rolagem Horizontal do Wpf"

    • "Barra de rolagem Vertical do Wpf"

    • "Número da linha do Wpf margem"

    As margens horizontais que têm um atributo de ordem de After="Wpf Horizontal Scrollbar" são exibidos abaixo da margem interna e as margens horizontais que têm um atributo de ordem de Before ="Wpf Horizontal Scrollbar" são exibidos acima da margem interna. As margens verticais que têm um atributo de ordem do botão direito do mouse After="Wpf Vertical Scrollbar" são exibidas à direita do scrollbar. Deixado as margens verticais que têm um atributo de ordem de After="Wpf Line Number Margin" aparecem à esquerda da margem linha número (se ele estiver visível).

  • MarginContainerAttribute: o tipo de margem (esquerda, direita, superior ou inferior).

  • ContentTypeAttribute: o tipo de conteúdo (por exemplo, "text" ou "código") para o qual a sua margem é válida.

O exemplo a seguir mostra os atributos de exportação em um provedor de margem para a margem que aparece à direita da margem linha número.

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

Estendendo as marcas

As marcas são uma maneira de associar dados de diferentes tipos de texto. Em muitos casos, os dados associados são exibidos como um efeito visual, mas nem todas as tags têm uma apresentação visual. Você pode definir seu próprio tipo de marca com a implementação de ITag. Você também deve implementar ITagger para fornecer as marcas para um determinado conjunto de extensões de texto e um ITaggerProvider para fornecer o tagger. Você deve exportar o provedor tagger juntamente com os seguintes atributos:

O exemplo a seguir mostra os atributos de exportação em um provedor de tagger.

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

Os seguintes tipos de marca são internos:

Para localizar e usar marcas buffers e modos de exibição, importe o IViewTagAggregatorFactoryService ou o IBufferTagAggregatorFactoryService, que dão um ITagAggregator do tipo solicitado. O código a seguir importa esse serviço como uma propriedade.

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

Marcas e MarkerFormatDefinitions

Você pode estender o MarkerFormatDefinition classe para definir a aparência de uma marca. Você deve exportar sua classe (como um EditorFormatDefinition) com os seguintes atributos:

No construtor, você pode definir o nome de exibição e a aparência da marca. BackgroundColorDefine a cor de preenchimento, e ForegroundColor define a cor da borda. O DisplayName é o nome localizável da definição de formato.

Este é um exemplo de uma definição 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 definição de formato a uma marca, referência ao nome que você definir no atributo name da classe (não o nome de exibição).

Dica

Para obter um exemplo de um MarkerFormatDefinition, consulte a classe HighlightWordFormatDefinition na Passo a passo: Realçar texto.

Estendendo ornamentos

Ornamentos definem efeitos visuais que podem ser adicionados para o texto que é exibido em uma exibição de texto ou ao texto exibir propriamente dito. Você pode definir seu próprios adorno como qualquer tipo de UIElement.

Na sua classe de adorno, você deve declarar um AdornmentLayerDefinition. Para registrar sua camada de adorno, exportá-lo juntamente com os seguintes atributos:

O exemplo a seguir mostra os atributos de exportação em uma definição de camada de adorno.

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

Você deve criar uma segunda classe que implementa IWpfTextViewCreationListener e lida com sua TextViewCreated evento instanciando o adorno. Você deve exportar essa classe junto com os seguintes atributos:

  • ContentTypeAttribute: o tipo de conteúdo (por exemplo, "text" ou "código") para o qual o adorno é válido.

  • TextViewRoleAttribute: o tipo de exibição de texto para o qual este adorno é válido. A classe PredefinedTextViewRoles tem o conjunto de funções de modo de exibição de texto predefinido. Por exemplo, Document é usado principalmente para modos de exibição de texto de arquivos. Interactiveé usado para os modos de exibição de texto que um usuário pode editar ou navegar usando um mouse e teclado. Exemplos de Interactive exibições são o modo de exibição de texto do editor e o saída janela.

O exemplo a seguir mostra os atributos de exportação no provedor de adorno.

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

Um adorno de negociação de espaço é aquele que ocupa o espaço do mesmo nível, como o texto. Para criar esse tipo de adorno, você deve definir uma classe de tag que herda do SpaceNegotiatingAdornmentTag, que define a quantidade de espaço que o adorno ocupa.

Assim como acontece com todos os ornamentos, você deve exportar a definição da camada de adorno.

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

Para criar uma instância de adorno de negociação de espaço, você deve criar uma classe que implementa ITaggerProvider, com a classe que implementa IWpfTextViewCreationListener (como com outros tipos de ornamentos).

Para registrar o provedor de tagger, você deve exportá-lo juntamente com os seguintes atributos:

  • ContentTypeAttribute: o tipo de conteúdo (por exemplo, "text" ou "código") para o qual o adorno é válido.

  • TextViewRoleAttribute: o tipo de exibição de texto para o qual esta marca ou adorno é válido. A classe PredefinedTextViewRoles tem o conjunto de funções de modo de exibição de texto predefinido. Por exemplo, Document é usado principalmente para modos de exibição de texto de arquivos. Interactiveé usado para os modos de exibição de texto que um usuário pode editar ou navegar usando um mouse e teclado. Exemplos de Interactive exibições são o modo de exibição de texto do editor e o saída janela.

  • TagTypeAttribute: o tipo de marca ou adorno que você definiu. Você deve adicionar um segundo TagTypeAttribute para SpaceNegotiatingAdornmentTag.

O exemplo a seguir mostra os atributos de exportação no provedor de tagger para uma marca de adorno negociando de espaço.

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

Estendendo os processadores de Mouse

Você pode adicionar um tratamento especial para a entrada do mouse. Crie uma classe que herda de MouseProcessorBase e substituir os eventos de mouse para a entrada que você deseja manipular. Você também deve implementar IMouseProcessorProvider em uma classe de segundo e exportá-lo junto com o ContentTypeAttribute que especifica o tipo de conteúdo (por exemplo, "text" ou "código") para o qual o manipulador de mouse é válido.

O exemplo a seguir mostra os atributos de exportação em um provedor de processador de mouse.

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

Estendendo os manipuladores de soltar

Você pode personalizar o comportamento dos manipuladores de soltar para tipos específicos de texto, criando uma classe que implementa IDropHandler e uma segunda classe que implementa IDropHandlerProvider para criar o manipulador de soltar. Você deve exportar o manipulador de soltar junto com os seguintes atributos:

  • DropFormatAttribute: o formato de texto para o qual esse manipulador de soltar é válido. Os seguintes formatos são manipulados em ordem de prioridade da mais alta para a mais baixa:

    1. Qualquer formato personalizado

    2. FileDrop

    3. EnhancedMetafile

    4. WaveAudio

    5. RIFF

    6. Dif

    7. Localidade

    8. Paleta

    9. PenData

    10. Pode ser serializado

    11. SymbolicLink

    12. XAML

    13. XamlPackage

    14. TIFF

    15. Bitmap

    16. DIB

    17. MetafilePicture

    18. CSV

    19. System. String

    20. Formato HTML

    21. UnicodeText

    22. OEMText

    23. Texto

  • NameAttribute: o nome do manipulador de soltar.

  • OrderAttribute: a ordem do manipulador soltar antes ou depois do manipulador padrão de soltar. O manipulador padrão de soltar para Visual Studio é chamado "DefaultFileDropHandler".

O exemplo a seguir mostra os atributos de exportação em um provedor de manipulador de soltar.

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

Ampliando as opções do Editor

Você pode definir opções para ser válido somente em um determinado escopo, por exemplo, em uma exibição de texto. O editor fornece este conjunto de opções predefinidas: opções do editor, opções de exibição e opções de exibição de Windows Presentation Foundation (WPF). Essas opções podem ser encontradas no DefaultOptions, DefaultTextViewOptions, e DefaultWpfViewOptions.

Para adicionar uma nova opção, derive uma classe a partir de uma dessas classes de definição de opção:

O exemplo a seguir mostra como exportar uma definição de opção que tem um valor booleano.

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

Estendendo o IntelliSense

IntelliSense é um termo geral para um grupo de recursos que fornecem informações sobre texto estruturado e conclusão de instrução para ele. Esses recursos incluem a conclusão da instrução, a Ajuda de assinatura, informações rápidas e marcas inteligentes. Conclusão da instrução ajuda os usuários a digitar um nome de membro ou palavra-chave de idioma corretamente. Ajuda da assinatura exibe a assinatura ou assinaturas para o método que o usuário tiver digitado apenas. Informações rápidas exibe uma assinatura completa para um nome de tipo ou membro quando o mouse for posicionado sobre ele. As marcas inteligentes oferecem ações adicionais para certos identificadores em determinados contextos, por exemplo, renomear todas as ocorrências de uma variável, após uma ocorrência foi renomeada.

O design de um recurso de IntelliSense é quase a mesma em todos os casos:

  • Um IntelliSense broker é responsável por processo geral.

  • Um IntelliSense sessão representa a seqüência de eventos entre o disparo do apresentador e o committal ou o cancelamento da seleção. A sessão é normalmente acionada por alguns gesto do usuário.

  • Um IntelliSense controlador é responsável por decidir quando a sessão deve iniciar e finalizar. Ele também decide quando as informações devem ser confirmadas e quando a sessão deve ser cancelada.

  • Um IntelliSense origem fornece o conteúdo e decide a melhor correspondência.

  • Um IntelliSense apresentador é responsável por exibir o conteúdo.

Na maioria dos casos, é recomendável que você forneça pelo menos uma fonte e um controlador. Você também pode fornecer um apresentador, se você quiser personalizar a exibição.

A implementação de uma fonte de IntelliSense

Para personalizar uma fonte, você deve implementar um (ou mais) das seguintes interfaces de origem:

Além disso, você deve implementar um provedor do mesmo tipo:

Você deve exportar o provedor em conjunto com os seguintes atributos:

  • NameAttribute: o nome da fonte.

  • ContentTypeAttribute: o tipo de conteúdo (por exemplo, "text" ou "código") ao qual se aplica a fonte.

  • OrderAttribute: a ordem na qual a fonte deve aparecer (com relação a outras fontes).

  • O exemplo a seguir mostra os atributos de exportação em um provedor de origem de conclusão.

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

Para obter mais informações sobre como implementar IntelliSense fontes, consulte as instruções a seguir:

Passo a passo: Exibir dicas de ferramentas de InformaçãoRápida

Passo a passo: Exibindo a Ajuda de assinatura

Passo a passo: Exibindo a conclusão da instrução

A implementação de um controlador de IntelliSense

Para personalizar um controlador, você deve implementar a IIntellisenseController interface. Além disso, você deve implementar um provedor de controlador juntamente com os seguintes atributos:

  • NameAttribute: o nome do controlador.

  • ContentTypeAttribute: o tipo de conteúdo (por exemplo, "text" ou "código") ao qual se aplica o controlador.

  • OrderAttribute: a ordem na qual o controlador deve aparecer (com relação a outros controladores).

O exemplo a seguir mostra os atributos de exportação em um provedor de controlador de conclusão.

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

Para obter mais informações sobre como usar os controladores de IntelliSense, consulte as instruções a seguir:

Passo a passo: Exibir dicas de ferramentas de InformaçãoRápida