다음을 통해 공유


연습: 텍스트 보기 사용자 지정

편집기 형식 맵에서 다음 속성을 수정하여 텍스트 보기를 사용자 지정할 수 있습니다.

  • 표시기 여백

  • 삽입 캐럿

  • 덮어쓰기 캐럿

  • 선택한 텍스트

  • 선택한 비활성 텍스트(즉, 포커스가 손실된 선택한 텍스트)

  • 표시 가능한 공백

MEF 프로젝트 만들기

  1. C# VSIX 프로젝트를 만듭니다. (새 프로젝트 대화 상자에서 Visual C#/확장성, VSIX 프로젝트를 차례로 선택합니다.) 솔루션 이름을 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. IWpfTextViewCreationListener에서 상속되는 TestViewCreationListener라는 클래스를 선언합니다. 다음 특성을 사용하여 이 클래스를 내보냅니다.

    • 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. 표시 가능한 공백을 켭니다. (편집 메뉴에서 고급을 가리킨 다음, 공백 보기를 클릭합니다). 텍스트에 일부 탭을 입력합니다. 탭을 나타내는 빨간색 화살표가 표시되어야 합니다.