Tutorial: Creación de un glifo de margen
Puede personalizar la apariencia de los márgenes del editor mediante extensiones de editor personalizadas. En este tutorial se coloca un glifo personalizado en el margen del indicador cada vez que la palabra "todo" aparece en un comentario de código.
Creación de un proyecto MEF
Cree un proyecto VSIX de C#. (En Cuadro de diálogo Nuevo proyecto , seleccione Visual C# / Extensibilidad y, después , Proyecto VSIX). Asigne un nombre a la solución
TodoGlyphTest
.Agregue un elemento de proyecto Clasificador del editor. Para obtener más información, vea Creación de una extensión con una plantilla de elemento de editor.
Elimine los archivos de clase existentes.
Definir el glifo
Defina un glifo ejecutando la IGlyphFactory interfaz .
Para definir el glifo
Agregue un archivo de clase y asígnele el nombre
TodoGlyphFactory
.Agregue el código siguiente mediante declaraciones.
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;
Agregue una clase denominada
TodoGlyphFactory
que implemente IGlyphFactory.Agregue un campo privado que defina las dimensiones del glifo.
Implemente
GenerateGlyph
definiendo el elemento de interfaz de usuario (UI) glifo.TodoTag
se define más adelante en este tutorial.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; }
Agregue una clase denominada
TodoGlyphFactoryProvider
que implemente IGlyphFactoryProvider. Exporte esta clase con un NameAttribute de "TodoGlyph", un OrderAttribute de After VsTextMarker, un ContentTypeAttribute de "code" y un TagTypeAttribute de TodoTag.Implemente el método mediante la GetGlyphFactory creación de instancias de
TodoGlyphFactory
.
Definición de una etiqueta y un tagger de tareas pendientes
Defina la relación entre el elemento de interfaz de usuario que definió en los pasos anteriores y el margen del indicador. Cree un tipo de etiqueta y un tagger y expórtelo mediante un proveedor de etiquetas.
Para definir una etiqueta de tareas pendientes y un tagger
Agregue un nuevo archivo de clase al proyecto y asígnele
TodoTagger
el nombre .Agregue las importaciones siguientes.
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;
Agregue una clase denominada
TodoTag
.Modifique la clase denominada
TodoTagger
que implementa ITagger<T> de tipoTodoTag
.En la
TodoTagger
clase , agregue campos privados para y IClassifier para que el texto se busque en los intervalos de clasificación.Agregue un constructor que establezca el clasificador.
Implemente el GetTags método buscando todos los intervalos de clasificación cuyos nombres incluyen la palabra "comentario" y cuyo texto incluye el texto de búsqueda. Siempre que se encuentre el texto de búsqueda, devuelva un nuevo TagSpan<T> tipo
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()); } } } } }
Declare un
TagsChanged
evento.Agregue una clase denominada
TodoTaggerProvider
que implemente ITaggerProvidery expórtela con un ContentTypeAttribute de "código" y un TagTypeAttribute de TodoTag.Importe el IClassifierAggregatorService.
Implemente el método mediante la CreateTagger creación de instancias de
TodoTagger
.
Compilación y prueba del código
Para probar este código, compile la solución TodoGlyphTest y ejecútelo en la instancia experimental.
Para compilar y probar la solución TodoGlyphTest
Compile la solución.
Ejecute el proyecto presionando F5. Se inicia una segunda instancia de Visual Studio.
Asegúrese de que se muestra el margen del indicador. (En el Menú Herramientas , haga clic en Opciones. En la página Editor de texto, asegúrese de que el margen indicador está seleccionado).
Abra un archivo de código que tenga comentarios. Agregue la palabra "todo" a una de las secciones de comentarios.
Un círculo azul claro con un contorno azul oscuro aparece en el margen del indicador a la izquierda de la ventana de código.