İzlenecek yol: Kenar boşluğu karakteri oluşturma

Özel düzenleyici uzantılarını kullanarak düzenleyici kenar boşluklarının görünümünü özelleştirebilirsiniz. Bu izlenecek yol, bir kod açıklamasında "yapılacaklar" sözcüğü her görüntülendiğinde gösterge kenar boşluğuna özel bir karakter ekler.

MEF projesi oluşturma

  1. C# VSIX projesi oluşturun. (Yeni Proje iletişim kutusu, Visual C# / Genişletilebilirlik'i ve ardından VSIX Projesi'ni seçin.) Çözümü TodoGlyphTestolarak adlandırın.

  2. Düzenleyici Sınıflandırıcısı proje öğesi ekleyin. Daha fazla bilgi için bkz . Düzenleyici öğesi şablonuyla uzantı oluşturma.

  3. Varolan sınıf dosyalarını silin.

Karakteri tanımlama

Arabirimini çalıştırarak IGlyphFactory bir karakter tanımlayın.

Karakteri tanımlamak için

  1. Bir sınıf dosyası ekleyin ve adını verin TodoGlyphFactory.

  2. Bildirimleri kullanarak aşağıdaki kodu ekleyin.

    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. uygulayan IGlyphFactoryadlı TodoGlyphFactory bir sınıf ekleyin.

    internal class TodoGlyphFactory : IGlyphFactory
    
  4. Karakterin boyutlarını tanımlayan özel bir alan ekleyin.

    const double m_glyphSize = 16.0;
    
  5. Glif kullanıcı arabirimi (UI) öğesini tanımlayarak uygulayın GenerateGlyph . TodoTag daha sonra bu kılavuzda tanımlanır.

    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. uygulayan IGlyphFactoryProvideradlı TodoGlyphFactoryProvider bir sınıf ekleyin. Bu sınıfı "TodoGlyph", OrderAttribute After VsTextMarker, "ContentTypeAttributecode" ve TagTypeAttribute todoTag ile NameAttribute dışarı aktarın.

    [Export(typeof(IGlyphFactoryProvider))]
    [Name("TodoGlyph")]
    [Order(After = "VsTextMarker")]
    [ContentType("code")]
    [TagType(typeof(TodoTag))]
    internal sealed class TodoGlyphFactoryProvider : IGlyphFactoryProvider
    
  7. örneğini GetGlyphFactory ekleyerek TodoGlyphFactoryyöntemini uygulayın.

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

Todo etiketi ve etiket tanımlama

Önceki adımlarda tanımladığınız UI öğesi ile gösterge kenar boşluğu arasındaki ilişkiyi tanımlayın. Etiket türü oluşturun, etiketleyin ve bir etiketleme sağlayıcısı kullanarak dışarı aktarın.

Todo etiketi ve etiket tanımlamak için

  1. Projeye yeni bir sınıf dosyası ekleyin ve olarak adlandırın TodoTagger.

  2. Aşağıdaki içeri aktarmaları ekleyin.

    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. adlı TodoTagbir sınıf ekleyin.

    internal class TodoTag : IGlyphTag
    
  4. türünde TodoTaguygulayan ITagger<T> adlı TodoTagger sınıfını değiştirin.

    internal class TodoTagger : ITagger<TodoTag>
    
  5. sınıfına TodoTagger , sınıflandırma aralıklarında bulunacak metin için ve IClassifier için özel alanlar ekleyin.

    private IClassifier m_classifier;
    private const string m_searchText = "todo";
    
  6. Sınıflandırıcıyı ayarlayan bir oluşturucu ekleyin.

    internal TodoTagger(IClassifier classifier)
    {
        m_classifier = classifier;
    }
    
  7. GetTags Adları "açıklama" sözcüğünü içeren ve metni arama metnini içeren tüm sınıflandırma aralıklarını bularak yöntemini uygulayın. Arama metni her bulunduğunda, türünde yeni TagSpan<T> bir verim TodoTagelde edin.

    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. Bir TagsChanged olay bildirin.

    public event EventHandler<SnapshotSpanEventArgs> TagsChanged;
    
  9. uygulayan ITaggerProvideradlı TodoTaggerProvider bir sınıf ekleyin ve bunu "code" ve TagTypeAttribute todoTag ile ContentTypeAttribute dışarı aktarın.

    [Export(typeof(ITaggerProvider))]
    [ContentType("code")]
    [TagType(typeof(TodoTag))]
    class TodoTaggerProvider : ITaggerProvider
    
  10. öğesini içeri aktarın IClassifierAggregatorService.

    [Import]
    internal IClassifierAggregatorService AggregatorService;
    
  11. örneğini CreateTagger ekleyerek TodoTaggeryöntemini uygulayın.

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

Kodu derleme ve test etme

Bu kodu test etmek için TodoGlyphTest çözümünü derleyin ve deneysel örnekte çalıştırın.

TodoGlyphTest çözümünü derlemek ve test etmek için

  1. Çözümü oluşturun.

  2. F5 tuşuna basarak projeyi çalıştırın. Visual Studio'nun ikinci bir örneği başlar.

  3. Gösterge kenar boşluğunun gösterildiğinden emin olun. (Araçlar menüsünde Seçenekler'e tıklayın. Metin Düzenleyicisi sayfasında Gösterge kenar boşluğunun seçili olduğundan emin olun.)

  4. Açıklamaları olan bir kod dosyası açın. Açıklama bölümlerinden birine "todo" sözcüğünü ekleyin.

  5. Kod penceresinin solundaki gösterge kenar boşluğunda koyu mavi ana hatlı açık mavi bir daire görüntülenir.