Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
O editor fornece pontos de extensão que você pode estender como partes de componente da MEF (Managed Extensibility Framework), incluindo a maioria dos recursos do serviço de linguagem. Estas são as principais categorias de ponto de extensão:
Tipos de conteúdo
Tipos de classificação e formatos de classificação
Margens e barras de rolagem
Etiquetas
Adornos
Processadores de mouse
Remover manipuladores
Opções
IntelliSense
Estender tipos de conteúdo
Tipos de conteúdo são as definições dos tipos de texto manipulados 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 ao novo tipo de conteúdo um nome exclusivo. Para registrar o tipo de conteúdo com o editor, exporte-o junto com os seguintes atributos:
NameAttribute é o nome do tipo de conteúdo.
BaseDefinitionAttribute é o nome do tipo de conteúdo do qual esse tipo de conteúdo é derivado. Um tipo de conteúdo pode herdar de vários outros tipos de conteúdo.
Como a ContentTypeDefinition classe está selada, você pode exportá-la sem nenhum parâmetro de tipo.
O exemplo a seguir mostra atributos de exportação em uma definição de tipo de conteúdo.
[Export]
[Name("test")]
[BaseDefinition("code")]
[BaseDefinition("projection")]
internal static ContentTypeDefinition TestContentTypeDefinition;
Os tipos de conteúdo podem ser baseados em zero ou mais tipos de conteúdo pré-existentes. 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 para conteúdo que não é de projeção. Herda de "qualquer".
Texto sem formatação: para texto sem código. Herda de "text".
Código: para 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á nenhuma extensão aplicada a ele.
Projeção: para o conteúdo dos buffers de projeção. Herda de "qualquer".
IntelliSense: para o conteúdo do IntelliSense. Herda de "text".
Sighelp: ajuda de assinatura. Herda do "intellisense".
Sighelp-doc: documentação de ajuda de assinatura. Herda do "intellisense".
Esses são alguns dos tipos de conteúdo definidos pelo Visual Studio e alguns dos idiomas hospedados no 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 a uma extensão de nome de arquivo, use FileExtensionToContentTypeDefinition.
Observação
No Visual Studio, as extensões de nome de arquivo são registradas usando o ProvideLanguageExtensionAttribute pacote em um serviço de idioma. O FileExtensionToContentTypeDefinition associa um tipo de conteúdo MEF a uma extensão de nome de arquivo que foi 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:
FileExtensionAttribute: especifica a extensão de nome de arquivo.
ContentTypeAttribute: especifica o tipo de conteúdo.
Como a FileExtensionToContentTypeDefinition classe está selada, você pode exportá-la sem nenhum parâmetro de tipo.
O exemplo a seguir mostra os atributos de exportação em uma extensão de nome de arquivo para 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.
Estender tipos de classificação e formatos de classificação
Você pode usar tipos de classificação para definir os tipos de texto para os quais deseja fornecer tratamento diferente (por exemplo, colorindo o texto "palavra-chave" azul e o texto "comentário" verde). Defina um novo tipo de classificação declarando uma variável de tipo ClassificationTypeDefinition e dando-lhe um nome exclusivo.
Para registrar o tipo de classificação com o editor, exporte-o junto 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. Todos os tipos de classificação herdam de "texto" e um tipo de classificação pode herdar de vários outros tipos de classificação.
Como a ClassificationTypeDefinition classe está selada, você pode exportá-la sem nenhum parâmetro de tipo.
O exemplo a seguir mostra atributos de exportação em uma definição de tipo de classificação.
[Export]
[Name("csharp.test")]
[BaseDefinition("test")]
internal static ClassificationTypeDefinition CSharpTestDefinition;
Fornece IStandardClassificationService acesso a classificações padrão. Os tipos de classificação internos incluem estes:
"text"
"linguagem natural" (deriva de "texto")
"linguagem formal" (deriva de "text")
"string" (deriva de "literal")
"caractere" (deriva de "literal")
"numérico" (deriva de "literal")
Um conjunto de tipos de erro diferentes herdam de ErrorTypeDefinition. Eles incluem os seguintes tipos de erro:
"Erro de sintaxe"
"Erro do compilador"
"outro erro"
"aviso"
Para trabalhar com 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. Derivar uma classe e ClassificationFormatDefinition exportá-la com o tipo EditorFormatDefinition, juntamente com os seguintes atributos:
NameAttribute: o nome do formato.
DisplayNameAttribute: o nome de exibição do formato.
UserVisibleAttribute: especifica se o formato aparece na página Fontes e Cores da caixa de diálogo Opções .
OrderAttribute: a prioridade do formato. Os valores válidos são de Priority.
ClassificationTypeAttribute: o nome do tipo de classificação para o qual esse formato é mapeado.
O exemplo a seguir mostra 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; }
Estender margens e barras de rolagem
Margens e barras de rolagem são os principais elementos de exibição do editor, além da própria exibição de texto. Você pode fornecer qualquer número de margens além das margens padrão que aparecem ao redor da exibição de texto.
Implemente uma 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 junto com os seguintes atributos:
NameAttribute: o nome da margem.
OrderAttribute: a ordem na qual a margem aparece, em relação às outras margens.
Estas são as margens internas:
"Barra de rolagem horizontal do Wpf"
"Barra de rolagem vertical do WPF"
"Margem de Número de Linha do WPF"
As margens horizontais que têm um atributo de
After="Wpf Horizontal Scrollbar"pedido são exibidas abaixo da margem interna e as margens horizontais que têm um atributo deBefore ="Wpf Horizontal Scrollbar"ordem são exibidas acima da margem interna. As margens verticais direitas que têm um atributo deAfter="Wpf Vertical Scrollbar"pedido são exibidas à direita da barra de rolagem. Margens verticais esquerdas que têm um atributo de ordem deAfter="Wpf Line Number Margin"aparecer à esquerda da margem de número de linha (se estiver visível).
MarginContainerAttribute: o tipo de margem (esquerda, direita, superior ou inferior).
ContentTypeAttribute: o tipo de conteúdo (por exemplo, "texto" ou "código") para o qual sua margem é válida.
O exemplo a seguir mostra os atributos de exportação em um provedor de margem para uma margem que aparece à direita da margem de número de linha.
[Export(typeof(IWpfTextViewMarginProvider))]
[Name("TestMargin")]
[Order(Before = "Wpf Line Number Margin")]
[MarginContainer(PredefinedMarginNames.Left)]
[ContentType("text")]
Estender marcas
As marcas são uma maneira de associar dados a diferentes tipos de texto. Em muitos casos, os dados associados são exibidos como um efeito visual, mas nem todas as marcas têm uma apresentação visual. Você pode definir seu próprio tipo de marca implementando ITag. Você também deve implementar ITagger<T> para fornecer as marcas para um determinado conjunto de intervalos de texto e um ITaggerProvider para fornecer o tagger. Você deve exportar o provedor de marcação junto com os seguintes atributos:
ContentTypeAttribute: o tipo de conteúdo (por exemplo, "text" ou "code") para o qual sua marca é válida.
TagTypeAttribute: o tipo de marca.
O exemplo a seguir mostra os atributos de exportação em um provedor de marcação.
<CodeContentPlaceHolder>8</CodeContentPlaceHolder> Os seguintes tipos de marca são internos:
ClassificationTag: associado a um IClassificationType.
ErrorTag: associado a tipos de erro.
TextMarkerTag: associado a um adorno.
Observação
Para obter um exemplo de um TextMarkerTag, consulte a definição HighlightWordTag em Passo a passo: Realçando Texto.
OutliningRegionTag: associado a regiões que podem ser expandidas ou recolhidas na estrutura de tópicos.
SpaceNegotiatingAdornmentTag: define o espaço que um adorno ocupa em uma exibição de texto. Para obter mais informações sobre adornos de negociação de espaço, consulte a seção a seguir.
IntraTextAdornmentTag: fornece espaçamento automático e dimensionamento para o adorno.
Para localizar e usar marcas para buffers e exibições, importe o IViewTagAggregatorFactoryService ou o IBufferTagAggregatorFactoryService, que fornece um ITagAggregator<T> 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 a MarkerFormatDefinition classe para definir a aparência de uma marca. Você deve exportar sua classe (como um EditorFormatDefinition)com os seguintes atributos:
NameAttribute: o nome usado para referenciar esse formato
UserVisibleAttribute: isso faz com que o formato apareça na interface do usuário
No construtor, você define o nome de exibição e a aparência da marca. BackgroundColor define a cor de preenchimento e ForegroundColor define a cor da borda. O DisplayName é o nome localizável da definição de formato.
Veja a seguir 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 essa definição de formato a uma marca, referencie o nome definido no atributo de nome da classe (não o nome de exibição).
Observação
Para obter um exemplo de um MarkerFormatDefinition, consulte a classe HighlightWordFormatDefinition em Passo a passo: realçando texto.
Estender adornos
Os adornos definem efeitos visuais que podem ser adicionados ao texto exibido em um modo de exibição de texto ou à própria exibição de texto. Você pode definir seu próprio adorno como qualquer tipo de UIElement.
Em sua classe de adorno, você deve declarar um AdornmentLayerDefinition. Para registrar sua camada de adorno, exporte-a junto com os seguintes atributos:
NameAttribute: o nome do adorno.
OrderAttribute: a ordem do adorno em relação a outras camadas de adorno. A classe PredefinedAdornmentLayers define quatro camadas padrão: Seleção, Estrutura de Tópicos, Texto e Texto.
O exemplo a seguir mostra 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 implemente IWpfTextViewCreationListener e manipule seu 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 "code") para o qual o adorno é válido.
TextViewRoleAttribute: o tipo de exibição de texto para o qual esse adorno é válido. A classe PredefinedTextViewRoles tem o conjunto de funções de exibição de texto predefinidas. Por exemplo, Document é usado principalmente para exibições de texto de arquivos. Interactive é usado para exibições de texto que um usuário pode editar ou navegar usando um mouse e um teclado. Exemplos de Interactive exibições são a exibição de texto do editor e a janela Saída .
O exemplo a seguir mostra os atributos de exportação no provedor de adornos.
[Export(typeof(IWpfTextViewCreationListener))]
[ContentType("csharp")]
[TextViewRole(PredefinedTextViewRoles.Document)]
internal sealed class TestAdornmentProvider : IWpfTextViewCreationListener
Um adorno de negociação de espaço é aquele que ocupa espaço no mesmo nível que o texto. Para criar esse tipo de adorno, você deve definir uma classe de marca que herda, SpaceNegotiatingAdornmentTagque define a quantidade de espaço que o adorno ocupa.
Assim como acontece com todos os adornos, você deve exportar a definição da camada de adorno.
[Export]
[Name("TestAdornment")]
[Order(After = DefaultAdornmentLayers.Text)]
internal AdornmentLayerDefinition testAdornmentLayer;
Para instanciar o adorno de negociação de espaço, você deve criar uma classe que implemente ITaggerProvider, além da classe que implementa IWpfTextViewCreationListener (como com outros tipos de adornos).
Para registrar o provedor de marcação, você deve exportá-lo junto com os seguintes atributos:
ContentTypeAttribute: o tipo de conteúdo (por exemplo, "text" ou "code") para o qual o adorno é válido.
TextViewRoleAttribute: o tipo de exibição de texto para o qual essa marca ou adorno é válido. A classe PredefinedTextViewRoles tem o conjunto de funções de exibição de texto predefinidas. Por exemplo, Document é usado principalmente para exibições de texto de arquivos. Interactive é usado para exibições de texto que um usuário pode editar ou navegar usando um mouse e um teclado. Exemplos de Interactive exibições são a exibição de texto do editor e a janela Saída .
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 marcação para uma marca de adorno de negociação de espaço.
[Export(typeof(ITaggerProvider))]
[ContentType("text")]
[TextViewRole(PredefinedTextViewRoles.Document)]
[TagType(typeof(SpaceNegotiatingAdornmentTag))]
[TagType(typeof(TestSpaceNegotiatingTag))]
internal sealed class TestTaggerProvider : ITaggerProvider
Estendendo processadores de mouse
Você pode adicionar tratamento especial para entrada do mouse. Crie uma classe que herda MouseProcessorBase e substitua os eventos do mouse para a entrada que você deseja manipular. Você também deve implementar IMouseProcessorProvider em uma segunda classe e exportá-la junto com a ContentTypeAttribute que especifica o tipo de conteúdo (por exemplo, "texto" 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
Estender manipuladores de descarte
Você pode personalizar o comportamento de manipuladores de descarte para tipos específicos de texto criando uma classe que implementa IDropHandler e uma segunda classe que implementa IDropHandlerProvider para criar o manipulador de descarte. Você deve exportar o manipulador de descarte junto com os seguintes atributos:
DropFormatAttribute: o formato de texto para o qual esse manipulador de descarte é válido. Os seguintes formatos são tratados na ordem de prioridade do mais alto para o mais baixo:
Qualquer formato personalizado
FileDrop
EnhancedMetafile
WaveAudio
Riff
Dif
Localidade
Paleta
PenData
Serializável
SymbolicLink
Xaml
XamlPackage
Tiff
Mapa de bits
Dib
MetafilePicture
CSV
System.String
Formato HTML
Texto Unicode
OEMText
Texto
NameAttribute: o nome do manipulador de descarte.
OrderAttribute: a ordenação do manipulador de descarte antes ou depois do manipulador de descarte padrão. O manipulador de descarte padrão do Visual Studio é chamado de "DefaultFileDropHandler".
O exemplo a seguir mostra os atributos de exportação em um provedor de manipulador de descarte.
[Export(typeof(IDropHandlerProvider))]
[DropFormat("Text")]
[Name("TestDropHandler")]
[Order(Before="DefaultFileDropHandler")]
internal class TestDropHandlerProvider : IDropHandlerProvider
Estendendo opções do editor
Você pode definir opções para serem válidas apenas em um determinado escopo, por exemplo, em um modo de 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 do WPF (Windows Presentation Foundation). Essas opções podem ser encontradas em DefaultOptions, DefaultTextViewOptionse DefaultWpfViewOptions.
Para adicionar uma nova opção, derive uma classe de uma destas classes de definição de opção:
-
O exemplo a seguir mostra como exportar uma definição de opção que tem um valor booliano.
[Export(typeof(EditorOptionDefinition))]
internal sealed class TestOption : EditorOptionDefinition<bool>
Estender o IntelliSense
O IntelliSense é um termo geral para um grupo de recursos que fornecem informações sobre texto estruturado e conclusão da instrução para ele. Esses recursos incluem conclusão da instrução, ajuda de assinatura, Informações Rápidas e lâmpadas. A conclusão da instrução ajuda os usuários a digitar corretamente uma palavra-chave de idioma ou nome de membro. A ajuda de assinatura exibe a assinatura ou as assinaturas do método que o usuário acabou de digitar. Informações Rápidas exibem uma assinatura completa para um tipo ou nome de membro quando o mouse se baseia nele. A lâmpada fornece ações adicionais para determinados identificadores em determinados contextos, por exemplo, renomeando todas as ocorrências de uma variável depois que uma ocorrência foi renomeada.
O design de um recurso do IntelliSense é praticamente o mesmo em todos os casos:
Um agente do IntelliSense é responsável pelo processo geral.
Uma sessão do IntelliSense representa a sequência de eventos entre o gatilho do apresentador e o committal ou cancelamento da seleção. A sessão normalmente é disparada por algum gesto do usuário.
Um controlador IntelliSense é responsável por decidir quando a sessão deve começar e terminar. Ele também decide quando as informações devem ser confirmadas e quando a sessão deve ser cancelada.
Uma fonte do IntelliSense fornece o conteúdo e decide a melhor correspondência.
Um apresentador do IntelliSense é responsável por exibir o conteúdo.
Na maioria dos casos, recomendamos que você forneça pelo menos uma origem e um controlador. Você também pode fornecer um apresentador se quiser personalizar a exibição.
Implementar uma fonte do IntelliSense
Para personalizar uma origem, você deve implementar uma (ou mais) das seguintes interfaces de origem:
Importante
ISmartTagSource foi preterido em favor de ISuggestedActionsSource.
Além disso, você deve implementar um provedor do mesmo tipo:
Importante
ISmartTagSourceProvider foi preterido em favor de ISuggestedActionsSourceProvider.
Você deve exportar o provedor junto com os seguintes atributos:
NameAttribute: o nome da origem.
ContentTypeAttribute: o tipo de conteúdo (por exemplo, "texto" ou "código") ao qual a origem se aplica.
OrderAttribute: a ordem na qual a origem deve aparecer (em 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 fontes do IntelliSense, confira os seguintes passo a passo:
Implementar um controlador IntelliSense
Para personalizar um controlador, você deve implementar a IIntellisenseController interface. Além disso, você deve implementar um provedor de controlador junto com os seguintes atributos:
NameAttribute: o nome do controlador.
ContentTypeAttribute: o tipo de conteúdo (por exemplo, "texto" ou "código") ao qual o controlador se aplica.
OrderAttribute: a ordem na qual o controlador deve aparecer (em 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 controladores IntelliSense, confira os seguintes passo a passo: