共用方式為


訂閱事件

本逐步解說詳述如何建立工具視窗,以回應執行中文件資料表中的事件 (RDT)。 工具視窗裝載實作 IVsRunningDocTableEvents的使用者控制項。 AdviseRunningDocTableEvents 方法會將介面連接到事件。

訂閱 RDT 事件

使用工具視窗建立延伸模組

  1. 使用 VSIX 範本建立名為 RDTExplorer 的專案,並新增名為 RDTExplorerWindow 的自訂工具視窗項目範本。

    如需使用工具視窗建立延伸模組的詳細資訊,請參閱使用工具視窗建立延伸模組

訂閱 RDT 事件

  1. 開啟 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>
    
  2. 在程式碼檢視中開啟 RDTExplorerWindow.cs 檔案。 將下列 using 指示詞加入檔案開端。

    using Microsoft.VisualStudio;
    using Microsoft.VisualStudio.Shell;
    using Microsoft.VisualStudio.Shell.Interop;
    
  3. 修改 RDTExplorerWindow 類別,如此一來,除了衍生自 ToolWindowPane 類別之外,它也會實作 IVsRunningDocTableEvents 介面。

    public class RDTExplorerWindow : ToolWindowPane, IVsRunningDocTableEvents
    {. . .}
    
  4. 實作 IVsRunningDocTableEvents

    • 實作 介面。 將游標置放在 IVsRunningDocTableEvents 名稱上。 您應該會在左邊界看到燈泡。 按一下燈泡右側的向下箭號,然後選取 [實作介面]
  5. 在介面中的每個方法中,將 throw new NotImplementedException(); 這一行取代為:

    return VSConstants.S_OK;
    
  6. 將 Cookie 欄位新增至 RDTExplorerWindow 類別。

    private uint rdtCookie;
    

    這會保存 AdviseRunningDocTableEvents 方法所傳回的 Cookie。

  7. 覆寫 RDTExplorerWindow's Initialize() 方法來註冊 RDT 事件。 您應該始終會在 ToolWindowPane's Initialize() 方法中取得服務,而不是建構函式中的服務。

    protected override void Initialize()
    {
        IVsRunningDocumentTable rdt = (IVsRunningDocumentTable)
        this.GetService(typeof(SVsRunningDocumentTable));
        rdt.AdviseRunningDocTableEvents(this, out rdtCookie);
    }
    

    呼叫 SVsRunningDocumentTable 服務以取得 IVsRunningDocumentTable 介面。 AdviseRunningDocTableEvents 方法會將 RDT 事件連接到實作 IVsRunningDocTableEvents 的物件,在此案例為 RDTExplorer 物件。

  8. 更新 RDTExplorerWindow's 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 事件通知之間的連線。

  9. 將下列這一行新增至 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;
    }
    
  10. 將類似行新增至 OnAfterFirstDocumentLock 處理常式主體,以及您想要在清單方塊中看到的其他事件。

    public int OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
    {
        ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnAfterFirstDocumentLock");
        return VSConstants.S_OK;
    }
    
  11. 建置此專案並開始偵錯。 隨即出現 Visual Studio 實驗執行個體。

  12. 開啟 RDTExplorerWindow (View / Other Windows / RDTExplorerWindow)。

    RDTExplorerWindow 視窗會以空事件清單形式開啟。

  13. 開啟或建立解決方案。

    當引發 OnBeforeLastDocumentOnAfterFirstDocument 事件時,每個事件的通知會出現在事件清單中。