Bagikan melalui


Berlangganan dengan sebuah Event

Panduan ini menjelaskan cara membuat jendela alat yang merespons peristiwa dalam tabel dokumen yang sedang berjalan (RDT). Jendela alat menghosting kontrol pengguna yang mengimplementasikan IVsRunningDocTableEvents. Metode ini AdviseRunningDocTableEvents menghubungkan antarmuka ke peristiwa.

Berlangganan Peristiwa RDT

Untuk membuat ekstensi dengan jendela alat

  1. Buat proyek bernama RDTExplorer menggunakan templat VSIX, dan tambahkan templat item jendela alat kustom bernama RDTExplorerWindow.

    Untuk informasi selengkapnya tentang membuat ekstensi dengan jendela alat, lihat Membuat Ekstensi dengan Jendela Alat.

Untuk berlangganan peristiwa RDT

  1. Buka file RDTExplorerWindowControl.xaml dan hapus tombol bernama button1. ListBox Tambahkan kontrol dan terima nama default. Elemen Grid akan terlihat seperti ini:

    <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. Buka file RDTExplorerWindow.cs dalam tampilan kode. Tambahkan berikut ini menggunakan direktif ke awal file.

    using Microsoft.VisualStudio;
    using Microsoft.VisualStudio.Shell;
    using Microsoft.VisualStudio.Shell.Interop;
    
  3. RDTExplorerWindow Ubah kelas sehingga, selain berasal dari ToolWindowPane kelas , itu mengimplementasikan IVsRunningDocTableEvents antarmuka .

    public class RDTExplorerWindow : ToolWindowPane, IVsRunningDocTableEvents
    {. . .}
    
  4. Mengimplementasikan IVsRunningDocTableEvents.

    • Implementasikan antarmuka. Tempatkan kursor pada nama IVsRunningDocTableEvents. Anda akan melihat bola lampu di margin kiri. Klik panah Bawah di sebelah kanan bola lampu dan pilih Terapkan antarmuka.
  5. Di setiap metode dalam antarmuka, ganti baris throw new NotImplementedException(); dengan ini:

    return VSConstants.S_OK;
    
  6. Tambahkan bidang cookie ke kelas RDTExplorerWindow.

    private uint rdtCookie;
    

    Ini menyimpan cookie yang dikembalikan oleh AdviseRunningDocTableEvents metode .

  7. Ambil alih metode RDTExplorerWindow's Initialize() untuk mendaftar peristiwa RDT. Anda harus selalu mendapatkan layanan dalam metode Initialize() ToolWindowPane, bukan di konstruktor.

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

    Layanan SVsRunningDocumentTable ini dipanggil untuk mendapatkan IVsRunningDocumentTable antarmuka. Metode ini AdviseRunningDocTableEvents menghubungkan peristiwa RDT ke objek yang mengimplementasikan IVsRunningDocTableEvents, dalam hal ini, objek RDTExplorer.

  8. Perbarui metode 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);
    }
    

    Metode UnadviseRunningDocTableEvents menghapus koneksi antara RDTExplorer dan pemberitahuan peristiwa RDT.

  9. Tambahkan baris berikut ke isi OnBeforeLastDocumentUnlock handler, tepat sebelum return pernyataan.

    public int OnBeforeLastDocumentUnlock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
    {
        ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnBeforeLastDocumentUnlock");
        return VSConstants.S_OK;
    }
    
  10. Tambahkan baris serupa ke isi OnAfterFirstDocumentLock handler dan ke peristiwa lain yang ingin Anda lihat di kotak daftar.

    public int OnAfterFirstDocumentLock(uint docCookie, uint dwRDTLockType, uint dwReadLocksRemaining, uint dwEditLocksRemaining)
    {
        ((RDTExplorerWindowControl)this.Content).listBox.Items.Add("Entering OnAfterFirstDocumentLock");
        return VSConstants.S_OK;
    }
    
  11. Bangun proyek dan mulai penelusuran kesalahan. Instans eksperimental Visual Studio muncul.

  12. Buka RDTExplorerWindow (Lihat / Windows Lainnya / RDTExplorerWindow).

    Jendela RDTExplorerWindow terbuka dengan daftar peristiwa kosong.

  13. Buka atau buat solusi.

    Saat OnBeforeLastDocument peristiwa dan OnAfterFirstDocument diaktifkan, pemberitahuan setiap peristiwa muncul di daftar peristiwa.