Sdílet prostřednictvím


Návod: Vytvoření glyfů okrajů

Vzhled okrajů editoru můžete přizpůsobit pomocí vlastních rozšíření editoru. Tento názorný postup umístí vlastní glyf na okraj ukazatele pokaždé, když se slovo "todo" zobrazí v komentáři kódu.

Vytvoření projektu MEF

  1. Vytvořte projekt VSIX jazyka C#. (V Dialogové okno Nový projekt , vyberte Visual C# / Rozšiřitelnost a pak projekt VSIX.) Pojmenujte řešení TodoGlyphTest.

  2. Přidejte položku projektu klasifikátoru editoru. Další informace najdete v tématu Vytvoření rozšíření pomocí šablony položky editoru.

  3. Odstraňte existující soubory třídy.

Definování glyfu

Definujte glyf spuštěním IGlyphFactory rozhraní.

Definování glyfů

  1. Přidejte soubor třídy a pojmenujte ho TodoGlyphFactory.

  2. Přidejte následující kód pomocí deklarací.

    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. Přidejte třídu s názvem TodoGlyphFactory , která implementuje IGlyphFactory.

    internal class TodoGlyphFactory : IGlyphFactory
    
  4. Přidejte soukromé pole, které definuje dimenze glyfu.

    const double m_glyphSize = 16.0;
    
  5. Implementujte GenerateGlyph definováním elementu uživatelského rozhraní (UI) glyph. TodoTag je definován dále v tomto názorném postupu.

    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. Přidejte třídu s názvem TodoGlyphFactoryProvider , která implementuje IGlyphFactoryProvider. Exportovat tuto třídu s " NameAttribute TodoGlyph", an OrderAttribute after VsTextMarker, a " ContentTypeAttribute code" a a todoTag TagTypeAttribute .

    [Export(typeof(IGlyphFactoryProvider))]
    [Name("TodoGlyph")]
    [Order(After = "VsTextMarker")]
    [ContentType("code")]
    [TagType(typeof(TodoTag))]
    internal sealed class TodoGlyphFactoryProvider : IGlyphFactoryProvider
    
  7. Implementujte metodu GetGlyphFactory vytvořením instance TodoGlyphFactory.

    public IGlyphFactory GetGlyphFactory(IWpfTextView view, IWpfTextViewMargin margin)
    {
        return new TodoGlyphFactory();
    }
    

Definování značky todo a taggeru

Definujte vztah mezi prvkem uživatelského rozhraní, který jste definovali v předchozích krocích, a okrajem ukazatele. Vytvořte typ značky a tagger a exportujte ho pomocí zprostředkovatele taggeru.

Definování značky úkolů a taggeru

  1. Přidejte do projektu nový soubor třídy a pojmenujte ho TodoTagger.

  2. Přidejte následující importy.

    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. Přidejte třídu s názvem TodoTag.

    internal class TodoTag : IGlyphTag
    
  4. Upravte třídu s názvem TodoTagger , která implementuje ITagger<T> typ TodoTag.

    internal class TodoTagger : ITagger<TodoTag>
    
  5. TodoTagger Do třídy přidejte soukromá pole pro textIClassifier, který se má najít v rozsahu klasifikace.

    private IClassifier m_classifier;
    private const string m_searchText = "todo";
    
  6. Přidejte konstruktor, který nastaví klasifikátor.

    internal TodoTagger(IClassifier classifier)
    {
        m_classifier = classifier;
    }
    
  7. Implementujte metodu GetTags vyhledáním všech klasifikací, jejichž názvy obsahují slovo "komentář" a jehož text obsahuje hledaný text. Kdykoli se najde hledaný text, vraťte nový TagSpan<T> typ 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());
                    }
                }
            }
        }
    }
    
  8. Deklarujte TagsChanged událost.

    public event EventHandler<SnapshotSpanEventArgs> TagsChanged;
    
  9. Přidejte třídu s názvem TodoTaggerProvider , která implementuje ITaggerProvidera exportuje ji s kódem ContentTypeAttribute a značkou TagTypeAttribute TodoTag.

    [Export(typeof(ITaggerProvider))]
    [ContentType("code")]
    [TagType(typeof(TodoTag))]
    class TodoTaggerProvider : ITaggerProvider
    
  10. Naimportujte soubor IClassifierAggregatorService.

    [Import]
    internal IClassifierAggregatorService AggregatorService;
    
  11. Implementujte metodu CreateTagger vytvořením instance TodoTagger.

    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>;
    }
    

Sestavení a otestování kódu

Pokud chcete tento kód otestovat, sestavte řešení TodoGlyphTest a spusťte ho v experimentální instanci.

Sestavení a testování řešení TodoGlyphTest

  1. Sestavte řešení.

  2. Spusťte projekt stisknutím klávesy F5. Spustí se druhá instance sady Visual Studio.

  3. Ujistěte se, že se zobrazuje okraj ukazatele. (Na kartě Nabídka Nástroje , klepněte na příkaz Možnosti. Na stránce Textový editor se ujistěte, že je vybraný okraj ukazatele.)

  4. Otevřete soubor kódu, který obsahuje komentáře. Přidejte slovo "todo" do některého z oddílů komentáře.

  5. Světle modrý kruh s tmavě modrou osnovou se zobrazí na okraji ukazatele vlevo od okna kódu.