如何以编程方式打开visual studio扩展的工具窗口?

时间:2015-04-02 13:55:07

标签: c# wpf visual-studio visual-studio-2013 vspackage

所以我的visual studio扩展(包)中有two tool windows,我想通过第一个窗口上的按钮打开第二个窗口。

我希望在这里解释一下:"How to: Open a Tool Window Programmatically",但事实并非如此。

3 个答案:

答案 0 :(得分:5)

您应该使用Package.FindToolWindowIVsUIShell.FindToolWindow来查找或创建工具窗口。

如果从您自己的软件包中使用(或者如果您有对软件包的引用,只需将其放在那里而不是 this ):

private void OpenFromPackage()
{
    ToolWindowPane window = this.FindToolWindow(typeof(MyToolWindow), 0, true); // True means: crate if not found. 0 means there is only 1 instance of this tool window
    if (null == window || null == window.Frame)
        throw new NotSupportedException("MyToolWindow not found");

    IVsWindowFrame windowFrame = (IVsWindowFrame)window.Frame;
    ErrorHandler.ThrowOnFailure(windowFrame.Show());
}

如果你不能从你的包中做到,或者没有对它的引用,请使用IVSUIShell:

private void OpenWithIVsUIShell()
{
    IVsUIShell vsUIShell = (IVsUIShell)Package.GetGlobalService(typeof(SVsUIShell));
    Guid guid = typeof(MyToolWindow).GUID;
    IVsWindowFrame windowFrame;
    int result = vsUIShell.FindToolWindow((uint)__VSFINDTOOLWIN.FTW_fFindFirst, ref guid, out windowFrame);   // Find MyToolWindow

    if (result != VSConstants.S_OK)
        result = vsUIShell.FindToolWindow((uint)__VSFINDTOOLWIN.FTW_fForceCreate, ref guid, out windowFrame); // Crate MyToolWindow if not found

    if (result == VSConstants.S_OK)                                                                           // Show MyToolWindow
        ErrorHandler.ThrowOnFailure(windowFrame.Show());
 }

答案 1 :(得分:1)

当您使用工具窗口支持创建新包时,您将获得一个工具窗口和一个显示它的命令。使用ShowToolWindow方法在包类中处理此命令。

检查一下,您将看到基础包对象有一个FindToolWindow方法,您可以使用该方法查找(并在需要时创建)您在包中实现的任何工具窗口。 FindToolWindow方法只是IVsUIShell.FindToolWindow方法的一个很好的包装器,它是在显示任何工具窗口时最终被调用的。

因此,我建议使用内置于实际包对象中的较低级别服务,而不是使用旧的EnvDTE自动化界面。

答案 2 :(得分:0)

以下是我如何解决它,以下代码是第一个窗口上按钮的代码隐藏方法:

        private void ButtonBase_OnClick(object sender, RoutedEventArgs e)
        {
            var dte = Package.GetGlobalService(typeof(DTE)) as DTE;
            if (dte == null) return;

            var window = dte.Windows.Item("{WindowGUID}");
            window.Visible = true;
        }

你应该找到" WindowGUID "在Guids类中以及ToolWindow类的上方。