Frage

Ich arbeite an einem Projekt, bei dem wir C#-Code in Funktionen aufgeteilt und diese Funktionen darin gespeichert haben IElisonBuffers.Ich habe Intellisense angeschlossen und die Puffer interagieren problemlos mit anderen Erweiterungen, wie unten gezeigt:

enter image description here

Allerdings kann ich die Syntaxhervorhebung in diesen Editoren nicht zum Laufen bringen.

Ich bette diese Editoren über die folgenden Schritte ein:

  1. Erstelle ein IVsInvisibleEditor für die Datei.
  2. Bekommen das IVsTextLines dafür IVsInvisibleEditor
  3. Erstelle ein IVsCodeWindow und stellen Sie den Puffer dafür ein IVsCodeWindow zu sein IVsTextLines von dem IVsInvisibleEditor
  4. Holen Sie sich eine IWpfTextViewHost aus diesem Codefenster.Dies bringt mich zurück zu „WPF Land“, wo ich mit traditionellen Spans interagieren kann.
  5. Erstellen Sie einen SnapshotSpan von IWpfTextViewHostTextansicht.Dieser SnapshotSpan enthält eine einzelne Funktion.
  6. Erstelle ein IElisionBuffer enthält den SnapshotSpan.
  7. Erstelle ein IVsTextBuffer über IVsEditorAdaptersFactoryService.CreateVsTextBufferAdapterForSecondaryBuffer() vorbei in der IElisionBuffer.
  8. Jetzt habe ich das gegossen IVsTextBuffer Zu IVsTextLines und Ruf an SetLanguageServiceID() Übergabe der C#-GUID:694DD9B6-B865-4C5B-AD85-86356E9C88DC.
  9. Ich überprüfe noch einmal, ob es richtig eingestellt wurde GetLanguageServiceID() und alles sieht gut aus.
  10. Ich erstelle eine IVsTextView und initialisieren Sie es mit dem neuen IVsTextBuffer.
  11. Ich bekomme dann das IWpfTextViewHost dafür IVsTextView.

Müssen beim Einrichten der Sprachdienst-ID für einen IElisionBuffer besondere Schritte beachtet werden?

Der Vollständigkeit halber ist dies der Code, den ich verwende:

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);
}
War es hilfreich?

Lösung

Machen Sie den Inhaltstyp Ihres Elisionspuffers zum Inhaltstyp „Projektion“ oder leiten Sie ihn davon ab.Das ist der Hinweis, den Tagger durch das hindurch projizieren sollten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top