如何:打开一个动态工具窗口

工具窗口从菜单上的命令或等效的键盘快捷键通常中打开。 通常,但是,您可能需要打开的工具窗口,只要特定用户界面 (UI)上下文应用,并关闭,当 UI 上下文不再适用。 这样的工具窗口调用 动态 或 自动可见。

备注

有关预定义的 UI 上下文的列表,请参见 VSConstants 并查找从 UICONTEXT_ 启动的字段。

如果要打开一个动态工具窗口在启动,因此,创建失败是可能的,则必须实现 IVsPackageDynamicToolOwnerEx 接口和测试在 QueryShowTool 方法的失败条件。 为了 shell 可以知道具有将打开在启动时动态工具窗口,必须添加 SupportsDynamicToolOwner 值 (设置为 1) 到包注册。 此值不是标准 PackageRegistrationAttribute的部分,因此,您必须创建自定义属性添加它。 有关自定义特性的更多信息,请参见使用注册的自定义注册属性扩展

使用 FindToolWindow 打开工具窗口。 工具窗口中创建根据需要。

备注

动态工具窗口都可由用户关闭。如果要创建菜单命令,以便用户可以重新打开工具窗口,在打开工具窗口的同一 UI 上下文否则应启用和禁用菜单命令。

打开一个动态工具窗口

  1. 创建工具窗口窗格、框架和实现自己的 VSPackage。 有关更多信息,请参见 如何:创建一个工具窗口

  2. 注册了 Visual Studio 的工具窗口通过添加 ProvideToolWindowAttributeProvideToolWindowVisibilityAttribute 到提供它的 VSPackage。

    <ProvideToolWindow(GetType(DynamicWindowPane), PositionX:=250, PositionY:=250, Width:=160, Height:=180, Transient:=True), _
     ProvideToolWindowVisibility(GetType(DynamicWindowPane), "f1536ef8-92ec-443c-9ed7-fdadf150da82"), _
     ProvideMenuResource(1000, 1), _
     DefaultRegistryRoot("Software\Microsoft\VisualStudio\8.0Exp"), _
     PackageRegistration(UseManagedResourcesOnly:=True), _
     Guid("01069CDD-95CE-4620-AC21-DDFF6C57F012")> _
    Public Class PackageToolWindow
        Inherits Package
    
    [ProvideToolWindow(typeof(DynamicWindowPane), PositionX = 250, PositionY = 250, Width = 160, Height = 180, Transient = true)]
    [ProvideToolWindowVisibility(typeof(DynamicWindowPane), /*UICONTEXT_SolutionExists*/"f1536ef8-92ec-443c-9ed7-fdadf150da82")]
    [ProvideMenuResource(1000, 1)]
    [DefaultRegistryRoot(@"Software\Microsoft\VisualStudio\8.0Exp")]
    [PackageRegistration(UseManagedResourcesOnly = true)]
    [Guid("01069CDD-95CE-4620-AC21-DDFF6C57F012")]
    public class PackageToolWindow : Package 
    

    此注册工具窗口名为 DynamicWindowPane 为不保留的临时窗口时, Visual Studio 关闭并重新打开时。 打开 DynamicWindowPane,只要 UICONTEXT_SolutionExists 应用,并否则结束。 默认位置和大小指定。 有关更多信息,请参见 如何:注册工具窗口

  3. 使用 FindToolWindow 查找工具窗口窗格或创建它,如果它已不存在。

    ' Get the (only) instance. 
    ' The last flag is set to true so that if the tool window does not exists it will be created. 
    Dim window As ToolWindowPane = Me.FindToolWindow(GetType(DynamicWindowPane), 0, True)
    If (window Is Nothing) Or (window.Frame Is Nothing) Then 
        Throw New NotSupportedException(Resources.CanNotCreateWindow)
    End If
    
    // Get the (only) instance of this tool window. 
    // The last flag is set to true so that if the tool window does not exists it will be created.
    ToolWindowPane window = this.FindToolWindow(typeof(DynamicWindowPane), 0, true);
    if ((null == window) || (null == window.Frame))
    {
        throw new NotSupportedException(Resources.CanNotCreateWindow);
    }
    
  4. 获取工具窗口窗格的工具窗架。

    Dim windowFrame As IVsWindowFrame = TryCast(window.Frame, IVsWindowFrame)
    
    IVsWindowFrame windowFrame = (IVsWindowFrame)window.Frame;
    
  5. 显示工具窗口。

    Microsoft.VisualStudio.ErrorHandler.ThrowOnFailure(windowFrame.Show())
    
    ErrorHandler.ThrowOnFailure(windowFrame.Show());
    

请参见

概念

VSPackage Essentials