Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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 el cuadro de diálogo Nuevo proyecto , seleccione Visual C# / Extensibilidad y, a continuación, 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 Crear 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
TodoGlyphFactoryel nombre .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
TodoGlyphFactoryque implemente IGlyphFactory.Agregue un campo privado que defina las dimensiones del glifo.
Implemente
GenerateGlyphdefiniendo el elemento de interfaz de usuario que representa el glifo.TodoTagse 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
TodoGlyphFactoryProviderque 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 al instanciar
TodoGlyphFactory.
Definir una etiqueta Todo 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 etiquetador
Agregue un nuevo archivo de clase al proyecto y asígnele
TodoTaggerel nombre .Agregue las siguientes importaciones.
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
TodoTaggerque implementa ITagger<T> de tipoTodoTag.En la clase
TodoTagger, agregue campos privados para un IClassifier y para el texto a buscar en las extensiones 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, retorne un nuevo TagSpan<T> del 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()); } } } } }Declarar un
TagsChangedevento.Agregue una clase denominada
TodoTaggerProviderque implemente ITaggerProvidery expórtela con un ContentTypeAttribute de "código" y un TagTypeAttribute de TodoTag.Importe el IClassifierAggregatorService.
Implemente el método instanciando
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 panel Opciones>de herramientas, en la sección De toda la configuración>Editor de texto>General>Visualización, confirme que la casilla Mostrar margen del indicador está activada.
En el cuadro de diálogo Opciones de herramientas>, en la secciónPresentacióngeneral> del Editor> de texto, confirme que la casilla Margen de indicador está activada.
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.