Exemplarische Vorgehensweise: Erstellen einer Randglyphe
Sie können die Darstellung von Editor-Seitenrändern mithilfe von benutzerdefinierten Editorerweiterungen anpassen. In dieser exemplarischen Vorgehensweise wird eine benutzerdefinierte Glyphe am Indikatorrand platziert, wenn das Wort "todo" in einem Codekommentar angezeigt wird.
Erstellen eines MEF-Projekts
Erstellen Sie ein C#VSIX-Projekt. (Im Dialogfeld "Neues Projekt ", wählen Sie Visual C# / Erweiterbarkeit und dann VSIX-Projekt aus.) Benennen Sie die Lösung
TodoGlyphTest
.Fügen Sie ein Editor-Klassifiziererprojektelement hinzu. Weitere Informationen finden Sie unter Erstellen einer Erweiterung mit einer Editorelementvorlage.
Löschen Sie die vorhandenen Klassendateien.
Definieren der Glyphe
Definieren Sie eine Glyphe, indem Sie die IGlyphFactory Schnittstelle ausführen.
So definieren Sie die Glyphe
Fügen Sie eine Klassendatei hinzu, und nennen Sie sie
TodoGlyphFactory
.Fügen Sie den folgenden Code mithilfe von Deklarationen hinzu.
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;
Fügen Sie eine Klasse mit dem Namen
TodoGlyphFactory
hinzu, die implementiert IGlyphFactorywird.Fügen Sie ein privates Feld hinzu, das die Dimensionen der Glyphe definiert.
Implementieren Sie
GenerateGlyph
das Glyphen-Benutzeroberflächenelement (UI).TodoTag
wird weiter unten in dieser exemplarischen Vorgehensweise definiert.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; }
Fügen Sie eine Klasse mit dem Namen
TodoGlyphFactoryProvider
hinzu, die implementiert IGlyphFactoryProviderwird. Exportieren Sie diese Klasse mit einer NameAttribute von "TodoGlyph", einer OrderAttribute von "After VsTextMarker", einem ContentTypeAttribute "Code" und einem TagTypeAttribute todoTag.Implementieren Sie die GetGlyphFactory Methode durch Instanziieren der
TodoGlyphFactory
.
Definieren eines Todo-Tags und -Tags
Definieren Sie die Beziehung zwischen dem UI-Element, das Sie in den vorherigen Schritten und dem Indikatorrand definiert haben. Erstellen Sie einen Tagtyp und einen Tagger, und exportieren Sie ihn mithilfe eines Tagger-Anbieters.
So definieren Sie ein Todo-Tag und einen Tagger
Fügen Sie dem Projekt eine neue Klassendatei hinzu, und nennen Sie sie
TodoTagger
.Fügen Sie die folgenden Importe hinzu.
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;
Fügen Sie eine Klasse namens
TodoTag
hinzu.Ändern Sie die Klasse,
TodoTagger
die den TypTodoTag
implementiertITagger<T>.Fügen Sie der
TodoTagger
Klasse private Felder für ein IClassifier und für den Text hinzu, der in den Klassifizierungsbereichen zu finden ist.Fügen Sie einen Konstruktor hinzu, der den Klassifizierer festlegt.
Implementieren Sie die GetTags Methode, indem Sie nach allen Klassifizierungen suchen, deren Namen das Wort "Comment" enthalten und dessen Text den Suchtext enthält. Wenn der Suchtext gefunden wird, geben Sie einen neuen TagSpan<T> Typ
TodoTag
zurück.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()); } } } } }
Deklarieren eines Ereignisses
TagsChanged
.Fügen Sie eine Klasse mit dem Namen
TodoTaggerProvider
hinzu, die sie implementiert ITaggerProvider, und exportieren Sie sie mit einem ContentTypeAttribute "Code" und einem TagTypeAttribute todoTag.Importieren Sie IClassifierAggregatorService.
Implementieren Sie die CreateTagger Methode durch Instanziieren der
TodoTagger
.
Erstellen und Testen des Codes
Um diesen Code zu testen, erstellen Sie die TodoGlyphTest-Lösung, und führen Sie sie in der experimentellen Instanz aus.
So erstellen und testen Sie die TodoGlyphTest-Lösung
Erstellen Sie die Projektmappe.
Führen Sie das Projekt aus, indem Sie F5 drücken. Eine zweite Instanz von Visual Studio wird gestartet.
Stellen Sie sicher, dass der Indikatorrand angezeigt wird. (Auf der Menü "Extras", klicken Sie auf "Optionen". Stellen Sie auf der Seite "Text-Editor" sicher, dass der Indikatorrand ausgewählt ist.)
Öffnen Sie eine Codedatei mit Kommentaren. Fügen Sie das Wort "Todo" zu einem der Kommentarabschnitte hinzu.
Ein hellblauer Kreis mit einem dunkelblauen Umriss wird links neben dem Codefenster im Indikatorrand angezeigt.