Pregunta

Escribí un complemento simple para Visual Studio 2008 que abre un panel de ventana acoplable.

Puede descargar la fuente y un instalador binario haciendo clic aquí.

La naturaleza del complemento significa que, idealmente, permanecerá acoplado al lado de donde edite su fuente. Pero a veces, en algunas instalaciones, no permanecerá acoplado. Ejecutas VS, acoplas mi panel, cierras VS, reinicias VS y lo cuelgas: el panel está flotando nuevamente. En algunas máquinas tengo que volver a acoplarlo cada vez.

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 tengo informes de que también se desatascará 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 por mí. Pero no está haciendo eso. Y aún otros complementos en la misma instalación VS no tienen este problema. Entonces, debe haber algo que pueda hacer para mejorar la situación.

Sospecho que la única parte relevante de mi código es esta:

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) { }
}

(Los documentos de MSDN sugieren que la ventana se cree en OnConnection, pero si lo hago, la ventana no aparece en su mayoría).

¿Fue útil?

Solución

Enfrenté algunos de los mismos problemas de acoplamiento con TeamReview ( http://www.codeplex.com/TeamReview ). No puedo decir por qué sucede, pero puedo ayudarlo a señalar el código que siempre documenta 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 toolWin y antes de llamar a la propiedad Visible. Tendrá que 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 que no sea MainWindow, como SolutionExplorer

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


frame.SetKind(EnvDTE.vsWindowType.vsWindowTypeToolWindow);


_applicationObject.MainWindow.LinkedWindows.Add(frame);

frame.Activate();

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

Aquí está un buen ejemplo de Microsoft para vincular la Ventana de salida, la Ventana de comandos y el Explorador de soluciones. Luego manipula el ancho y alto de estas ventanas vinculadas, y finalmente las desacopla del marco de la ventana vinculada.

Otros consejos

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

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

Esto es lo que me ayudó. Yo uso Visual Studio 2005, pero esto también podría ayudarte.

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

Establecer la visibilidad de la ventana de herramientas en falso funciona realmente bien. gracias JK.

Para responder la pregunta de JK sobre el desacoplamiento después de la depuración, me pregunto si el modificador devenv.exe / resetaddin en las propiedades de depuración del proyecto hace que eso suceda. Ciertamente restablece todo lo demás que crea el complemento.

Idea: El modificador / resetaddin se agrega automáticamente a la configuración de depuración cuando crea un proyecto de complemento. Por lo general, pongo un carácter no válido como una 'x' en la fuente del nombre de la clase en el comando / resetaddin, para que se pueda volver a habilitar fácilmente eliminando la x cuando queremos un restablecimiento completo. ¡Por lo general, no es necesario reiniciar cada vez que depuramos!

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