Przewodnik: tworzenie glyph marginesu
Wygląd marginesów edytora można dostosować przy użyciu niestandardowych rozszerzeń edytora. Ten przewodnik umieszcza niestandardowy glyph na marginesie wskaźnika za każdym razem, gdy słowo "todo" pojawia się w komentarzu kodu.
Tworzenie projektu MEF
Utwórz projekt VSIX w języku C#. (W Okno dialogowe Nowy projekt , wybierz pozycję Visual C# / Rozszerzalność, a następnie projekt VSIX. Nadaj rozwiązaniu
TodoGlyphTest
nazwę .Dodaj element projektu Klasyfikator edytora. Aby uzyskać więcej informacji, zobacz Tworzenie rozszerzenia za pomocą szablonu elementu edytora.
Usuń istniejące pliki klas.
Definiowanie glifów
Zdefiniuj glif, uruchamiając IGlyphFactory interfejs.
Aby zdefiniować glif
Dodaj plik klasy i nadaj mu
TodoGlyphFactory
nazwę .Dodaj następujący kod przy użyciu deklaracji.
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;
Dodaj klasę o nazwie
TodoGlyphFactory
, która implementuje IGlyphFactoryelement .Dodaj pole prywatne, które definiuje wymiary glif.
Zaimplementuj
GenerateGlyph
, definiując element interfejsu użytkownika (UI).TodoTag
program jest zdefiniowany w dalszej części tego przewodnika.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; }
Dodaj klasę o nazwie
TodoGlyphFactoryProvider
, która implementuje IGlyphFactoryProviderelement . Wyeksportuj tę klasę z wartością NameAttribute "TodoGlyph", wartością OrderAttribute After VsTextMarker, znakiem "code" i elementem ContentTypeAttribute TagTypeAttribute TodoTag.Zaimplementuj metodę GetGlyphFactory , tworząc
TodoGlyphFactory
wystąpienie klasy .
Definiowanie tagu zadań do wykonania i sztyletu
Zdefiniuj relację między elementem interfejsu użytkownika zdefiniowanym w poprzednich krokach i marginesem wskaźnika. Utwórz typ tagu i element tagger i wyeksportuj go przy użyciu dostawcy tagger.
Aby zdefiniować tag zadań do wykonania i sztylet
Dodaj nowy plik klasy do projektu i nadaj mu
TodoTagger
nazwę .Dodaj następujące 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;
Dodaj klasę o nazwie
TodoTag
.Zmodyfikuj klasę o nazwie
TodoTagger
, która implementuje ITagger<T> typTodoTag
.TodoTagger
W klasie dodaj pola prywatne dla elementu IClassifier i dla tekstu, aby znaleźć je w zakresach klasyfikacji.Dodaj konstruktor, który ustawia klasyfikator.
Zaimplementuj metodę GetTags , wyszukując wszystkie zakresy klasyfikacji, których nazwy zawierają wyraz "komentarz" i którego tekst zawiera tekst wyszukiwania. Za każdym razem, gdy tekst wyszukiwania zostanie znaleziony, wróć do nowego TagSpan<T> typu
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()); } } } } }
Zadeklaruj
TagsChanged
zdarzenie.Dodaj klasę o nazwie
TodoTaggerProvider
, która implementuje ITaggerProviderelement , i wyeksportuj go za pomocą ContentTypeAttribute elementu "code" i elementu TagTypeAttribute TodoTag.Zaimportuj plik IClassifierAggregatorService.
Zaimplementuj metodę CreateTagger , tworząc
TodoTagger
wystąpienie klasy .
Kompilowanie i testowanie kodu
Aby przetestować ten kod, skompiluj rozwiązanie TodoGlyphTest i uruchom je w wystąpieniu eksperymentalnym.
Aby skompilować i przetestować rozwiązanie TodoGlyphTest
Stwórz rozwiązanie.
Uruchom projekt, naciskając klawisz F5. Zostanie uruchomione drugie wystąpienie programu Visual Studio.
Upewnij się, że margines wskaźnika jest wyświetlany. (Na stronie Menu Narzędzia , kliknij pozycję Opcje. Na stronie Edytor tekstów upewnij się, że wybrano margines wskaźnika).
Otwórz plik kodu zawierający komentarze. Dodaj słowo "todo" do jednej z sekcji komentarzy.
Jasnoniebieski okrąg z ciemnoniebieskim konturem pojawia się na marginesie wskaźnika po lewej stronie okna kodu.