イベントのサブスクライブ
このチュートリアルでは、実行中のドキュメント テーブル (RDT) 内のイベントに応答するツール ウィンドウを作成する方法について説明します。 ツール ウィンドウでは、IVsRunningDocTableEvents を実装するユーザー コントロールをホストします。 AdviseRunningDocTableEvents メソッドでは、そのインターフェイスをイベントに接続します。
RDT イベントのサブスクライブ
ツール ウィンドウで拡張機能を作成するには
VSIX テンプレートを使用して RDTExplorer という名前のプロジェクトを作成し、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;
ToolWindowPane クラスから派生することに加え、IVsRunningDocTableEvents インターフェイスも実装するように
RDTExplorerWindow
クラスを変更します。public class RDTExplorerWindow : ToolWindowPane, IVsRunningDocTableEvents {. . .}
IVsRunningDocTableEventsを実装します。
- インターフェイスを実装します。 IVsRunningDocTableEvents 名にカーソルを置きます。 左余白に電球が表示されます。 電球の右側にある下矢印をクリックし、[インターフェイスの実装] を選択します。
インターフェイスの各メソッドで、
throw new NotImplementedException();
行を次のように置き換えます。return VSConstants.S_OK;
cookie フィールドを RDTExplorerWindow クラスに追加します。
private uint rdtCookie;
これには、AdviseRunningDocTableEvents メソッドから返される cookie が入ります。
RDTExplorerWindow の Initialize() メソッドをオーバーライドして、RDT イベントに登録します。 必ず、コンストラクターではなく ToolWindowPane の Initialize() メソッドでサービスを取得するようにしてください。
protected override void Initialize() { IVsRunningDocumentTable rdt = (IVsRunningDocumentTable) this.GetService(typeof(SVsRunningDocumentTable)); rdt.AdviseRunningDocTableEvents(this, out rdtCookie); }
SVsRunningDocumentTable サービスが呼び出されて、IVsRunningDocumentTable インターフェイスが取得されます。 AdviseRunningDocTableEvents メソッドにより、IVsRunningDocTableEvents (この場合は RDTExplorer オブジェクト) を実装するオブジェクトに RDT イベントが接続されます。
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
イベントが発生し、各イベントの通知がイベント リストに表示されます。