演练:扩展工具窗口 (第 3 部分的 4)

在本演练中,您将添加到工具窗口在 演练:创建工具窗口 (第 2 部分的 4)创建的。 您将显示 打开文件 对话框的按钮,以便可以在媒体播放器可以选择文件。

本演练演示如何以动态可见性菜单命令。

本演练是解释如何扩展 Visual Studio 集成开发环境 (ide) 的一个系列 (IDE)。 有关更多信息,请参见 自定义的 Visual Studio 演练使用 Vspackage

添加动态可见性菜单命令

默认情况下,更改,然后在显示后,菜单命令就地修复不能隐藏。 但是,在本演练的设计在包决定在运行时命令是否应当可见的,具体媒体播放器工具窗口是否处于活动状态。

必须首先修改 FirstToolWin.vsct 启用动态可见性,然后实现逻辑在代码中设置可见性。 您创建类保留工具窗口事件,然后修改包使菜单命令访问的对象一起,然后将它们附加。

启用动态可见性

  1. 打开 “FirstToolWin”项目,可以在 演练:创建工具窗口 (第 2 部分的 4)创建。

  2. 解决方案资源管理器,打开 FirstToolWin.vsct。

  3. 查找具有 ID 的 <Button> 元素, cmdidWindowsMedia。 在 <icon> 定义和 <Strings> 部分之间,添加两个命令标志,如下所示。

    <CommandFlag>DefaultInvisible</CommandFlag>
    <CommandFlag>DynamicVisibility</CommandFlag>
    
  4. 保存该文件。

创建工具窗口事件

  1. 解决方案资源管理器,右击项目名称,指向 添加,然后单击

  2. 添加新项目 对话框中,将文件命名为 ToolWindowEvents.cs 或 ToolWindowEvents.vb 然后单击 添加

  3. 打开 ToolWindowEvents.cs 或 ToolWindowEvents.vb 并在任何现有的 using 或 Imports 语句后添加以下代码。

    Imports System
    Imports System.Collections.Generic
    Imports System.Linq
    Imports System.Text
    Imports Microsoft.VisualStudio.Shell.Interop
    Imports System.ComponentModel.Design
    Imports System.Security.Permissions
    
    using Microsoft.VisualStudio.Shell.Interop;
    using System.ComponentModel.Design;
    using System.Security.Permissions;
    
  4. 更改类声明,以便它是 public 和 sealed, (Public 和 NotInheritable 在 Visual Basic 中为) 并从 IVsWindowFrameNotify3 接口继承,如下所示。

    Public NotInheritable Class ToolWindowEvents
        Implements IVsWindowFrameNotify3
    
    public sealed class ToolWindowEvents : IVsWindowFrameNotify3
    
  5. 如果您使用的是 c#,请右击 IVsWindowFrameNotify3,指向 实现接口,然后单击 实现接口 自动添加该接口所需的方法。

    如果您使用的是 Visual Basic,请跳过此步骤。

  6. 执行 OnShow 方法,如下所示。

    Public Function OnShow(ByVal fShow As Integer) As Integer Implements VisualStudio.Shell.Interop.IVsWindowFrameNotify3.OnShow
        If Not fShow = __FRAMESHOW.FRAMESHOW_WinHidden Then
            package.toolMenuItem1.visible = True 
        End If 
        Return Microsoft.VisualStudio.VSConstants.S_OK
    End Function
    
    [PrincipalPermission(SecurityAction.Demand)]
    public int OnShow(int fShow)
    {
        package.toolMenuItem1.Visible
            = ((__FRAMESHOW)fShow
            != __FRAMESHOW.FRAMESHOW_WinHidden);
        return Microsoft.VisualStudio.VSConstants.S_OK;
    }
    
  7. 填充剩余的 IVsWindowFrameNotify3 接口成员内容使用以下返回语句。

    Return Microsoft.VisualStudio.VSConstants.S_OK
    
    return Microsoft.VisualStudio.VSConstants.S_OK;
    

    警告

    在 c# 中,接口成员将填充 throw 语句,则必须被复盖。在 Visual Basic 中,函数将空。

    所添加的代码声明将接收工具窗口的事件的类。 使用的事件此处 OnShow,菜单命令可见性设置基于值传递到事件。 通过的值是类型 __FRAMESHOW的枚举。 尽管此枚举有几个可能值,在这种情况下,必须测试是否与 FRAMESHOW_WinHidden相等。 如果不相等,然后将显示为 true。 如果是相等的,然后将显示为错误。

    但请注意,此代码使用变量名为 “package”。该变量传递给构造函数。

  8. 将以下代码添加到类的顶部,在 IVsWindowFrameNotify3 接口成员定义的区域中。

    Private package As FirstToolWinPackage
    Public Sub New(ByVal apackage As FirstToolWinPackage)
        package = apackage
    End Sub
    
    private FirstToolWinPackage package;
    public ToolWindowEvents(FirstToolWinPackage apackage)
    {
        package = apackage;
    }
    

    将传递给此构造函数是包, FirstToolWin 实例。 在 OnShow 事件,必须访问菜单命令。 默认情况下,此菜单命令是在包的初始化方法中的局部范围变量。

  9. 保存该文件。

