Bagikan melalui


Panduan: Membuat glyph margin

Anda dapat menyesuaikan tampilan margin editor dengan menggunakan ekstensi editor kustom. Panduan ini menempatkan glyph kustom pada margin indikator setiap kali kata "todo" muncul dalam komentar kode.

Membuat proyek MEF

  1. Buat proyek C# VSIX. (Dalam Dialog Proyek Baru, pilih Visual C# / Ekstensibilitas, lalu Proyek VSIX.) Beri nama solusi TodoGlyphTest.

  2. Tambahkan item proyek Pengklasifikasi Editor. Untuk informasi selengkapnya, lihat Membuat ekstensi dengan templat item editor.

  3. Hapus file kelas yang ada.

Tentukan glyph

Tentukan glyph dengan menjalankan IGlyphFactory antarmuka.

Untuk menentukan glyph

  1. Tambahkan file kelas dan beri nama TodoGlyphFactory.

  2. Tambahkan kode berikut dengan menggunakan deklarasi.

    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. Tambahkan kelas bernama TodoGlyphFactory yang mengimplementasikan IGlyphFactory.

    internal class TodoGlyphFactory : IGlyphFactory
    
  4. Tambahkan bidang privat yang menentukan dimensi glyph.

    const double m_glyphSize = 16.0;
    
  5. Terapkan GenerateGlyph dengan menentukan elemen antarmuka pengguna (UI) glyph. TodoTag didefinisikan nanti dalam panduan ini.

    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. Tambahkan kelas bernama TodoGlyphFactoryProvider yang mengimplementasikan IGlyphFactoryProvider. Ekspor kelas ini dengan NameAttribute "TodoGlyph", OrderAttribute dari After VsTextMarker, ContentTypeAttribute dari "code", dan TagTypeAttribute todoTag.

    [Export(typeof(IGlyphFactoryProvider))]
    [Name("TodoGlyph")]
    [Order(After = "VsTextMarker")]
    [ContentType("code")]
    [TagType(typeof(TodoTag))]
    internal sealed class TodoGlyphFactoryProvider : IGlyphFactoryProvider
    
  7. Terapkan GetGlyphFactory metode dengan membuat instans TodoGlyphFactory.

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

Menentukan tag dan tagger Todo

Tentukan hubungan antara elemen UI yang Anda tentukan di langkah sebelumnya dan margin indikator. Buat jenis tag dan tagger dan ekspor dengan menggunakan penyedia tagger.

Untuk menentukan tag dan tagger todo

  1. Tambahkan file kelas baru ke proyek dan beri nama TodoTagger.

  2. Tambahkan impor berikut.

    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. Tambahkan kelas bernama TodoTag.

    internal class TodoTag : IGlyphTag
    
  4. Ubah kelas bernama TodoTagger yang mengimplementasikan ITagger<T> jenis TodoTag.

    internal class TodoTagger : ITagger<TodoTag>
    
  5. TodoTagger Ke kelas , tambahkan bidang privat untuk dan IClassifier agar teks dapat ditemukan dalam rentang klasifikasi.

    private IClassifier m_classifier;
    private const string m_searchText = "todo";
    
  6. Tambahkan konstruktor yang mengatur pengklasifikasi.

    internal TodoTagger(IClassifier classifier)
    {
        m_classifier = classifier;
    }
    
  7. Terapkan GetTags metode dengan menemukan semua rentang klasifikasi yang namanya menyertakan kata "komentar" dan yang teksnya menyertakan teks pencarian. Setiap kali teks pencarian ditemukan, hasilkan kembali jenis TodoTagbaru TagSpan<T> .

    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. Mendeklarasikan TagsChanged peristiwa.

    public event EventHandler<SnapshotSpanEventArgs> TagsChanged;
    
  9. Tambahkan kelas bernama TodoTaggerProvider yang mengimplementasikan ITaggerProvider, dan ekspor dengan ContentTypeAttribute "kode" dan TagTypeAttribute todoTag.

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

    [Import]
    internal IClassifierAggregatorService AggregatorService;
    
  11. Terapkan CreateTagger metode dengan membuat instans 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>;
    }
    

Membangun dan menguji kode

Untuk menguji kode ini, buat solusi TodoGlyphTest dan jalankan dalam instans eksperimental.

Untuk membangun dan menguji solusi TodoGlyphTest

  1. Bangun solusinya.

  2. Jalankan proyek dengan menekan F5. Instans kedua Visual Studio dimulai.

  3. Pastikan margin indikator ditampilkan. (Pada Menu Alat, klik Opsi. Pada halaman Editor Teks, pastikan margin Indikator dipilih.)

  4. Buka file kode yang memiliki komentar. Tambahkan kata "todo" ke salah satu bagian komentar.

  5. Lingkaran biru muda dengan kerangka biru tua muncul di margin indikator di sebelah kiri jendela kode.