在本演练中,您将添加到工具窗口在 演练:创建工具窗口 (第 2 部分的 4)创建的。 您将显示 打开文件 对话框的按钮,以便可以在媒体播放器可以选择文件。
本演练演示如何以动态可见性菜单命令。
本演练是解释如何扩展 Visual Studio 集成开发环境 (ide) 的一个系列 (IDE)。 有关更多信息,请参见 自定义的 Visual Studio 演练使用 Vspackage。
添加动态可见性菜单命令
默认情况下,更改,然后在显示后,菜单命令就地修复不能隐藏。 但是,在本演练的设计在包决定在运行时命令是否应当可见的,具体媒体播放器工具窗口是否处于活动状态。
必须首先修改 FirstToolWin.vsct 启用动态可见性,然后实现逻辑在代码中设置可见性。 您创建类保留工具窗口事件,然后修改包使菜单命令访问的对象一起,然后将它们附加。
启用动态可见性
打开 “FirstToolWin”项目,可以在 演练:创建工具窗口 (第 2 部分的 4)创建。
在 解决方案资源管理器,打开 FirstToolWin.vsct。
查找具有 ID 的 <Button> 元素, cmdidWindowsMedia。 在 <icon> 定义和 <Strings> 部分之间,添加两个命令标志,如下所示。
<CommandFlag>DefaultInvisible</CommandFlag> <CommandFlag>DynamicVisibility</CommandFlag>
保存该文件。
创建工具窗口事件
在 解决方案资源管理器,右击项目名称,指向 添加,然后单击 类。
在 添加新项目 对话框中,将文件命名为 ToolWindowEvents.cs 或 ToolWindowEvents.vb 然后单击 添加。
打开 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;
更改类声明,以便它是 public 和 sealed, (Public 和 NotInheritable 在 Visual Basic 中为) 并从 IVsWindowFrameNotify3 接口继承,如下所示。
Public NotInheritable Class ToolWindowEvents Implements IVsWindowFrameNotify3
public sealed class ToolWindowEvents : IVsWindowFrameNotify3
如果您使用的是 c#,请右击 IVsWindowFrameNotify3,指向 实现接口,然后单击 实现接口 自动添加该接口所需的方法。
如果您使用的是 Visual Basic,请跳过此步骤。
执行 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; }
填充剩余的 IVsWindowFrameNotify3 接口成员内容使用以下返回语句。
Return Microsoft.VisualStudio.VSConstants.S_OK
return Microsoft.VisualStudio.VSConstants.S_OK;
警告
在 c# 中,接口成员将填充 throw 语句,则必须被复盖。在 Visual Basic 中,函数将空。
所添加的代码声明将接收工具窗口的事件的类。 使用的事件此处 OnShow,菜单命令可见性设置基于值传递到事件。 通过的值是类型 __FRAMESHOW的枚举。 尽管此枚举有几个可能值,在这种情况下,必须测试是否与 FRAMESHOW_WinHidden相等。 如果不相等,然后将显示为 true。 如果是相等的,然后将显示为错误。
但请注意,此代码使用变量名为 “package”。该变量传递给构造函数。
将以下代码添加到类的顶部,在 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 事件,必须访问菜单命令。 默认情况下,此菜单命令是在包的初始化方法中的局部范围变量。
保存该文件。
访问菜单命令
在 解决方案资源管理器,打开 FirstToolWinPackage.cs 或 FirstToolWinPackage.vb,以便修改 FirstToolWin 类使菜单命令对象访问。
声明 MenuCommand 对象在类的顶部表示菜单命令。
Public toolMenuItem1 As MenuCommand
public MenuCommand toolMenuItem1;
为初始化方法中滚动。 找到以下两行,创建第一个命令。
Dim menuItem As New MenuCommand(New EventHandler(AddressOf MenuItemCallback), menuCommandID) mcs.AddCommand(menuItem)
MenuCommand menuItem = new MenuCommand(MenuItemCallback, menuCommandID); mcs.AddCommand(menuItem);
替换默认 MenuCommand 对象使用声明之前的公共变量。
Dim toolMenuItem1 As New MenuCommand(New EventHandler(AddressOf MenuItemCallback), menuCommandID) mcs.AddCommand(toolMenuItem1)
toolMenuItem1 = new MenuCommand(MenuItemCallback, menuCommandID); mcs.AddCommand(toolMenuItem1);
保存该文件。
接下来,您将创建工具窗口的实例并新创建的类的实例接收事件。 然后可以将类实例。工具窗口实例。
附加事件
在 解决方案资源管理器,打开 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 和第二个参数的新处理程序实例。
保存该文件。
测试代码
按 F5 编译该项目并运行在 Visual Studio 的实验性生成。
单击**“工具”**菜单。
WindowsMedia 菜单命令不应显示。
在 视图 菜单上,指向 其他窗口 然后单击 Windows Media Player 显示媒体播放器窗口。
再次单击 工具 菜单。
现在,,因为它有动态可见性, WindowsMedia 菜单命令应显示;即是否可见基于媒体播放器窗口是否可见。
关闭媒体播放器窗口然后重新检查 工具 菜单。
现在, WindowsMedia 菜单命令不应显示。
关闭实验生成。
添加 windows 窗体代码与工具窗口交互
现在,请将代码添加到响应菜单命令的包类。 此代码在媒体播放器打开 打开文件 对话框然后调用新的 LoadFile 方法加载文件。
激活代码中的工具窗口
打开 FirstToolWinPackage.cs。
使用语句,添加在现有的后面 System.Windows.Forms 命名空间,如下所示。
Imports System.Windows.Forms
using System.Windows.Forms;
查找 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); } }
保存您的工作。
此代码将打开 打开文件 对话框,以便能够浏览到您在媒体播放器要填充的媒体文件。 然后找到 MyToolWindow 实例并调用 LoadFile 方法,请创建之前,加载媒体文件。
测试代码
按 F5 编译该项目并运行在 Visual Studio 的实验实例。
在 工具 菜单上,单击 WindowsMedia。
打开文件 对话框应显示。
在 打开文件 对话框中,选择一个有效的媒体文件然后单击 好。
文件在媒体播放器应使用。
关闭实验实例。
接下来的内容
本演练演示如何将具有动态可见性的菜单命令。 它还说明如何将与工具窗口中的其他控件交互的控件。工具窗口。 这些概念通常适用于工具窗口。 您非常添加到工具窗口中的控件类似于在 windows 窗体应用程序中使用的用户控件。
在下一个演练, 演练:集成 " 属性 " 窗口中,任务列表, " 输出 " 窗口和 " 选项 " 对话框 (第 4 部分的 4),您可以学习如何在 Visual Studio 中现有的工具窗口时集成工具窗口,如 属性 窗口、 输出 窗口和 任务列表 窗口。