所以我在我的Visual Studio扩展(包)得到two tool windows,我想通过第一窗口上的按钮,打开第二个窗口。如何以编程方式打开Visual Studio扩展的工具窗口?
我预计今年将要说明:"How to: Open a Tool Window Programmatically",但事实并非如此。
所以我在我的Visual Studio扩展(包)得到two tool windows,我想通过第一窗口上的按钮,打开第二个窗口。如何以编程方式打开Visual Studio扩展的工具窗口?
我预计今年将要说明:"How to: Open a Tool Window Programmatically",但事实并非如此。
您应该使用Package.FindToolWindow
或IVsUIShell.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());
}
这里是我如何解决它,下面的代码是按钮的第一窗口上的代码隐藏方法:
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的类。
当你创建一个新包与工具窗口的支持,你会得到一个单一的工具窗口,并显示它的命令。该命令在包类中使用ShowToolWindow方法处理。
检查,你会发现基础包对象具有可以用来找到FindToolWindow方法(如果需要创建)的任何工具窗口你已经在你的包中实现。 FindToolWindow方法只是IVsUIShell.FindToolWindow方法的一个很好的包装,它在显示任何工具窗口时最终被调用。
因此,而不是使用旧EnvDTE自动化接口的,我会建议使用内置到实际的包对象的较低水平的服务。
我已经为Ed Dore的答案添加了一些代码。见下面。 – Shakaron 2015-06-29 15:55:45
DTE.Windows.Item()将'object item'作为参数。 – 2016-05-05 13:23:00