访问菜单命令

  1. 解决方案资源管理器,打开 FirstToolWinPackage.cs 或 FirstToolWinPackage.vb,以便修改 FirstToolWin 类使菜单命令对象访问。

  2. 声明 MenuCommand 对象在类的顶部表示菜单命令。

    Public toolMenuItem1 As MenuCommand
    
    public MenuCommand toolMenuItem1;
    
  3. 为初始化方法中滚动。 找到以下两行,创建第一个命令。

    Dim menuItem As New MenuCommand(New EventHandler(AddressOf MenuItemCallback), menuCommandID)
    mcs.AddCommand(menuItem)
    
    MenuCommand menuItem = new MenuCommand(MenuItemCallback, menuCommandID);
    mcs.AddCommand(menuItem);
    
  4. 替换默认 MenuCommand 对象使用声明之前的公共变量。

    Dim toolMenuItem1 As New MenuCommand(New EventHandler(AddressOf MenuItemCallback), menuCommandID)
    mcs.AddCommand(toolMenuItem1)
    
    toolMenuItem1 = new MenuCommand(MenuItemCallback, menuCommandID);
    mcs.AddCommand(toolMenuItem1);                
    
  5. 保存该文件。

接下来,您将创建工具窗口的实例并新创建的类的实例接收事件。 然后可以将类实例。工具窗口实例。

附加事件

  1. 解决方案资源管理器,打开 MyToolWindow.cs 或 MyToolWindow.vb。 通过添加以下代码来重写 OnToolWindowCreated 方法在文件末尾,在类定义的右大括号前。

    Public Overrides Sub OnToolWindowCreated()
        MyBase.OnToolWindowCreated()
    
        Dim handler As FirstToolWinPackage = CType( _
            Me.Package, FirstToolWinPackage)
        CType(Me.Frame, IVsWindowFrame).SetProperty( _
            CInt(__VSFPROPID.VSFPROPID_ViewHelper), handler)
    End Sub
    
    public override void OnToolWindowCreated()
    {
        base.OnToolWindowCreated();
    
        var handler = new ToolWindowEvents(
            (FirstToolWinPackage)this.Package);
        ((IVsWindowFrame)this.Frame).SetProperty(
            (int)__VSFPROPID.VSFPROPID_ViewHelper, handler);
    }
    

    此代码创建添加之前类的新实例。 然后实例添加到框架的属性,以便实例可以接收事件。 SetProperty 方法完成此操作,将第一个参数时枚举值 VSFPROPID_ViewHelper 和第二个参数的新处理程序实例。

  2. 保存该文件。

测试代码

  1. 按 F5 编译该项目并运行在 Visual Studio 的实验性生成。

  2. 单击**“工具”**菜单。

    WindowsMedia 菜单命令不应显示。

  3. 视图 菜单上,指向 其他窗口 然后单击 Windows Media Player 显示媒体播放器窗口。

  4. 再次单击 工具 菜单。

    现在,,因为它有动态可见性, WindowsMedia 菜单命令应显示;即是否可见基于媒体播放器窗口是否可见。

  5. 关闭媒体播放器窗口然后重新检查 工具 菜单。

    现在, WindowsMedia 菜单命令不应显示。

  6. 关闭实验生成。

添加 windows 窗体代码与工具窗口交互

现在,请将代码添加到响应菜单命令的包类。 此代码在媒体播放器打开 打开文件 对话框然后调用新的 LoadFile 方法加载文件。

激活代码中的工具窗口

  1. 打开 FirstToolWinPackage.cs。

  2. 使用语句,添加在现有的后面 System.Windows.Forms 命名空间,如下所示。

    Imports System.Windows.Forms
    
    using System.Windows.Forms;
    
  3. 查找 MenuItemCallback 菜单处理程序。 这是 click 事件处理程序中菜单命令。 ,使用以下代码替换此菜单处理程序的主体。

    Dim openFileDialog As System.Windows.Forms.OpenFileDialog = New System.Windows.Forms.OpenFileDialog()
    Dim result As DialogResult = openFileDialog.ShowDialog()
    If (result = DialogResult.OK) Then 
        Dim window As MyToolWindow = TryCast(Me.FindToolWindow(GetType(MyToolWindow), 0, True), MyToolWindow)
        If (window IsNot Nothing) Then
            window.LoadFile(openFileDialog.FileName)
        End If 
    End If
    
    System.Windows.Forms.OpenFileDialog openFileDialog = new System.Windows.Forms.OpenFileDialog();
    DialogResult result = openFileDialog.ShowDialog();
    if (result == DialogResult.OK)
    {
        MyToolWindow window = (MyToolWindow)(this.FindToolWindow(
            typeof(MyToolWindow), 0, true));
        if (window != null)
        {
            window.LoadFile(openFileDialog.FileName);
        }
    }
    
  4. 保存您的工作。

此代码将打开 打开文件 对话框,以便能够浏览到您在媒体播放器要填充的媒体文件。 然后找到 MyToolWindow 实例并调用 LoadFile 方法,请创建之前,加载媒体文件。

测试代码

  1. 按 F5 编译该项目并运行在 Visual Studio 的实验实例。

  2. 工具 菜单上,单击 WindowsMedia

    打开文件 对话框应显示。

  3. 打开文件 对话框中,选择一个有效的媒体文件然后单击

    文件在媒体播放器应使用。

  4. 关闭实验实例。

接下来的内容

本演练演示如何将具有动态可见性的菜单命令。 它还说明如何将与工具窗口中的其他控件交互的控件。工具窗口。 这些概念通常适用于工具窗口。 您非常添加到工具窗口中的控件类似于在 windows 窗体应用程序中使用的用户控件。

在下一个演练, 演练:集成 " 属性 " 窗口中,任务列表, " 输出 " 窗口和 " 选项 " 对话框 (第 4 部分的 4),您可以学习如何在 Visual Studio 中现有的工具窗口时集成工具窗口,如 属性 窗口、 输出 窗口和 任务列表 窗口。

请参见

其他资源

扩展 Visual Studio 概述