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 .)
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. –
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. –
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