6

我正在创建一个公开工具窗口的 Visual Studio 包,并且我试图确保在首次加载包时它显示停靠在 Visual Studio 主窗口的左边缘。

[ProvideToolWindow(typeof(MyToolWindow), Orientation = ToolWindowOrientation.Left, 
    Style=VsDockStyle.Linked, Window=EnvDTE.Constants.vsWindowKindLinkedWindowFrame)])]
[ProvideToolWindowVisibility(typeof(MyToolWindow), VSConstants.UICONTEXT.NoSolution_string)]
public class MyPackage : Package
{
    ...

我已经尝试了上述的许多变体,但我设法实现的最好的方法是将窗口停靠在底部- 即使这样,每次重新加载包时它都会继续重新停靠,而不是坚持用户窗口位置。

如何指定我的窗格最初显示为停靠在主窗口的左侧?

4

4 回答 4

3

支持将项目设置为 VsDockStyle.Tabbed,因此您可以连接到 Toolbox 工具窗口。但我猜你已经想到了,它不适合你的情况。

虽然不是一个很好的解决方案,但您可以尝试这种解决方法。

  1. 使用所需的方向和窗口设置 ProvideToolWindow,但将样式设置为浮动,因为不支持链接 (http://msdn.microsoft.com/en-us/library/microsoft.visualstudio.shell.vsdockstyle.aspx):

    [ProvideToolWindow(typeof(MyToolWindow), Style = VsDockStyle.Float, Orientation = ToolWindowOrientation.Left, Window = EnvDTE.Constants.vsWindowKindMainWindow)]
    
  2. 在运行时,如果您发现工具窗口处于浮动状态,请停靠它:

    /// <summary>
    /// Docks the specified frame window if it is currently floating.
    /// </summary>
    /// <remarks>
    /// Works in VS2010, does not appear to work in VS2008.
    /// </remarks>
    /// <param name="frame">The frame.</param>
    private static void DockWindowIfFloating(IVsWindowFrame frame)
    {
        // Get the current tool window frame mode.
        object currentFrameMode;
        frame.GetProperty((int)__VSFPROPID.VSFPROPID_FrameMode, out currentFrameMode);
    
        // If currently floating, switch to dock mode.
        if ((VSFRAMEMODE)currentFrameMode == VSFRAMEMODE.VSFM_Float)
        {
            frame.SetProperty((int)__VSFPROPID.VSFPROPID_FrameMode, VSFRAMEMODE.VSFM_Dock);
        }
    }
    

正如我在评论中指出的那样——这似乎只适用于 VS2010(不适用于 VS2008)。

希望它有所帮助,尽管它很老套。

于 2011-06-06T03:45:49.513 回答
3

如果您希望它与其他窗口(如输出窗口、错误列表、查找结果等)默认停靠在底部,您可以这样做:

[ProvideToolWindow(typeof(ThePane),
                   Orientation=ToolWindowOrientation.Right,
                   Window=EnvDTE.Constants.vsWindowKindOutput,
                   Style=VsDockStyle.Tabbed)]

方向似乎没有什么不同,但它似乎总是出现在左侧。但对我来说足够接近了。

于 2017-05-18T16:47:02.067 回答
0

我不知道这是否有效,但您可以尝试一下:

我在注册表中查找了解决方案资源管理器工具窗口停靠位置的线索,发现 Window 参数包含“DocumentWell”

所以你可以试试这个:

[ProvideToolWindow(typeof(MyToolWindow), Orientation = ToolWindowOrientation.Right, Style=VsDockStyle.Tabbed, Window="DocumentWell")])]

或者

Window=EnvDTE.Constants.vsWindowKindMainWindow

希望这可以帮助,

托马斯。

于 2011-04-11T12:09:12.300 回答
0
// Replace EnvDTE.Constants.vsWindowKindSolutionExplorer with the GUID you need.
[ProvideToolWindow(typeof(IssuesWindow), Style = VsDockStyle.Tabbed, Window = EnvDTE.Constants.vsWindowKindSolutionExplorer)]

这在 Visual Studio 2015 上运行良好。在虚拟机上测试。

但是,有一个限制:工具窗口仅在 IDE 第一次与您的扩展一起启动时才停靠。使用虚拟机进行测试很容易,因为您只需恢复以前的状态。我猜想写了一些注册表值,Visual Studio 下次会记住工具窗口的先前位置,而不是使用您刚刚在上面指定的默认值。

如果有人想要,我猜他们可以比较注册表之前/之后的版本并找到这些设置值并在下次/按需手动重置它们。

于 2016-07-12T09:36:05.380 回答