2

私は、C# コードを関数に分割し、これらの関数をIElisonBuffers内に格納するプロジェクトに取り組んでいます。私は Intellisense を接続しており、以下に示すように、バッファーは他の拡張機能とうまくやり取りしています。

ここに画像の説明を入力

ただし、これらのエディター内で構文の強調表示を機能させることができません。

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

  1. ファイルの を作成IVsInvisibleEditorします。
  2. IVsTextLinesこのために を入手IVsInvisibleEditor
  3. を作成し、IVsCodeWindowこれのバッファを から に設定しIVsCodeWindowますIVsTextLinesIVsInvisibleEditor
  4. IWpfTextViewHostこのコード ウィンドウから を取得します。これにより、従来のスパンと対話できる「WPF Land」に戻ります。
  5. IWpfTextViewHostのテキスト ビューのSnapshotSpan を作成します。この SnapshotSpan には、単一の関数が含まれています。
  6. IElisionBufferSnapshotSpan を含む を作成します。
  7. に渡すIVsTextBufferビアを作成します。IVsEditorAdaptersFactoryService.CreateVsTextBufferAdapterForSecondaryBuffer()IElisionBuffer
  8. 次に、C# GUID: 694DD9B6-B865-4C5B-AD85-86356E9C88DC でtoをキャストしIVsTextBufferIVsTextLines呼び出しを渡します。SetLanguageServiceID()
  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);
}
4

1 に答える 1

3

省略バッファのコンテンツ タイプをコンテンツ タイプ「プロジェクション」にするか、コンテンツ タイプから派生させます。これは、タガーがそれを通して投影すべきヒントです。

于 2014-02-28T02:45:08.200 に答える