订阅事件
若要了解有关 Visual Studio 2017 RC 的最新文档,请参阅 Visual Studio 2017 RC 文档。
本演练说明了如何创建一个工具窗口,对正在运行的 document 表 (RDT) 的事件做出响应。 工具窗口承载用户控件实现IVsRunningDocTableEvents。 AdviseRunningDocTableEvents方法连接到这些事件的接口。
启动 Visual Studio 2015 中,您并不安装 Visual Studio SDK 从下载中心获得。 它将包括作为 Visual Studio 安装程序中的可选功能。 您还可以在以后安装 VS SDK。 有关详细信息,请参阅安装 Visual Studio SDK。
若要使用的工具窗口创建扩展
-
创建一个名为项目RDTExplorer使用 VSIX 模板,并将添加一个名为的自定义工具窗口项模板RDTExplorerWindow。
有关使用一个工具窗口创建扩展的详细信息,请参阅使用一个工具窗口创建扩展。
璹綷 RDT 事件
-
打开 RDTExplorerWindowControl.xaml 文件并删除名为的按钮
button1
。 添加ListBox控件并接受默认名称。 Grid 元素应该如下所示︰<Grid> <StackPanel Orientation="Vertical" Margin="-10,10,10,0"> <TextBlock Margin="10" HorizontalAlignment="Center">RDTExplorerWindow</TextBlock> <ListBox x:Name="listBox" Height="100" /> </StackPanel> </Grid>
-
在代码视图中打开 RDTExplorerWindow.cs 文件。 将以下代码添加到开始的文件的 using 语句。
using Microsoft.VisualStudio; using Microsoft.VisualStudio.Shell; using Microsoft.VisualStudio.Shell.Interop;
-
修改
RDTExplorerWindow
类这样,除了派生自ToolWindowPane类,它实现IVsRunningDocTableEvents接口。public class RDTExplorerWindow : ToolWindowPane, IVsRunningDocTableEvents {. . .}
-
- 实现接口。 将光标置于 IVsRunningDocTableEvents 名称。 您应该看到左侧边距中该变量的灯泡图标。 单击灯泡图标右侧的向下箭头,然后选择实现接口。
-
在接口中的每个方法,将行
throw new NotImplementedException();
与此︰return VSConstants.S_OK;
-
将 cookie 字段添加到 RDTExplorerWindow 类。
private uint rdtCookie;
它将保存所返回的 cookie AdviseRunningDocTableEvents方法。
-
重写 RDTExplorerWindow initialize () 方法,以注册 RDT 事件。 您始终应在 ToolWindowPane initialize () 方法中,未在构造函数可以获得服务。
protected override void Initialize() { IVsRunningDocumentTable rdt = (IVsRunningDocumentTable) this.GetService(typeof(SVsRunningDocumentTable)); rdt.AdviseRunningDocTableEvents(this, out rdtCookie); }
SVsRunningDocumentTable服务调用以获得IVsRunningDocumentTable接口。 AdviseRunningDocTableEvents方法连接到一个对象,实现 RDT 事件IVsRunningDocTableEvents,在这种情况下,RDTExplorer 对象。
-
更新 RDTExplorerWindow 的 dispose () 方法。
protected override void Dispose(bool disposing) { // Release the RDT cookie. IVsRunningDocumentTable rdt = (IVsRunningDocumentTable) Package.GetGlobalService(typeof(SVsRunningDocumentTable)); rdt.UnadviseRunningDocTableEvents(rdtCookie); base.Dispose(disposing); }
UnadviseRunningDocTableEvents方法删除之间的连接
RDTExplorer
和 RDT 事件通知。 -
将以下行添加到主体OnBeforeLastDocumentUnlock处理程序中,紧前面
return
语句。public int OnBeforeLastDocumentUnlock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining) { ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnBeforeLastDocumentUnlock"); return VSConstants.S_OK; }
-
将类似的代码行添加到主体OnAfterFirstDocumentLock处理程序和你想要在列表框中查看其他事件。
public int OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining) { ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnAfterFirstDocumentLock"); return VSConstants.S_OK; }
-
生成项目并启动调试。 将显示 Visual Studio 实验实例。
-
打开RDTExplorerWindow (视图 / 其他窗口 / RDTExplorerWindow)。
RDTExplorerWindow窗口将打开与空的事件列表。
-
打开或创建一个解决方案。
作为
OnBeforeLastDocument
和OnAfterFirstDocument
,将激发事件,通知的每个事件就会出现在事件列表。