VSIX:将工具窗口添加到“视图”->“其他窗口”

3

我正在使用 Package 类上的这个属性在 VS 中公开一个工具窗口:

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

这很好用,我可以使用以下代码进行编程打开:

  private void ShowToolWindow()
  {
     //this method will show the window if it's not active or bring it to front if it's collapsed
     ToolWindowPane window = this.FindToolWindow(typeof(MyToolWindow), 0, true);
     if ((null == window) || (null == window.Frame))
     {
        throw new NotSupportedException();
     }
     IVsWindowFrame windowFrame = (IVsWindowFrame)window.Frame;
     Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(windowFrame.Show());
  }

然而,如果用户意外关闭了窗口,就没有办法恢复它。我想知道其他扩展是如何将其添加到“工具” ->“其他窗口”,比如NuGet。在NuGet源代码中没有找到明显的东西。


嗨,你能帮我入门VSIX基础吗?之前我创建了一个VS插件,现在我想将其迁移到vsix。我的插件包括一个工具窗口。 - Junaid Qadir Shekhanzai
1个回答

3

您需要添加一个命令以调用 ShowToolWindow 例程。

您的包 vsct 文件的顶部需要几个外部引用:

<!--This is the file that defines the IDs for all the commands exposed by VisualStudio. -->
<Extern href="stdidcmd.h"/>
<!--This header contains the command ids for the menus provided by the shell. -->
<Extern href="vsshlids.h"/>

这个文件应该定义一些符号:
<Symbols>
    <!-- Use your package guid. -->
    <GuidSymbol name="guidPackage" value="{00000000-0000-0000-0000-000000000000}" />

    <!-- Use a new GUID to uniquely identify your package commands -->
    <GuidSymbol name="guidCmdSet" value="{11111111-1111-1111-1111-111111111111}">
        <IDSymbol name="cmdidViewMyToolWindow" value="0x0500" />
    </GuidSymbol>
</Symbols>

在您的包的vsct文件的Buttons块中添加以下内容:
<Button guid="guidCmdSet" id="cmdidViewMyToolWindow" priority="0x0100" type="Button">
    <!--IDG_VS_WNDO_OTRWNDWS0 is the first group in "View|Other Windows". See 
    C:\Program Files (x86)\Microsoft Visual Studio 2010 SDK SP1\VisualStudioIntegration\Common\Inc
    for other options. -->
    <Parent guid="guidSHLMainMenu" id="IDG_VS_WNDO_OTRWNDWS0"/>
    <CommandFlag>DynamicVisibility</CommandFlag>
    <CommandFlag>DefaultInvisible</CommandFlag>
    <Strings>
        <ButtonText>View &amp;My Tool Window</ButtonText>
    </Strings>
</Button>

所有这些都应该使“查看我的工具窗口”出现在视图菜单的顶部区域。现在,当有人点击它时,您需要采取行动。

您的软件包应实现IOleCommandTarget以处理命令的可见性和启用:

public class MyPackage : Package, IOleCommandTarget
{
    #region IOleCommandTarget implementation

    /// <summary>
    /// The VS shell calls this function to know if a menu item should be visible and
    /// if it should be enabled/disabled.
    /// This is called only when the package is active.
    /// </summary>
    /// <param name="guidCmdGroup">Guid describing which set of commands the current command(s) belong to</param>
    /// <param name="cCmds">Number of commands for which status are being asked</param>
    /// <param name="prgCmds">Information for each command</param>
    /// <param name="pCmdText">Used to dynamically change the command text</param>
    /// <returns>HRESULT</returns>
    public int QueryStatus(ref Guid guidCmdGroup, uint cCmds, OLECMD[] prgCmds, IntPtr pCmdText)
    {
        // Filter out commands that are not defined by this package
        if ( guidCmdGroup != new Guid("{00000000-0000-0000-0000-000000000000}"))
            return (int)(Constants.OLECMDERR_E_NOTSUPPORTED);

        if ( cCmds == 0 || prgCmds == null || prgCmds.Length == 0 || cCmds != prgCmds.Length )
            return VSConstants.E_INVALIDARG;

        // Show and enable all commands.
        OLECMDF cmdf = OLECMDF.OLECMDF_SUPPORTED | OLECMDF.OLECMDF_ENABLED;
        for ( int i = 0; i < cCmds; i++ )
            prgCmds[i].cmdf = (uint)cmdf;

        return VSConstants.S_OK;
    }

    #endregion
}

最后,在您的包初始化例程中,您告诉 shell 在单击您的命令时要执行什么操作:

protected override void Initialize()
{
    base.Initialize();

    // Add our command handlers (commands must exist in the .vsct file)
    OleMenuCommandService mcs = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;
    if ( null != mcs )
    {
        // "View My Tool Window" command callback
        CommandID menuCommandID = new CommandID(new Guid("{11111111-1111-1111-1111-111111111111}"), (int)0x500);
        MenuCommand menuItem = new MenuCommand(ShowToolWindow, menuCommandID);
        mcs.AddCommand(menuItem);
    }
}

在“实际”的代码中,您可能需要在C#中定义一些与vsct中定义的符号相匹配的GUID常量,并在整个代码中使用它们。

谢谢,那是我为代码审查编写的扩展IronBoard的最后一部分 :) - Ivan G.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接