Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Visual studio 为什么VisualStudio2008忘记了将我的外接程序停靠在哪里';窗户是什么?_Visual Studio_Visual Studio 2008_Add In_Visual Studio Addins_Docking - Fatal编程技术网

Visual studio 为什么VisualStudio2008忘记了将我的外接程序停靠在哪里';窗户是什么?

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上也会出现问题 从我读到的(以及它有时保持停靠的事实)我得到的印

我为VisualStudio2008编写了一个简单的外接程序,它打开了一个可固定的窗格

外接程序的性质意味着,理想情况下,它将停靠在您编辑源代码的位置旁边。但有时,在某些安装上,它不会保持固定。你运行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中创建窗口,但如果我这样做,则窗口大部分不会出现。)

我在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会保存其大小和位置。我只需要在使工具窗口不可见之前保存它的可见性状态。