visual pantalla mostrar formulario dividir control c# visual-studio editor mef visual-studio-extensions

pantalla - mostrar un formulario en un panel c#



Agregar ventanas de editor personalizadas a los paneles de ventana de Visual Studio (3)

Mi problema

Estoy tratando de construir una extensión para Visual Studio que permita que el código se edite por función, en lugar de por archivo. Básicamente estoy intentando mostrar el código de una manera similar a Microsoft Debugger Canvas .

Me pregunto cómo alojar múltiples editores de Visual Studio en una sola ventana (creo que las ventanas están implementando IVsWindowFrame). La funcionalidad que busco se puede ver a continuación:

Cada ventana del editor conserva la funcionalidad típica e interactúa con extensiones de terceros como se esperaba. (Por ejemplo, VsVim funciona correctamente dentro de estas ventanas).

Lo que he intentado

He pasado casi dos semanas investigando y probando estas cosas y estoy teniendo muchos problemas para averiguar qué servicios, interfaces y clases voy a usar.

Leyendo a través de MSDN

En primer lugar, la mayor parte de la documentation explica cómo editar una única ventana de editor y agregar adornos, etiquetas, márgenes, etc. No se discute la posibilidad de generar múltiples editores dentro de un panel de ventana.

He IVsTextBuffer la documentación en una gran cantidad de interfaces que me interesan, incluyendo IVsTextBuffer , IVsTextView y IVsInvisibleEditor . Desafortunadamente, no puedo conseguir que algunas de estas interfaces jueguen bien juntas.

Por encima de esto, el MSDN generalmente excelente es extremadamente deficiente en esta área. Muchas de las interfaces contienen solo una lista de miembros sin siquiera un comentario básico sobre el uso previsto y funcional. ( IComponentModel , por ejemplo).

Muchas de las interfaces hacen referencia a un conjunto de ejemplos de editor, pero el código no se puede leer ni descargar en MSDN. Aparentemente se entregó con Visual Studio 2005, pero no tengo esta versión de Visual Studio, ni puedo encontrarla.

Interactuando con IVsUIShell

Puedo obtener acceso a todos los WindowFrames abiertos usando IVsUIShell.GetDocumentWindowEnum(); Veo que hay un método IVsUiShell.CreateDocumentWindow() , pero no estoy completamente familiarizado con los parámetros que acepta, o si esta es la ruta correcta para bajar.

Lo que necesito hacer

  1. Crea programáticamente un panel de ventana acoplable
  2. Programar agregar editores a este panel de ventana. (Y asegúrese de que estén correctamente registrados en Visual Studio, la tabla de documentos en ejecución, etc.)

Editar:

Lo siento, debería haber ampliado mis pasos. Cuando dije que necesitaba registrarme con la tabla de documentos en ejecución y Visual Studio, es porque realmente quiero editar el documento original en mi editor personalizado. A continuación se muestra un breve ejemplo de la funcionalidad disponible en Debugger Canvas que estoy intentando recrear:

http://i.imgur.com/aYm8A5E.gif (no puedo incrustar un .gif)

Alternativamente:

Si alguien sabe dónde puedo encontrar los ejemplos de editor incluidos con Visual Studio 2005, como el ejemplo de Editor básico , estoy seguro de que podría resolver esto. La documentación de MSDN no tiene ejemplos de código con respecto a estas interfaces, lo que ha dificultado enormemente mi trabajo.


Necesita registrar una ventana de herramientas con su extensión de paquete; Esto se puede hacer a través del atributo ProvideToolWindow . El siguiente artículo contiene toda la información requerida sobre cómo se puede alojar un editor en una ventana de herramientas: http://bit.ly/9VWxPR

Echa un vistazo a la clase WpfTextViewHost ; El artículo explica que este tipo es en realidad un UIElement , por lo que imagino que es posible alojar varias instancias de él ...


