문제

저는 C# 코드를 함수로 분할하고 이러한 함수를 저장하는 프로젝트를 진행 중입니다. IElisonBuffers.Intellisense가 연결되어 있고 버퍼는 아래와 같이 다른 확장 프로그램과 잘 상호 작용합니다.

enter image description here

그러나 이러한 편집기에서는 구문 강조가 작동하지 않습니다.

다음 단계를 통해 이러한 편집기를 포함합니다.

  1. 만들기 IVsInvisibleEditor 파일을 위해.
  2. 받기 IVsTextLines 이를 위해 IVsInvisibleEditor
  3. 만들기 IVsCodeWindow 이에 대한 버퍼를 설정합니다. IVsCodeWindowIVsTextLines ~로부터 IVsInvisibleEditor
  4. 받기 IWpfTextViewHost 이 코드 창에서.그러면 전통적인 범위와 상호 작용할 수 있는 "WPF Land"가 다시 표시됩니다.
  5. SnapshotSpan을 생성합니다. IWpfTextViewHost님의 텍스트 보기입니다.이 SnapshotSpan에는 단일 함수가 포함되어 있습니다.
  6. 만들기 IElisionBuffer SnapshotSpan을 포함합니다.
  7. 만들기 IVsTextBuffer ~을 통해 IVsEditorAdaptersFactoryService.CreateVsTextBufferAdapterForSecondaryBuffer() 통과하다 IElisionBuffer.
  8. 이제 나는 IVsTextBuffer 에게 IVsTextLines 그리고 전화해 SetLanguageServiceID() C# GUID를 전달합니다.694DD9B6-B865-4C5B-AD85-86356E9C88DC.
  9. 다음을 통해 올바르게 설정되었는지 다시 확인합니다. GetLanguageServiceID() 모든 것이 괜찮아 보입니다.
  10. 나는 IVsTextView 새로운 것으로 초기화하십시오. IVsTextBuffer.
  11. 그런 다음 나는 IWpfTextViewHost 이를 위해 IVsTextView.

IElisionBuffer에 대한 언어 서비스 ID를 설정할 때 주의해야 할 특별한 단계가 있습니까?

완벽함을 위해 제가 사용하는 코드는 다음과 같습니다.

public CustomEditorViewModel CreateEditor(string filePath, int start, int end) {

IVsInvisibleEditor invisibleEditor;
ErrorHandler.ThrowOnFailure(this._InvisibleEditorManager.RegisterInvisibleEditor(
    filePath
    , pProject: null
    , dwFlags: (uint)_EDITORREGFLAGS.RIEF_ENABLECACHING
    , pFactory: null
    , ppEditor: out invisibleEditor));

var docDataPointer = IntPtr.Zero;
Guid guidIVsTextLines = typeof(IVsTextLines).GUID;

ErrorHandler.ThrowOnFailure(
  invisibleEditor.GetDocData(
  fEnsureWritable: 1
  , riid: ref guidIVsTextLines
  , ppDocData: out docDataPointer));

IVsTextLines docData = (IVsTextLines)Marshal.GetObjectForIUnknown(docDataPointer);

//Createa a code window adapter
var codeWindow = _EditorAdapterFactory.CreateVsCodeWindowAdapter(VisualStudioServices.OLEServiceProvider);

//Associate our IVsTextLines with our new code window
ErrorHandler.ThrowOnFailure(codeWindow.SetBuffer(docData));

//Get our text view for our editor which we will use to get the WPF control that hosts that editor.
IVsTextView textView;
ErrorHandler.ThrowOnFailure(codeWindow.GetPrimaryView(out textView));

//This is our TextViewHost
//It transports us back into the land of WPF 
IWpfTextViewHost textViewHost = _EditorAdapterFactory.GetWpfTextViewHost(textView);

  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  //Now we need to subset TextBuffer somehow... 
  //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int length = end - start;
SnapshotSpan subsetSnapshot = new SnapshotSpan(textViewHost.TextView.TextSnapshot, start, length);

var CSharpType = _contentTypeRegistry.GetContentType("CSharp");

var projBuffer = _ProjectionBufferFactory.CreateElisionBuffer(
  null
  , new NormalizedSnapshotSpanCollection(subsetSnapshot)
  , ElisionBufferOptions.None
  ,CSharpType);

IVsTextBuffer bufferAdapter = _EditorAdapterFactory.CreateVsTextBufferAdapterForSecondaryBuffer(VisualStudioServices.OLEServiceProvider, projBuffer);

//My attempt at getting syntax coloring to work:
Guid CSharpLanguageServiceId = new Guid("694DD9B6-B865-4C5B-AD85-86356E9C88DC");
IVsTextLines buffer = (IVsTextLines)bufferAdapter;
buffer.SetLanguageServiceID(ref CSharpLanguageServiceId);


IVsTextView projTextView = _EditorAdapterFactory.CreateVsTextViewAdapter(VisualStudioServices.OLEServiceProvider);

projTextView.Initialize(
            (IVsTextLines)bufferAdapter
            , IntPtr.Zero
            , (uint)TextViewInitFlags.VIF_HSCROLL | (uint)TextViewInitFlags.VIF_VSCROLL | (uint)TextViewInitFlags3.VIF_NO_HWND_SUPPORT,
                    new[] { new INITVIEW { fSelectionMargin = 0, fWidgetMargin = 0, fVirtualSpace = 0, fDragDropMove = 0 } }
                );


 return _EditorAdapterFactory.GetWpfTextViewHost(projTextView);
}
도움이 되었습니까?

해결책

제거 버퍼의 콘텐츠 유형을 콘텐츠 유형 "투영"으로 만들거나 파생시키세요.이것이 태그 작성자가 이를 통해 투영해야 하는 힌트입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top