Freigeben über


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

  1. Erstellen Sie ein Visual C#- oder ein Visual Basic-Editor-Klassifizierungs enthält. Geben Sie der Projektmappe TodoGlyphTest.

  2. Öffnen Sie die Source.extension.vsixmanifest-Datei im VSIX-Manifest-Editor.

  3. Überprüfen Sie, ob die Content Überschrift einen MEF-Komponenten-Inhaltstyp enthält und dass Path zu TodoGlyphTest.dll festgelegt ist.

  4. Speichern und schließen Sie Source.extension.vsixmanifest.

  5. Entfernen Sie die vorhandenen Klassendateien.

Das Symbol definieren

Definieren eines Symbols, indem Sie die IGlyphFactory-Schnittstelle implementieren.

So definieren Sie das Symbol

  1. Fügen Sie eine Klassendatei hinzu, und nennen Sie sie TodoGlyphFactory.

  2. 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;
    
  3. Fügen Sie eine Klasse hinzu, die TodoGlyphFactory , die IGlyphFactoryimplementiert.

    Friend Class TodoGlyphFactory
        Implements IGlyphFactory
    
    internal class TodoGlyphFactory : IGlyphFactory
    
  4. 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;
    
  5. 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;
    }
    
  6. 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
    
  7. 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

  1. Fügen Sie dem Projekt eine neue Klasse hinzu, und nennen Sie sie TodoTagger.

  2. 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;
    
  3. 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
    
  4. Ändern Sie die Klasse, die TodoTagger , die ITagger des Typs TodoTagimplementiert.

    Friend Class TodoTagger
        Implements ITagger(Of TodoTag)
    
    internal class TodoTagger : ITagger<TodoTag>
    
  5. 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";
    
  6. 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;
    }
    
  7. 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());
                    }
                }
            }
        }
    }
    
  8. 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;
    
  9. 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
    
  10. Importieren Sie IClassifierAggregatorService.

    <Import()>
    Friend AggregatorService As IClassifierAggregatorService
    
    [Import]
    internal IClassifierAggregatorService AggregatorService;
    
  11. 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

  1. Erstellen Sie die Projektmappe.

  2. Führen Sie das Projekt aus, indem Sie F5 drücken. Eine zweite Instanz von Visual Studio wird instanziiert.

  3. Ü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.

  4. Öffnen Sie eine Codedatei mit Kommentaren verfügt. Fügen Sie das Wort „todo einem der Kommentarteile“ hinzu.

  5. Ein hellblauer Kreis mit dunkelblauen Kontur hat, wird am Indikatorrand links im Fenster Code angezeigt werden.