为什么Visual Studio 2008忘记了我的加载项窗口窗格的停靠位置?

时间:2008-11-19 11:05:02

标签: visual-studio visual-studio-2008 add-in visual-studio-addins docking

我为Visual Studio 2008编写了一个简单的加载项,用于打开可停靠的窗口窗格。

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

加载项的性质意味着理想情况下它将停靠在编辑源的位置旁边。但有时候,在某些安装中,它不会停留在停靠状态。你运行VS,你停靠我的窗格,你关闭VS,你重新启动VS,然后敲响它 - 窗格再次浮动。在某些机器上,我每次都必须重新对接它。

但是在其他安装中,无论我永远放在哪里,它都会停靠。我原本以为它可能是Vista和XP之间的区别,但现在我有报道说它在XP上也没有出现。

从我读过的内容(以及它有时会停留在这里的事实)我得到的印象是VS应该为我保存对接状态。但事实并非如此。而在同一VS安装上的其他插件没有这个问题。因此,我必须采取一些措施来改善这种情况。

我怀疑我的代码中唯一相关的部分是:

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中创建窗口,但如果我这样做,那么窗口大部分都不会出现。)

4 个答案:

答案 0 :(得分:10)

我遇到了TeamReview(http://www.codeplex.com/TeamReview)的一些相同的对接问题。我不能说为什么会发生这种情况,但我可以帮助您指出始终在OnStartupComplete中记录您的窗口的代码。如果您有一个特定的位置,那么您可以在创建toolWin之后和调用Visible属性之前将其链接到框架内。您必须检查哪些常量符合CreateLinkedWindowFrame和SetKind方法的条件。此外,您可能希望将窗口链接到MainWindow以外的其他内容,例如SolutionExplorer

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


frame.SetKind(EnvDTE.vsWindowType.vsWindowTypeToolWindow);


_applicationObject.MainWindow.LinkedWindows.Add(frame);

frame.Activate();

此示例类似于:http://www.codeplex.com/TeamReview/SourceControl/changeset/view/16102# 2008 - > TeamReview - >命令 - > ShowReplayWindowCommand.cs - > ShowForm()

这里是a good Microsoft example将输出窗口,命令窗口和解决方案资源管理器链接在一起。然后它操纵这些链接窗口的宽度和高度,最后从链接的窗口框架中取消它们。

答案 1 :(得分:1)

我和作者有同样的问题。我注意到Visual Studio 2005仅在使用调试的会话之后“忘记”工具窗口位置。

接受的答案没有多大帮助,因为工具窗口始终停靠在底部。我真的希望用户能够选择他们想要停靠的地方,并通过简单地停靠在他们喜欢的地方来保存他们的偏好。

答案 2 :(得分:1)

这对我有帮助。我使用的是Visual Studio 2005,但这对你也有帮助。

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

答案 3 :(得分:0)

将工具窗口可见性设置为false非常有效。谢谢JK。

要回答JK关于调试后取消停靠的问题,我想知道项目调试属性中的devenv.exe / resetaddin切换是否会导致这种情况发生。它肯定会重置addin创建的所有其他内容。

想法:创建插件项目时,/ resetaddin开关会自动添加到调试配置中。我通常在/ resetaddin命令中放置一个无效的字符,例如类名字体'x',这样当我们想要硬重置时,可以通过删除x来轻松重新启用它。每次调试时通常都不需要重置!