如何以编程方式打开 visual studio 扩展的工具 window?
How to open a tool window of a visual studio extension programmatically?
所以我的 visual studio 扩展(包)中有 ,我想通过第一个 [=19] 上的按钮打开第二个 window =].
我原以为会在这里得到解释:"How to: Open a Tool Window Programmatically",但事实并非如此。
我是这样解决的,下面的代码是第一个按钮的代码隐藏方法window:
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;
}
您应该在 Guids class 和工具窗口的 class 上方找到“WindowGUID”。
当您创建一个支持工具窗口的新包时,您会得到一个工具窗口和一个显示它的命令。此命令在包 class 中使用 ShowToolWindow 方法处理。
检查一下,您会发现基础包对象有一个 FindToolWindow 方法,您可以使用该方法查找(并在需要时创建)您在包中实现的任何工具窗口。 FindToolWindow 方法只是 IVsUIShell.FindToolWindow 方法的一个很好的包装器,它是显示任何工具窗口时最终被调用的方法。
因此,与其使用旧的 EnvDTE 自动化接口,我建议使用实际包对象中内置的较低级别的服务。
您应该使用 Package.FindToolWindow
或 IVsUIShell.FindToolWindow
来查找或创建工具 window。
如果从您自己的包中使用(或者如果您有对包的引用,只需将其放在那里而不是 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());
}
所以我的 visual studio 扩展(包)中有
我原以为会在这里得到解释:"How to: Open a Tool Window Programmatically",但事实并非如此。
我是这样解决的,下面的代码是第一个按钮的代码隐藏方法window:
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;
}
您应该在 Guids class 和工具窗口的 class 上方找到“WindowGUID”。
当您创建一个支持工具窗口的新包时,您会得到一个工具窗口和一个显示它的命令。此命令在包 class 中使用 ShowToolWindow 方法处理。
检查一下,您会发现基础包对象有一个 FindToolWindow 方法,您可以使用该方法查找(并在需要时创建)您在包中实现的任何工具窗口。 FindToolWindow 方法只是 IVsUIShell.FindToolWindow 方法的一个很好的包装器,它是显示任何工具窗口时最终被调用的方法。
因此,与其使用旧的 EnvDTE 自动化接口,我建议使用实际包对象中内置的较低级别的服务。
您应该使用 Package.FindToolWindow
或 IVsUIShell.FindToolWindow
来查找或创建工具 window。
如果从您自己的包中使用(或者如果您有对包的引用,只需将其放在那里而不是 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());
}