2015-04-02 67 views

回答

5

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

如果从自己的包中使用(或者,如果你有到包的引用,只是把它放在那里,而不是):

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()); 
} 
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”中的GUID类及以上ToolWindow的类。

+0

DTE.Windows.Item()将'object item'作为参数。 – 2016-05-05 13:23:00

1

当你创建一个新包与工具窗口的支持,你会得到一个单一的工具窗口,并显示它的命令。该命令在包类中使用ShowToolWindow方法处理。

检查,你会发现基础包对象具有可以用来找到FindToolWindow方法(如果需要创建)的任何工具窗口你已经在你的包中实现。 FindToolWindow方法只是IVsUIShell.FindToolWindow方法的一个很好的包装,它在显示任何工具窗口时最终被调用。

因此,而不是使用旧EnvDTE自动化接口的,我会建议使用内置到实际的包对象的较低水平的服务。

+0

我已经为Ed Dore的答案添加了一些代码。见下面。 – Shakaron 2015-06-29 15:55:45

相关问题