代码之家  ›  专栏  ›  技术社区  ›  Daniel Earwicker

为什么Visual Studio 2008忘记将加载项的窗口窗格停靠在哪里?

  •  7
  • Daniel Earwicker  · 技术社区  · 17 年前

    我为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 回复  |  直到 17 年前
        1
  •  9
  •   JB Brown    17 年前

    我在TeamReview中遇到了一些相同的对接问题( http://www.codeplex.com/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();
    

    此示例类似于: http://www.codeplex.com/TeamReview/SourceControl/changeset/view/16102# 2008年>团队回顾->命令->ShowReplayWindowCommand.cs->显示形式()

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

        2
  •  1
  •   Juozas Kontvainis    17 年前

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

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

        3
  •  1
  •   Juozas Kontvainis    17 年前

    以下是对我有所帮助的内容。我使用Visual Studio 2005,但这也可能对你有所帮助。

    public void OnBeginShutdown(ref Array custom)
    {
         if (_toolWin != null)
              _toolWin.Visible = false;
    }
    
        4
  •  0
  •   Visual Micro    13 年前

    将工具窗口可见性设置为false效果很好。谢谢JK。

    为了回答JK关于调试后退出的问题,我想知道项目调试属性中的devenv.exe/resetaddin开关是否会导致这种情况发生。它当然会重置插件创建的其他所有内容。

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

    推荐文章