Procedura dettagliata: Creare un glifo del margine
È possibile personalizzare l'aspetto dei margini dell'editor usando estensioni dell'editor personalizzate. Questa procedura dettagliata inserisce un glifo personalizzato sul margine dell'indicatore ogni volta che la parola "todo" viene visualizzata in un commento di codice.
Creare un progetto MEF
Creare un progetto VSIX C#. (In Finestra di dialogo Nuovo progetto , selezionare Visual C# / Estendibilità e quindi progetto VSIX. Assegnare alla soluzione
TodoGlyphTest
il nome .Aggiungere un elemento di progetto Classificatore editor. Per altre informazioni, vedere Creare un'estensione con un modello di elemento dell'editor.
Eliminare i file di classe esistenti.
Definire il glifo
Definire un glifo eseguendo l'interfaccia IGlyphFactory .
Per definire il glifo
Aggiungere un file di classe e assegnargli il nome
TodoGlyphFactory
.Aggiungere il codice seguente usando le dichiarazioni.
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;
Aggiungere una classe denominata
TodoGlyphFactory
che implementa IGlyphFactory.Aggiungere un campo privato che definisce le dimensioni del glifo.
Implementare
GenerateGlyph
definendo l'elemento dell'interfaccia utente del glifo.TodoTag
viene definito più avanti in questa procedura dettagliata.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; }
Aggiungere una classe denominata
TodoGlyphFactoryProvider
che implementa IGlyphFactoryProvider. Esportare questa classe con un NameAttribute valore di "TodoGlyph", di OrderAttribute After VsTextMarker, di ContentTypeAttribute "codice" e di TagTypeAttribute TodoTag.Implementare il GetGlyphFactory metodo creando un'istanza di
TodoGlyphFactory
.
Definire un tag Todo e un tagger
Definire la relazione tra l'elemento dell'interfaccia utente definito nei passaggi precedenti e il margine dell'indicatore. Creare un tipo di tag e contrassegnarlo ed esportarlo usando un provider di tagger.
Per definire un tag todo e un tagger
Aggiungere un nuovo file di classe al progetto e denominarlo
TodoTagger
.Aggiungere le importazioni seguenti.
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;
Aggiungere una classe denominata
TodoTag
.Modificare la classe denominata
TodoTagger
che implementa ITagger<T> il tipoTodoTag
.Per la
TodoTagger
classe aggiungere campi privati per un oggetto IClassifier e per il testo da trovare negli intervalli di classificazione.Aggiungere un costruttore che imposta il classificatore.
Implementare il GetTags metodo trovando tutti gli intervalli di classificazione i cui nomi includono la parola "commento" e il cui testo include il testo di ricerca. Ogni volta che viene trovato il testo di ricerca, restituire un nuovo 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()); } } } } }
Dichiarare un
TagsChanged
evento.Aggiungere una classe denominata
TodoTaggerProvider
che implementa ITaggerProvidered esportarla con un ContentTypeAttribute di "codice" e un TagTypeAttribute di TodoTag.Importare .IClassifierAggregatorService
Implementare il CreateTagger metodo creando un'istanza di
TodoTagger
.
Compilare e testare il codice
Per testare questo codice, compilare la soluzione TodoGlyphTest ed eseguirla nell'istanza sperimentale.
Per compilare e testare la soluzione TodoGlyphTest
Compilare la soluzione.
Eseguire il progetto premendo F5. Viene avviata una seconda istanza di Visual Studio.
Assicurarsi che il margine dell'indicatore sia visualizzato. (In Scegliere Opzioni dal menu Strumenti. Nella pagina Editor di testo verificare che sia selezionato Margine indicatore.
Aprire un file di codice con commenti. Aggiungere la parola "todo" a una delle sezioni di commento.
Un cerchio blu chiaro con un contorno blu scuro viene visualizzato nel margine dell'indicatore a sinistra della finestra del codice.