Demonstra Passo a passo: Criar um glifo de margem
Você pode personalizar a aparência das margens do editor usando extensões de editor personalizadas. Este passo a passo coloca um glifo personalizado na margem do indicador sempre que a palavra "todo" aparece em um comentário de código.
Criar um projeto MEF
Crie um projeto C# VSIX. (No Caixa de diálogo Novo Projeto, selecione Visual C# / Extensibilidade e, em seguida, Projeto VSIX.) Nomeie a solução
TodoGlyphTest
.Adicione um item de projeto Editor Classificador. Para obter mais informações, consulte Criar uma extensão com um modelo de item do editor.
Exclua os arquivos de classe existentes.
Definir o glifo
Defina um glifo executando a IGlyphFactory interface.
Para definir o glifo
Adicione um arquivo de classe e nomeie-o
TodoGlyphFactory
.Adicione o código a seguir usando declarações.
using System.ComponentModel.Composition; using System.Windows; using System.Windows.Shapes; using System.Windows.Media; using System.Windows.Controls; using Microsoft.VisualStudio.Text; using Microsoft.VisualStudio.Text.Editor; using Microsoft.VisualStudio.Text.Formatting; using Microsoft.VisualStudio.Text.Tagging; using Microsoft.VisualStudio.Utilities;
Adicione uma classe chamada
TodoGlyphFactory
que implementa IGlyphFactoryo .Adicione um campo privado que defina as dimensões do glifo.
Implemente
GenerateGlyph
definindo o elemento da interface do usuário (UI) do glifo.TodoTag
é definido posteriormente nesta explicação passo a passo.public UIElement GenerateGlyph(IWpfTextViewLine line, IGlyphTag tag) { // Ensure we can draw a glyph for this marker. if (tag == null || !(tag is TodoTag)) { return null; } System.Windows.Shapes.Ellipse ellipse = new Ellipse(); ellipse.Fill = Brushes.LightBlue; ellipse.StrokeThickness = 2; ellipse.Stroke = Brushes.DarkBlue; ellipse.Height = m_glyphSize; ellipse.Width = m_glyphSize; return ellipse; }
Adicione uma classe chamada
TodoGlyphFactoryProvider
que implementa IGlyphFactoryProvidero . Exporte essa classe com um de "TodoGlyph", um de After VsTextMarker, um de "code" e um NameAttribute OrderAttribute ContentTypeAttribute TagTypeAttribute de TodoTag.Implemente o método instanciando o GetGlyphFactory
TodoGlyphFactory
.
Definir uma tag e um tagger Todo
Defina a relação entre o elemento da interface do usuário que você definiu nas etapas anteriores e a margem do indicador. Crie um tipo de tag e um tagger e exporte-o usando um provedor de tagger.
Para definir uma tag todo e um tagger
Adicione um novo arquivo de classe ao projeto e nomeie-o
TodoTagger
.Adicione as seguintes importações.
using System; using System.Collections.Generic; using System.ComponentModel.Composition; using Microsoft.VisualStudio.Text; using Microsoft.VisualStudio.Text.Tagging; using Microsoft.VisualStudio.Text.Editor; using Microsoft.VisualStudio.Text.Classification; using Microsoft.VisualStudio.Utilities;
Adicione uma classe chamada
TodoTag
.Modifique a classe chamada
TodoTagger
que implementa ITagger<T> do tipoTodoTag
.Para a
TodoTagger
classe, adicione campos particulares para um IClassifier e para o texto localizar nas extensões de classificação.Adicione um construtor que defina o classificador.
Implemente o método localizando todas as extensões de classificação cujos nomes incluem a palavra "comentário" e cujo texto inclui o GetTags texto de pesquisa. Sempre que o texto de pesquisa for encontrado, retorne um novo TagSpan<T> tipo
TodoTag
.IEnumerable<ITagSpan<TodoTag>> ITagger<TodoTag>.GetTags(NormalizedSnapshotSpanCollection spans) { foreach (SnapshotSpan span in spans) { //look at each classification span \ foreach (ClassificationSpan classification in m_classifier.GetClassificationSpans(span)) { //if the classification is a comment if (classification.ClassificationType.Classification.ToLower().Contains("comment")) { //if the word "todo" is in the comment, //create a new TodoTag TagSpan int index = classification.Span.GetText().ToLower().IndexOf(m_searchText); if (index != -1) { yield return new TagSpan<TodoTag>(new SnapshotSpan(classification.Span.Start + index, m_searchText.Length), new TodoTag()); } } } } }
Declare um
TagsChanged
evento.Adicione uma classe chamada
TodoTaggerProvider
que implementa ITaggerProvidero e exporte-a com um de "código" e um ContentTypeAttribute TagTypeAttribute de TodoTag.Importe o IClassifierAggregatorService.
Implemente o método instanciando o CreateTagger
TodoTagger
.
Compilar e testar o código
Para testar esse código, compile a solução TodoGlyphTest e execute-a na instância experimental.
Para criar e testar a solução TodoGlyphTest
Compile a solução.
Execute o projeto pressionando F5. Uma segunda instância do Visual Studio é iniciada.
Certifique-se de que a margem do indicador está sendo exibida. (Sobre o Menu Ferramentas, clique em Opções. Na página Editor de Texto, verifique se a opção Margem do indicador está selecionada.)
Abra um arquivo de código que tenha comentários. Adicione a palavra "todo" a uma das seções de comentários.
Um círculo azul claro com um contorno azul escuro aparece na margem do indicador à esquerda da janela de código.