演练:自定义文本视图

可以通过修改其编辑器格式映射中的任何属性来自定义文本视图:

  • 指示器边距

  • 插入插入符号

  • 覆盖插入符号

  • 所选文本

  • 非活动选定文本(即失去焦点的选定文本)

  • 可见空格

创建 MEF 项目

  1. 创建 C# VSIX 项目。 (在 “新建项目 ”对话框,选择 Visual C# /扩展性,然后选择 VSIX Project。)将解决方案 ViewPropertyTest命名为 。

  2. 向项目添加编辑器分类器项模板。 有关详细信息,请参阅使用编辑器项模板创建扩展

  3. 删除现有的类文件。

定义内容类型

  1. 添加一个类文件并将其命名为 ViewPropertyModifier

  2. 然后,添加以下 using 指令:

    using System;
    using System.Collections;
    using System.Windows;
    using System.Windows.Media;
    using System.ComponentModel.Composition;
    using Microsoft.VisualStudio.Text.Classification;
    using Microsoft.VisualStudio.Text.Editor;
    using Microsoft.VisualStudio.Utilities;
    
  3. 声明一个从 . 继承的IWpfTextViewCreationListenerTestViewCreationListener。 使用以下属性导出此类:

    • ContentTypeAttribute 如果指定此侦听器应用到的内容类型,则为 。

    • TextViewRoleAttribute 指定此侦听器的角色。

      [Export(typeof(IWpfTextViewCreationListener))]
      [ContentType("text")]
      [TextViewRole(PredefinedTextViewRoles.Document)]
      internal class TestViewCreationListener : IWpfTextViewCreationListener
      

  4. 在此类中,导入 .IEditorFormatMapService

    [Import]
    internal IEditorFormatMapService FormatMapService = null;
    

更改视图属性

  1. 设置 TextViewCreated 方法,以便在打开视图时更改视图属性。 若要进行更改,请首先找到 ResourceDictionary 与要查找的视图方面对应的内容。 然后,更改资源字典中的相应属性并设置属性。 通过在BeginBatchUpdate设置属性之前调用方法,然后在EndBatchUpdate设置属性之后,对方法的调用SetProperties进行批处理。

    public void TextViewCreated(IWpfTextView textView)
    {
        IEditorFormatMap formatMap = FormatMapService.GetEditorFormatMap(textView);
    
        ResourceDictionary regularCaretProperties = formatMap.GetProperties("Caret");
        ResourceDictionary overwriteCaretProperties = formatMap.GetProperties("Overwrite Caret");
        ResourceDictionary indicatorMargin = formatMap.GetProperties("Indicator Margin");
        ResourceDictionary visibleWhitespace = formatMap.GetProperties("Visible Whitespace");
        ResourceDictionary selectedText = formatMap.GetProperties("Selected Text");
        ResourceDictionary inactiveSelectedText = formatMap.GetProperties("Inactive Selected Text");
    
        formatMap.BeginBatchUpdate();
    
        regularCaretProperties[EditorFormatDefinition.ForegroundBrushId] = Brushes.Magenta;
        formatMap.SetProperties("Caret", regularCaretProperties);
    
        overwriteCaretProperties[EditorFormatDefinition.ForegroundBrushId] = Brushes.Turquoise;
        formatMap.SetProperties("Overwrite Caret", overwriteCaretProperties);
    
        indicatorMargin[EditorFormatDefinition.BackgroundColorId] = Colors.LightGreen;
        formatMap.SetProperties("Indicator Margin", indicatorMargin);
    
        visibleWhitespace[EditorFormatDefinition.ForegroundColorId] = Colors.Red;
        formatMap.SetProperties("Visible Whitespace", visibleWhitespace);
    
        selectedText[EditorFormatDefinition.BackgroundBrushId] = Brushes.LightPink;
        formatMap.SetProperties("Selected Text", selectedText);
    
        inactiveSelectedText[EditorFormatDefinition.BackgroundBrushId] = Brushes.DeepPink;
        formatMap.SetProperties("Inactive Selected Text", inactiveSelectedText);
    
        formatMap.EndBatchUpdate();
    }
    

生成并测试代码

  1. 生成解决方案。

    在调试器中运行此项目时,将启动 Visual Studio 的第二个实例。

  2. 创建一个文本文件并键入一些文本。

    • 插入插入插入点应为洋红色,覆盖插入点应为绿松石。

    • 指示器边距(文本视图左侧)应为浅绿色。

  3. 选择键入的文本。 所选文本的颜色应为浅粉色。

  4. 选择文本时,单击文本窗口外的任意位置。 所选文本的颜色应为深粉红色。

  5. 打开可见的空格。 (On the “编辑 ”菜单,指向 “高级 ”,然后单击“ 查看空格”。 在文本中键入一些选项卡。 应显示表示选项卡的红色箭头。