Pregunta

Estoy trabajando en un proyecto en el que hemos dividido código de C# en funciones y se almacenan estas funciones dentro de IElisonBuffers.Tengo Intellisense conectado, y los búferes de interactuar con otras extensiones finas como se muestra a continuación:

enter image description here

Sin embargo, no puedo conseguir el resaltado de sintaxis para trabajar dentro de estos editores.

Puedo incluir a estos editores a través de los siguientes pasos:

  1. Crear un IVsInvisibleEditor para el archivo.
  2. Obtener la IVsTextLines para este IVsInvisibleEditor
  3. Crear un IVsCodeWindow y establecer el búfer para este IVsCodeWindow para ser el IVsTextLines a partir de la IVsInvisibleEditor
  4. Obtener un IWpfTextViewHost desde esta ventana de código.Esto me lleva de vuelta a la "WPF Tierra" de donde soy capaz de interactuar con la tradicional abarca.
  5. Crear un SnapshotSpan de la IWpfTextViewHost's vista de texto.Este SnapshotSpan contiene una sola función.
  6. Crear un IElisionBuffer contiene el SnapshotSpan.
  7. Crear un IVsTextBuffer a través de IVsEditorAdaptersFactoryService.CreateVsTextBufferAdapterForSecondaryBuffer() que pasa en el IElisionBuffer.
  8. Ahora echo la IVsTextBuffer a IVsTextLines y llame a SetLanguageServiceID() que pasa en el C# GUID:694DD9B6-B865-4C5B-AD85-86356E9C88DC.
  9. Yo verifique que se ha establecido correctamente a través de GetLanguageServiceID() y todo se ve bien.
  10. Puedo crear una IVsTextView y se inicializa con el nuevo IVsTextBuffer.
  11. Yo, a continuación, obtener la IWpfTextViewHost para este IVsTextView.

Hay medidas especiales que deben tenerse cuidado de que la configuración del idioma de IDENTIFICACIÓN de servicio para un IElisionBuffer?

En aras de la exhaustividad este es el código que estoy usando:

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);
}
¿Fue útil?

Solución

Hacer el tipo de contenido de su elisión de búfer de ser, o derivar de, con el tipo de contenido "proyección".Esa es la sugerencia de que taggers proyecto que a través de eso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top