Visual studio 为什么VisualStudio2008忘记了将我的外接程序停靠在哪里';窗户是什么?
我为VisualStudio2008编写了一个简单的外接程序,它打开了一个可固定的窗格 外接程序的性质意味着,理想情况下,它将停靠在您编辑源代码的位置旁边。但有时,在某些安装上,它不会保持固定。你运行VS,你停靠我的窗格,你关闭VS,你重新启动VS,然后该死-窗格再次浮动。在一些机器上,我每次都要重新停靠 但在其他安装上,无论我把它放在哪里,它都会永远停靠在那里。我最初认为Vista和XP之间可能存在差异,但现在我有报告说它在XP上也会出现问题 从我读到的(以及它有时保持停靠的事实)我得到的印象是VS应该为我保存停靠状态。但它并没有这样做。然而,同一VS安装上的其他插件没有这个问题。因此,我必须做些事情来改善这种情况 我怀疑我的代码中唯一相关的部分是:Visual studio 为什么VisualStudio2008忘记了将我的外接程序停靠在哪里';窗户是什么?,visual-studio,visual-studio-2008,add-in,visual-studio-addins,docking,Visual Studio,Visual Studio 2008,Add In,Visual Studio Addins,Docking,我为VisualStudio2008编写了一个简单的外接程序,它打开了一个可固定的窗格 外接程序的性质意味着,理想情况下,它将停靠在您编辑源代码的位置旁边。但有时,在某些安装上,它不会保持固定。你运行VS,你停靠我的窗格,你关闭VS,你重新启动VS,然后该死-窗格再次浮动。在一些机器上,我每次都要重新停靠 但在其他安装上,无论我把它放在哪里,它都会永远停靠在那里。我最初认为Vista和XP之间可能存在差异,但现在我有报告说它在XP上也会出现问题 从我读到的(以及它有时保持停靠的事实)我得到的印
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) { }
}
(MSDN文档建议应在OnConnection中创建窗口,但如果我这样做,则窗口大部分不会出现。)我在TeamReview()中遇到了一些相同的对接问题。我不能说为什么会发生这种情况,但我可以帮助您找到总是在OnStartupComplete中记录窗口的代码。如果您希望它位于某个特定位置,则可以在创建toolWin之后和调用Visible属性之前将其链接到框架内。您必须检查哪些常量适合CreateLinkedWindowFrame和SetKind方法的条件。此外,您可能希望将窗口链接到除主窗口之外的其他窗口,例如SolutionExplorer
EnvDTE80.Window2 frame = toolWins.CreateLinkedWindowFrame(toolWin, toolWin, vsLinkedWindowType.vsLinkedWindowTypeTabbed);
frame.SetKind(EnvDTE.vsWindowType.vsWindowTypeToolWindow);
_applicationObject.MainWindow.LinkedWindows.Add(frame);
frame.Activate();
此示例类似于:2008->TeamReview->Command->ShowReplayWindowCommand.cs->ShowForm()
下面是将输出窗口、命令窗口和解决方案资源管理器链接在一起的步骤。然后它操纵这些链接窗口的宽度和高度,最后将它们全部从链接窗口框架中解除锁定。我和作者有相同的问题。我注意到VisualStudio2005仅在使用调试的会话之后才“忘记”工具窗口的位置
公认的答案没有多大帮助,因为工具窗口总是固定在底部。我真的希望用户能够选择他们想要停靠的地方,并通过简单地停靠在他们喜欢的地方来保存他们的偏好。以下是对我有帮助的内容。我使用VisualStudio2005,但这也可能对您有所帮助
public void OnBeginShutdown(ref Array custom)
{
if (_toolWin != null)
_toolWin.Visible = false;
}
将toolwindow可见性设置为false非常有效。谢谢JK 为了回答JK关于调试后取消停靠的问题,我想知道projects debug属性中的devenv.exe/resetaddin开关是否导致了这种情况。它肯定会重置addin创建的所有其他内容
想法:创建加载项项目时,/resetaddin开关会自动添加到调试配置中。我通常会在/resetaddin命令中的类名字体上添加一个无效字符,例如“x”,这样当我们需要硬重置时,可以通过删除x轻松地重新启用它。每次调试时通常不需要重置 谢谢你这么详细的回答。我真正想要的是让我的窗格保持在用户放置它的位置,但我想我必须将一些近似于它的东西拼凑在一起。在这里开发一个插件。这篇文章非常有用。如果没有删除我的投票,我会投两次票:P。这个答案很有用,但需要(很多)更多的工作才能让toolwindow保持在用户上次离开它的位置。Juozas Kontvainis的答案简单得多,对我有效(在尝试了许多其他解决方案后,没有一个有效)。我同意。如果有人有更好的建议,我会接受!当工具窗口松开时,您是否注意到任何图案?对我来说,问题是调试,也就是说,如果我启动了Visual Studio,但没有启动调试,我的加载项工具窗口工作正常,如果我调试了某个东西,它将在下一个会话中解除锁定。+1这似乎对我也适用,我正在使用Visual Studio 2008。我的猜测是,当您使工具窗口不可见时,VS会保存其大小和位置。我只需要在使工具窗口不可见之前保存它的可见性状态。