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
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
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>
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;
RDTExplorerWindow
Ubah kelas sehingga, selain berasal dari ToolWindowPane kelas , itu mengimplementasikan IVsRunningDocTableEvents antarmuka .public class RDTExplorerWindow : ToolWindowPane, IVsRunningDocTableEvents {. . .}
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.
Di setiap metode dalam antarmuka, ganti baris
throw new NotImplementedException();
dengan ini:return VSConstants.S_OK;
Tambahkan bidang cookie ke kelas RDTExplorerWindow.
private uint rdtCookie;
Ini menyimpan cookie yang dikembalikan oleh AdviseRunningDocTableEvents metode .
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.
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.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; }
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; }
Bangun proyek dan mulai penelusuran kesalahan. Instans eksperimental Visual Studio muncul.
Buka RDTExplorerWindow (Lihat / Windows Lainnya / RDTExplorerWindow).
Jendela RDTExplorerWindow terbuka dengan daftar peristiwa kosong.
Buka atau buat solusi.
Saat
OnBeforeLastDocument
peristiwa danOnAfterFirstDocument
diaktifkan, pemberitahuan setiap peristiwa muncul di daftar peristiwa.