Exemplarische Vorgehensweise: Ein Rand-Symbol erstellen
Sie können die Darstellung von Editor rändern anpassen, indem Sie benutzerdefinierte Erweiterungen des Editors verwenden. Diese exemplarische Vorgehensweise setzt ein benutzerdefiniertes Symbol auf dem Indikatorrand, sobald das Wort „todo“ in einem Codekommentars angezeigt wird.
Vorbereitungsmaßnahmen
Zum Abschließen dieser exemplarischen Vorgehensweise müssen Sie Visual Studio 2010 SDKinstallieren.
Hinweis
Weitere Informationen über das Visual Studio-SDK finden Sie unter Erweitern von Visual Studio Overview.Um herauszufinden finden Sie unter wie das Visual Studio-SDK, auf Visual Studio Extensibility Developer Center der MSDN-Website herunterlädt.
Ein Projekt des Managed Extensibility Framework (MEF)
So erstellen Sie ein MEF-Projekt
Erstellen Sie ein Visual C#- oder ein Visual Basic-Editor-Klassifizierungs enthält. Geben Sie der Projektmappe TodoGlyphTest.
Öffnen Sie die Source.extension.vsixmanifest-Datei im VSIX-Manifest-Editor.
Überprüfen Sie, ob die Content Überschrift einen MEF-Komponenten-Inhaltstyp enthält und dass Path zu TodoGlyphTest.dll festgelegt ist.
Speichern und schließen Sie Source.extension.vsixmanifest.
Entfernen Sie die vorhandenen Klassendateien.
Das Symbol definieren
Definieren eines Symbols, indem Sie die IGlyphFactory-Schnittstelle implementieren.
So definieren Sie das Symbol
Fügen Sie eine Klassendatei hinzu, und nennen Sie sie TodoGlyphFactory.
Fügen Sie die folgenden Importe hinzu.
Imports System.ComponentModel.Composition Imports System.Windows Imports System.Windows.Shapes Imports System.Windows.Media Imports System.Windows.Controls Imports Microsoft.VisualStudio.Text Imports Microsoft.VisualStudio.Text.Editor Imports Microsoft.VisualStudio.Text.Formatting Imports Microsoft.VisualStudio.Text.Tagging Imports Microsoft.VisualStudio.Utilities
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 hinzu, die TodoGlyphFactory , die IGlyphFactoryimplementiert.
Friend Class TodoGlyphFactory Implements IGlyphFactory
internal class TodoGlyphFactory : IGlyphFactory
Fügen Sie ein privates Feld hinzu, das die Abmessungen des Symbols definiert.
Const m_glyphSize As Double = 16.0
const double m_glyphSize = 16.0;
Implementieren Sie GenerateGlyph , indem Sie auf das Symbol Element der Benutzeroberfläche definieren. TodoTag wird später in dieser exemplarischen Vorgehensweise definiert.
Public Function GenerateGlyph(ByVal line As IWpfTextViewLine, ByVal tag As IGlyphTag) As System.Windows.UIElement Implements IGlyphFactory.GenerateGlyph ' Ensure we can draw a glyph for this marker. If tag Is Nothing OrElse Not (TypeOf tag Is TodoTag) Then Return Nothing End If Dim ellipse As Ellipse = New Ellipse() ellipse.Fill = Brushes.LightBlue ellipse.StrokeThickness = 2 ellipse.Stroke = Brushes.DarkBlue ellipse.Height = m_glyphSize ellipse.Width = m_glyphSize Return ellipse End Function
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 hinzu, die TodoGlyphFactoryProvider , die IGlyphFactoryProviderimplementiert. Exportieren Sie diese Klasse mit NameAttribute von „TodoGlyph“, OrderAttribute VsTextMarker, nach der ContentTypeAttribute „und“ des Codes TagTypeAttribute von TodoTag.
<Export(GetType(IGlyphFactoryProvider)), Name("TodoGlyph"), Order(After:="VsTextMarker"), ContentType("code"), TagType(GetType(TodoTag))> Friend NotInheritable Class TodoGlyphFactoryProvider Implements IGlyphFactoryProvider
[Export(typeof(IGlyphFactoryProvider))] [Name("TodoGlyph")] [Order(After = "VsTextMarker")] [ContentType("code")] [TagType(typeof(TodoTag))] internal sealed class TodoGlyphFactoryProvider : IGlyphFactoryProvider
Implementieren Sie die GetGlyphFactory-Methode, indem Sie TodoGlyphFactoryinstanziieren.
Public Function GetGlyphFactory(ByVal view As IWpfTextView, ByVal margin As IWpfTextViewMargin) As IGlyphFactory Implements IGlyphFactoryProvider.GetGlyphFactory Return New TodoGlyphFactory() End Function
public IGlyphFactory GetGlyphFactory(IWpfTextView view, IWpfTextViewMargin margin) { return new TodoGlyphFactory(); }
Ein Tag und einen Tagger definieren Todo
Definieren Sie die Beziehung zwischen dem Benutzeroberflächenelement, das Sie in den vorherigen Schritten und am Indikatorrand mit einem definierten und Tagtyp einen Tagger erstellt haben, und dem Exportieren, indem Sie einen Anbieter Tagger verwenden.
So fügen Sie ein todo einen Tag und definieren Tagger
Fügen Sie dem Projekt eine neue Klasse hinzu, und nennen Sie sie TodoTagger.
Fügen Sie die folgenden Importe hinzu.
Imports System Imports System.Collections.Generic Imports System.ComponentModel.Composition Imports Microsoft.VisualStudio.Text Imports Microsoft.VisualStudio.Text.Tagging Imports Microsoft.VisualStudio.Text.Editor Imports Microsoft.VisualStudio.Text.Classification Imports Microsoft.VisualStudio.Utilities
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 hinzu, die TodoTagbenannt ist.
Friend Class TodoTag Implements IGlyphTag Public Sub New() MyBase.New() End Sub End Class
internal class TodoTag : IGlyphTag
Ändern Sie die Klasse, die TodoTagger , die ITagger des Typs TodoTagimplementiert.
Friend Class TodoTagger Implements ITagger(Of TodoTag)
internal class TodoTagger : ITagger<TodoTag>
So fügen Sie TodoTagger-Klasse für private Felder hinzu und IClassifier sodass der Text in Klassifizierungs spannen gesucht werden soll.
Private m_classifier As IClassifier Private Const m_searchText As String = "todo"
private IClassifier m_classifier; private const string m_searchText = "todo";
Fügen Sie einen Konstruktor hinzu, der die Klassifizierung festlegt.
Friend Sub New(ByVal classifier As IClassifier) m_classifier = classifier End Sub
internal TodoTagger(IClassifier classifier) { m_classifier = classifier; }
Implementieren Sie die GetTags-Methode, indem Sie alle Klassifizierungs spannen suchen, deren Name das Wort „Kommentar“ enthalten und deren Text den Suchtext enthält. Jedes Mal, wenn der Suchtext gefunden wurde, führen Sie nach neuen TagSpan des Typs TodoTag.
Private Function GetTags(ByVal spans As NormalizedSnapshotSpanCollection) As IEnumerable(Of ITagSpan(Of TodoTag)) Implements ITagger(Of TodoTag).GetTags Dim list As List(Of ITagSpan(Of TodoTag)) list = New List(Of ITagSpan(Of TodoTag))() For Each span As SnapshotSpan In spans 'look at each classification span \ For Each classification As ClassificationSpan In m_classifier.GetClassificationSpans(span) 'if the classification is a comment If classification.ClassificationType.Classification.ToLower().Contains("comment") Then 'if the word "todo" is in the comment, 'create a new TodoTag TagSpan Dim index As Integer = classification.Span.GetText().ToLower().IndexOf(m_searchText) If index <> -1 Then list.Add(New TagSpan(Of TodoTag)(New SnapshotSpan(classification.Span.Start + index, m_searchText.Length), New TodoTag())) End If End If Next classification Next span Return list End Function
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 Sie ein TagsChanged-Ereignis.
Public Event TagsChanged(ByVal sender As Object, ByVal e As Microsoft.VisualStudio.Text.SnapshotSpanEventArgs) Implements Microsoft.VisualStudio.Text.Tagging.ITagger(Of TodoTag).TagsChanged
public event EventHandler<SnapshotSpanEventArgs> TagsChanged;
Fügen Sie eine Klasse hinzu, die TodoTaggerProvider benannt wird, die ITaggerProviderimplementiert, und exportieren Sie sie mit ContentTypeAttribute „und“ des Codes TagTypeAttribute von TodoTag.
<Export(GetType(ITaggerProvider)), ContentType("code"), TagType(GetType(TodoTag))> Friend Class TodoTaggerProvider Implements ITaggerProvider
[Export(typeof(ITaggerProvider))] [ContentType("code")] [TagType(typeof(TodoTag))] class TodoTaggerProvider : ITaggerProvider
Importieren Sie IClassifierAggregatorService.
<Import()> Friend AggregatorService As IClassifierAggregatorService
[Import] internal IClassifierAggregatorService AggregatorService;
Implementieren Sie die CreateTagger``1-Methode, indem Sie TodoTaggerinstanziieren.
Public Function CreateTagger(Of T As Microsoft.VisualStudio.Text.Tagging.ITag)(ByVal buffer As Microsoft.VisualStudio.Text.ITextBuffer) As Microsoft.VisualStudio.Text.Tagging.ITagger(Of T) Implements Microsoft.VisualStudio.Text.Tagging.ITaggerProvider.CreateTagger If buffer Is Nothing Then Throw New ArgumentNullException("buffer") End If Return TryCast(New TodoTagger(AggregatorService.GetClassifier(buffer)), ITagger(Of T)) End Function
public ITagger<T> CreateTagger<T>(ITextBuffer buffer) where T : ITag { if (buffer == null) { throw new ArgumentNullException("buffer"); } return new TodoTagger(AggregatorService.GetClassifier(buffer)) as ITagger<T>; }
Erstellen und Testen von Code
Um diesen Code zu testen, erstellen Sie die TodoGlyphTest-Projektmappe und führen Sie sie in der experimentellen Instanz aus.
So erstellen und testen die TodoGlyphTest-Projektmappe
Erstellen Sie die Projektmappe.
Führen Sie das Projekt aus, indem Sie F5 drücken. Eine zweite Instanz von Visual Studio wird instanziiert.
Überprüfen Sie, ob der Indikatorrand angezeigt wird. (Klicken Sie im Menü Extras auf Optionen. Auf der Seite Text-Editor Sie sicher, dass Indikatorrand ) ausgewählt ist.
Öffnen Sie eine Codedatei mit Kommentaren verfügt. Fügen Sie das Wort „todo einem der Kommentarteile“ hinzu.
Ein hellblauer Kreis mit dunkelblauen Kontur hat, wird am Indikatorrand links im Fenster Code angezeigt werden.