質問

私たちはC#コードを関数に分割し、これらの関数を ielisonbuffers 。私はIntelliSenseのフックアップを持っていて、バッファーは下記のようにファインされている他の拡張機能と対話します:

Enter Image説明

しかし、これらのエディタ内での構文の強調表示を取得することはできません。

次の手順でこれらのエディタを埋め込みます。

  1. ファイルにIVsInvisibleEditorを作成します。
  2. このIVsTextLines
  3. IVsInvisibleEditorを取得します。
  4. IVsCodeWindowを作成し、このIVsCodeWindowのバッファをIVsTextLines
  5. からIVsInvisibleEditorに設定します。
  6. このコードウィンドウからIWpfTextViewHostを取得します。これは私が伝統的なスパンと対話することができる「WPFの土地」に戻ります。
  7. IWpfTextViewHostのテキストビューのスナップショットパンを作成します。このスナップショットパンには単一の機能が含まれています。
  8. スナップショットパンを含むIElisionBufferを作成します。
  9. IVsTextBufferを介してIVsEditorAdaptersFactoryService.CreateVsTextBufferAdapterForSecondaryBuffer()を介してIElisionBufferを作成します。
  10. 今度はIVsTextBufferをC#GUIDに渡し、C#GUIDを渡します.694DD9B6-B865-4C5B-AD85-86356E9C88DC。
  11. 私はそれがIVsTextLinesを介して正しく設定されていて、すべてが大丈夫に見えることを再確認してください。
  12. SetLanguageServiceID()を作成し、新しいGetLanguageServiceID()を使用して初期化します。
  13. 私はこのIVsTextViewIVsTextBufferを取得します。
  14. 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