8

Escribí un complemento simple para Visual Studio 2008 que abre un panel de ventana acoplable.¿Por qué Visual Studio 2008 olvida dónde colocar el panel de ventana de mi complemento?

You can download the source and a binary installer by clicking here.

La naturaleza del complemento significa que está muy bien va a quedar atracado al lado de donde se edita su fuente. Pero a veces, en algunas instalaciones, no quedará atracado. Ejecutas VS, acoplas mi panel, cierras VS, reinicias VS y cuelgas - el panel flota de nuevo. En algunas máquinas, tengo que volver a acoplarlo todo el tiempo.

Pero en otras instalaciones permanece acoplado donde sea que lo coloque para siempre. Originalmente pensé que podría ser una diferencia entre Vista y XP, pero ahora también tengo informes de que se despegará en XP.

Por lo que he leído (y el hecho de que a veces permanece acoplado) me da la impresión de que se supone que VS se ocupará de guardar el estado de acoplamiento para mí. Pero no está haciendo eso. Y aún otros complementos en la misma instalación de VS no tienen este problema. Entonces tiene que haber algo que pueda hacer para mejorar la situación.

sospecho que la única parte relevante de mi código es la siguiente:

public class Connect : IDTExtensibility2 
{ 
    private static DTE2 _applicationObject; 
    private AddIn _addInInstance; 
    private static CodeModelEvents _codeModelEvents; 

    public static DTE2 VisualStudioApplication 
    { 
     get { return _applicationObject; } 
    } 

    public static CodeModelEvents CodeModelEvents 
    { 
     get { return _codeModelEvents; } 
    } 

    public static event EventHandler SourceChanged = delegate { }; 

    public void OnConnection(object application, 
      ext_ConnectMode connectMode, object addInInst, ref Array custom) 
    { 
     _applicationObject = (DTE2)application; 
     _addInInstance = (AddIn)addInInst; 
    } 

    public void OnStartupComplete(ref Array custom) 
    { 
     try 
     { 
      Events2 events = (Events2)_applicationObject.Events; 
      _codeModelEvents = events.get_CodeModelEvents(null); 

      object objTemp = null; 

      Windows2 toolWins = (Windows2)_applicationObject.Windows; 

      Window toolWin = toolWins.CreateToolWindow2(
       _addInInstance, GetType().Assembly.Location, "Ora.OraPane", "Ora", 
       "{DC8A399C-D9B3-40f9-90E2-EAA16F0FBF94}", ref objTemp); 
      toolWin.Visible = true; 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show("Exception: " + ex.Message); 
     } 
    } 

    public void OnBeginShutdown(ref Array custom) { } 

    public void OnDisconnection(ext_DisconnectMode disconnectMode, ref Array custom) { } 

    public void OnAddInsUpdate(ref Array custom) { } 
} 

(La documentación de MSDN sugieren que la ventana debe ser creado en OnConnection, pero si hago eso y luego parcialmente no aparece la ventana .)

Respuesta

10

He enfrentado algunos de los mismos problemas de acoplamiento con TeamReview (http://www.codeplex.com/TeamReview). No puedo decir por qué sucede, pero puedo ayudarlo a programar el código que siempre procesa su ventana en OnStartupComplete. Si tiene una ubicación particular en la que desea que esté, puede vincularla para que esté dentro de un marco después de crear su herramientaWin y antes de llamar a la propiedad Visible. Deberá verificar qué constantes se ajustan a su condición para los métodos CreateLinkedWindowFrame y SetKind. Además, es posible que desee vincular su ventana a algo distinto de MainWindow como el SolutionExplorer

EnvDTE80.Window2 frame = toolWins.CreateLinkedWindowFrame(toolWin, toolWin, vsLinkedWindowType.vsLinkedWindowTypeTabbed); 


frame.SetKind(EnvDTE.vsWindowType.vsWindowTypeToolWindow); 


_applicationObject.MainWindow.LinkedWindows.Add(frame); 

frame.Activate(); 

Esta muestra es similar a: http://www.codeplex.com/TeamReview/SourceControl/changeset/view/16102# 2008 -> TeamReview -> Comando -> ShowReplayWindowCommand.cs -> ShowForm()

Aquí está a good Microsoft example para vincular la Ventana de salida, la Ventana de comandos y el Explorador de soluciones. A continuación, manipula el ancho y la altura de estas ventanas vinculadas, y finalmente las desacopla del marco de ventana vinculado.

+0

Gracias por su respuesta útil y detallada. Lo que realmente quiero es que mi panel permanezca exactamente donde el usuario lo puso, pero creo que tendré que hackear algo que se aproxime. –

+0

Desarrollando un complemento aquí. Esta publicación fue TOTALMENTE útil. Habría votado dos veces si no hubiera eliminado mi voto en su lugar: P. –

+0

Esta respuesta es útil pero requiere (mucho) más trabajo para que la ventana de herramientas permanezca acoplada donde el usuario la dejó por última vez. La respuesta de Jumozas Kontvainis es mucho más simple y funciona para mí (después de probar muchas otras soluciones, ninguna de las cuales funcionó). – Polyfun

1

Tengo el mismo problema que el autor. Noté que Visual Studio 2005 "olvida" la posición de la ventana de la herramienta solo después de las sesiones en las que se utilizó la depuración.

La respuesta aceptada no ayuda mucho porque la ventana de herramientas siempre se acopla a la parte inferior. Realmente quiero que los usuarios puedan elegir dónde quieren atracar y guardar sus preferencias simplemente atracando donde quieran.

+0

Estoy de acuerdo. Si alguien tiene una mejor sugerencia, la aceptaré en su lugar. –

1

Esto es lo que me ayudó. Uso Visual Studio 2005, pero esto también puede ser útil.

public void OnBeginShutdown(ref Array custom) 
{ 
    if (_toolWin != null) 
      _toolWin.Visible = false; 
} 
+0

Lo intenté pero no importó. –

+1

¿Ha notado algún patrón cuando la ventana de la herramienta se desacopla? Para mí, el problema era la depuración, es decir, si comencé Visual Studio y no comencé a depurar, la ventana de mi herramienta de complemento funcionaba bien, si depuraba algo, se desacoplaría en la próxima sesión. –

+0

+1 Esto parece funcionar para mí también, y estoy usando Visual Studio 2008. Supongo que cuando hace que la ventana de la herramienta sea invisible, VS guarda su tamaño y ubicación. Solo necesitaba guardar el estado de visibilidad de la ventana de herramientas antes de hacerlo invisible. – Polyfun

0

Configurar la visibilidad de la ventana de herramienta a falso funciona muy bien. gracias JK.

Responde a la pregunta de JK sobre el desacoplamiento después de la depuración, me pregunto si el cambio devenv.exe/resetaddin en las propiedades de depuración de proyectos hace que eso suceda. Ciertamente reinicia todo lo demás que crea el complemento.

Idea: El modificador/resetaddin se agrega automáticamente a la configuración de depuración cuando se crea un proyecto de complemento. Normalmente pongo un carácter no válido como una 'x' en la fuente del nombre de la clase en el comando/resetaddin, para que pueda volver a habilitarse fácilmente quitando la x cuando queremos un restablecimiento completo. ¡Generalmente no hay necesidad de un reinicio cada vez que depuramos!

Cuestiones relacionadas