No he visto los archivos que @ 280Z28 (¿por qué este nombre de usuario?) Publicado. Solía ​​trabajar en el editor de Visual Studio y lo que intentas hacer tiene múltiples facetas que debes abordar de forma independiente:

  • Alojar múltiples objetivos de comando dentro de un solo IVsWindowFrame (esto significa que tendrás diferentes elementos dentro del mismo panel desde el punto de vista del shell de Visual Studio, y cada uno de ellos debe tener su propio control de comandos. Considera el caso donde colocas tu caret en uno de los mini-editores y quieres deshacer el uso de Ctrl + Z, momentos después, luego colocas tu caret en otro mini-editor y haces lo mismo. A pesar de que el enfoque de WPF y Win32 se ha mantenido dentro del mismo marco de ventana (Desde el punto de vista de Visual Studio Shell), los comandos deben enrutarse a diferentes componentes.
  • Usando editores que muestran partes de otro documento. Los mecanismos aquí que serán tus amigos están en el espacio de nombres de proyección . La proyección esencialmente le permite proyectar una porción de búfer (o búferes) en una vista. Los búferes de Ellision son búferes de proyección de casos especiales que se proyectan desde un búfer de origen a una vista de destino mientras ocultan áreas del búfer (lo más probable es que esto sea lo que desea). Un ejemplo de un búfer de proyección es lo que sucede dentro de un archivo cshtml. En ese caso, hay un búfer que contiene todo el código C #, un búfer que contiene todo el javascript y un búfer que contiene el html y cada compilador funciona fuera de ese búfer, pero el usuario final ve una proyección de todos estos búferes en el editor del editor. vista con solo partes relevantes mostradas (por ejemplo, las declaraciones de importación de C # se eliminan aunque existan en el búfer de C # real).
  • Administrar el documento en ejecución para que cuando se realice una edición en un mini-editor, el documento real se ensucie. Debe manejar los casos en los que el archivo principal ya está abierto en la RDT, en cuyo caso desea ensuciar el mismo documento cuando se realizan cambios y también los casos en que el documento no está abierto, en cuyo caso debe crear una nueva entrada. en el RDT.

Además, publique en los foros de Visual Studio , hay personas que revisan regularmente los foros y dirigen las preguntas a los desarrolladores correspondientes.

En términos generales, cuando se trata del editor, evite las interfaces tradicionales (cualquier cosa que no utilice MEF), por lo que las muestras de Visual Studio 2005 no deben usarse como punto de referencia.

Si te importa lo suficiente y estás en Seattle, puedes intentar ir al campus como un MVP. Hay días en los que vienes al campus, y los miembros de un equipo diferente tomarán una computadora portátil y vendrán a tu sala de conferencias, y puedes depurar el código juntos o piratear (al mismo tiempo que tienes acceso a los símbolos de depuración y demás).

Por último, pero no menos importante, comuníquese con el código lienzo , estoy seguro de que han resuelto muchos de los problemas que enfrenta.


Git Source Control Provider es una extensión de código abierto que incluye un panel de herramientas que integra un editor estándar como un control dentro de una ventana de herramientas WPF personalizada. Utilizaría este código como referencia para cualquier extensión de Visual Studio 2010+ en la que quisiera alojar una ventana de editor en alguna ubicación personalizada.

  • PendingChangesView.xaml incluye un ContentControl llamado DiffEditor , DiffEditor contenido será el editor.
  • PendingChangesView.xaml.cs incluye un método ShowFile , que llama a un método para crear el control del editor y asigna el resultado como el contenido de DiffEditor .
  • ToolWindowWithEditor.cs incluye un método SetDisplayedFile que devuelve una interfaz Tuple<Control, IVsTextView> , que proporciona acceso a un Control que se puede agregar a ContentControl así como a IVsTextView para la vista de texto. El trabajo pesado está en este método.

Tenga en cuenta que el método SetDisplayedFile incluye varias líneas con el siguiente formulario:

textViewHost.TextView.Options.SetOptionValue({name}, {value});

Estas líneas realizan una funcionalidad clave para el proveedor de control de Git Source, como eliminar márgenes y hacer que la ventana sea de solo lectura. Hay muchas opciones disponibles, por lo que querrá revisar la documentación de DefaultTextViewOptions y DefaultTextViewHostOptions para aplicar las adecuadas para su extensión en particular.