Пошаговое руководство. Создание глифа поля
Внешний вид полей редактора можно настроить с помощью настраиваемых расширений редактора. В этом пошаговом руководстве поместите пользовательский глиф на поле индикатора всякий раз, когда слово "todo" отображается в комментарии кода.
Создание проекта MEF
Создайте проект VSIX на C#. (В Диалоговое окно "Новый проект" , выберите Visual C# / Расширяемость, а затем ПРОЕКТ VSIX.) Назовите решение
TodoGlyphTest
.Добавьте элемент проекта классификатора редактора. Дополнительные сведения: Создание расширения с помощью шаблона элемента редактора.
Удалите файлы существующих классов.
Определение глифа
Определите глиф, запустив IGlyphFactory интерфейс.
Определение глифа
Добавьте файл класса с именем
TodoGlyphFactory
.Добавьте следующий код с помощью объявлений.
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;
Добавьте класс с именем
TodoGlyphFactory
, который реализует IGlyphFactory.Добавьте частное поле, определяющее размеры глифа.
Реализуйте,
GenerateGlyph
определив элемент пользовательского интерфейса глифа.TodoTag
определяется далее в этом пошаговом руководстве.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; }
Добавьте класс с именем
TodoGlyphFactoryProvider
, который реализует IGlyphFactoryProvider. Экспортируйте этот класс с NameAttribute помощью todoGlyph, объекта After VsTextMarker, OrderAttribute ContentTypeAttribute кода и TagTypeAttribute todoTag.GetGlyphFactory Реализуйте метод путем создания экземпляра
TodoGlyphFactory
.
Определение тега и тега Todo
Определите связь между элементом пользовательского интерфейса, определенным на предыдущих шагах, и полем индикатора. Создайте тип тега и тег и экспортируйте его с помощью поставщика тегов.
Определение тега и тега todo
Добавьте новый файл класса в проект и назовите его
TodoTagger
.Добавьте приведенные ниже импортированные данные.
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;
Добавьте класс с именем
TodoTag
.Измените класс с именем
TodoTagger
, реализующий ITagger<T> типTodoTag
.В класс добавьте частные
TodoTagger
поля для текста, IClassifier который будет находиться в диапазонах классификации.Добавьте конструктор, который задает классификатор.
GetTags Реализуйте метод, найдя все диапазоны классификации, имена которых включают слово "комментарий" и текст которого содержит текст поиска. При обнаружении текста поиска возвращает новый TagSpan<T> тип
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()); } } } } }
Объявите
TagsChanged
событие.Добавьте класс с именем
TodoTaggerProvider
, реализующий ITaggerProviderи экспортируйте его с ContentTypeAttribute помощью кода и TagTypeAttribute объекта TodoTag.Импортируйте IClassifierAggregatorService.
CreateTagger Реализуйте метод путем создания экземпляра
TodoTagger
.
Сборка и проверка кода
Чтобы протестировать этот код, создайте решение TodoGlyphTest и запустите его в экспериментальном экземпляре.
Создание и тестирование решения TodoGlyphTest
Постройте решение.
Запустите проект, нажав клавишу F5. Запускается второй экземпляр Visual Studio.
Убедитесь, что отображается поле индикатора. (В Меню "Сервис" выберите пункт "Параметры". На странице текстового редактора убедитесь, что выбрано поле индикатора.)
Откройте файл кода с комментариями. Добавьте слово "todo" в один из разделов комментариев.
Светло-синий круг с темно-синей контуром отображается в поле индикатора слева от окна кода.