Cara VSPackages menambahkan elemen antarmuka pengguna
VSPackage dapat menambahkan elemen antarmuka pengguna (UI), misalnya, menu, toolbar, dan jendela alat, ke Visual Studio dengan menggunakan file .vsct .
Anda dapat menemukan panduan desain untuk elemen UI di panduan pengalaman pengguna Visual Studio.
Arsitektur tabel perintah Visual Studio
Seperti yang disebutkan, arsitektur tabel perintah mendukung prinsip arsitektur yang sudah ada di atas. Tenet di balik abstraksi, struktur data, dan alat arsitektur tabel perintah adalah sebagai berikut:
Ada tiga jenis item dasar: menu, perintah, dan grup. Menu dapat diekspos di UI sebagai menu, submenu, toolbar, atau jendela alat. Perintah adalah prosedur yang dapat dijalankan pengguna di IDE, dan mereka dapat diekspos sebagai item menu, tombol, kotak daftar, atau kontrol lainnya. Grup adalah kontainer untuk menu dan perintah.
Setiap item ditentukan oleh definisi yang menjelaskan item, prioritasnya relatif terhadap item lain, dan bendera yang mengubah perilakunya.
Setiap item memiliki penempatan yang menjelaskan induk item. Item dapat memiliki beberapa induk, sehingga dapat muncul di beberapa lokasi di UI.
Setiap perintah harus memiliki grup sebagai induknya, meskipun itu adalah satu-satunya anak dalam grup tersebut. Setiap menu standar juga harus memiliki grup induk. Bilah alat dan jendela alat bertindak sebagai orang tua mereka sendiri. Grup dapat memiliki sebagai induknya bilah menu Visual Studio utama, atau menu, toolbar, atau jendela alat apa pun.
Bagaimana item ditentukan
File .vsct diformat dalam XML. Ini mendefinisikan elemen UI untuk paket dan menentukan di mana elemen tersebut muncul di IDE. Setiap menu, grup, atau perintah dalam paket pertama-tama diberi GUID dan ID di bagian .Symbols
Di seluruh file .vsct lainnya, setiap menu, perintah, dan grup diidentifikasi oleh kombinasi GUID dan ID-nya. Contoh berikut menunjukkan bagian umum Symbols
seperti yang dihasilkan oleh templat paket Visual Studio saat Perintah Menu dipilih dalam templat.
<Symbols>
<!-- This is the package guid. -->
<GuidSymbol name="guidMenuTextPkg" value="{b1253bc6-d266-402b-89e7-5e3d3b22c746}" />
<!-- This is the guid used to group the menu commands together -->
<GuidSymbol name="guidMenuTextCmdSet" value="{a633d4e4-6c65-4436-a138-1abeba7c9a69}">
<IDSymbol name="MyMenuGroup" value="0x1020" />
<IDSymbol name="cmdidMyCommand" value="0x0100" />
</GuidSymbol>
<GuidSymbol name="guidImages" value="{53323d9a-972d-4671-bb5b-9e418480922f}">
<IDSymbol name="bmpPic1" value="1" />
<IDSymbol name="bmpPic2" value="2" />
<IDSymbol name="bmpPicSearch" value="3" />
<IDSymbol name="bmpPicX" value="4" />
<IDSymbol name="bmpPicArrows" value="5" />
</GuidSymbol>
</Symbols>
Elemen tingkat atas bagian Symbols
adalah elemen GuidSymbol. GuidSymbol
elemen memetakan nama ke GUID yang digunakan oleh IDE untuk mengidentifikasi paket dan bagian komponennya.
Catatan
GUID dihasilkan secara otomatis oleh templat paket Visual Studio. Anda juga dapat membuat GUID unik dengan mengklik Buat GUID pada menu Alat .
Elemen pertama GuidSymbol
, guid<PackageName>Pkg
, adalah GUID dari paket itu sendiri. Ini adalah GUID yang digunakan oleh Visual Studio untuk memuat paket. Biasanya, ia tidak memiliki elemen turunan.
Menurut konvensi, menu dan perintah dikelompokkan di bawah elemen kedua GuidSymbol
, guid<PackageName>CmdSet
, dan bitmap berada di bawah elemen ketiga GuidSymbol
, guidImages
. Anda tidak perlu mengikuti konvensi ini, tetapi setiap menu, grup, perintah, dan bitmap harus merupakan anak dari GuidSymbol
elemen.
Dalam elemen kedua GuidSymbol
, yang mewakili kumpulan perintah paket, adalah beberapa IDSymbol
elemen. Setiap elemen IDSymbol memetakan nama ke nilai numerik, dan dapat mewakili menu, grup, atau perintah yang merupakan bagian dari set perintah. Elemen IDSymbol
dalam elemen ketiga GuidSymbol
mewakili bitmap yang dapat digunakan sebagai ikon untuk perintah. Karena pasangan GUID/ID harus unik dalam aplikasi, tidak ada dua anak dari elemen yang sama GuidSymbol
yang mungkin memiliki nilai yang sama.
Menu, grup, dan perintah
Saat menu, grup, atau perintah memiliki GUID dan ID, itu dapat ditambahkan ke IDE. Setiap elemen UI harus memiliki hal-hal berikut:
Atribut
guid
yang cocok dengan namaGuidSymbol
elemen yang didefinisikan oleh elemen UI.Atribut
id
yang cocok dengan nama elemen terkaitIDSymbol
.
Bersama-sama, guid
atribut dan id
menyusun tanda tangan elemen UI.
Atribut
priority
yang menentukan penempatan elemen UI di menu atau grup induknya.Elemen Induk yang memiliki
guid
atribut danid
yang menentukan tanda tangan menu atau grup induk.
Menu
Setiap menu didefinisikan sebagai elemen Menu di bagian .Menus
Menu harus memiliki guid
atribut , id
, dan priority
, dan Parent
elemen, dan juga atribut dan turunan tambahan berikut:
Atribut
type
yang menentukan apakah menu akan muncul di IDE sebagai jenis menu atau sebagai toolbar.Elemen String yang berisi elemen ButtonText, yang menentukan judul menu di IDE, dan elemen CommandName, yang menentukan nama yang digunakan di jendela Perintah untuk mengakses menu.
Bendera opsional. Elemen CommandFlag dapat muncul dalam definisi menu untuk mengubah tampilan atau perilakunya di IDE.
Setiap Menu
elemen harus memiliki grup sebagai induknya, kecuali itu adalah elemen yang dapat ditambat seperti toolbar. Menu yang dapat ditampung adalah induknya sendiri. Untuk informasi selengkapnya tentang menu dan nilai untuk type
atribut, lihat dokumentasi Elemen menu.
Contoh berikut menunjukkan menu yang muncul di bilah menu Visual Studio, di samping menu Alat .
<Menu guid="guidTopLevelMenuCmdSet" id="TopLevelMenu" priority="0x700" type="Menu">
<Parent guid="guidSHLMainMenu" id="IDG_VS_MM_TOOLSADDINS" />
<Strings>
<ButtonText>TestMenu</ButtonText>
<CommandName>TestMenu</CommandName>
</Strings>
</Menu>
Grup
Grup adalah item yang ditentukan di bagian Groups
file .vsct . Grup hanyalah kontainer. Mereka tidak muncul di IDE kecuali sebagai garis pembagian pada menu. Oleh karena itu, elemen Grup hanya didefinisikan oleh tanda tangan, prioritas, dan induknya.
Grup dapat memiliki menu, grup lain, atau grup itu sendiri sebagai induk. Namun, induk biasanya merupakan menu atau toolbar. Menu dalam contoh sebelumnya adalah anak dari grup, dan grup tersebut IDG_VS_MM_TOOLSADDINS
adalah anak dari bilah menu Visual Studio. Grup dalam contoh berikut adalah anak dari menu dalam contoh sebelumnya.
<Group guid="guidTopLevelMenuCmdSet" id="MyMenuGroup" priority="0x0600">
<Parent guid="guidTopLevelMenuCmdSet" id="TopLevelMenu"/>
</Group>
Karena merupakan bagian dari menu, grup ini biasanya akan berisi perintah. Namun, itu juga bisa berisi menu lain. Ini adalah bagaimana submenu didefinisikan, seperti yang ditunjukkan dalam contoh berikut.
<Menu guid="guidTopLevelMenuCmdSet" id="SubMenu" priority="0x0100" type="Menu">
<Parent guid="guidTopLevelMenuCmdSet" id="MyMenuGroup"/>
<Strings>
<ButtonText>Sub Menu</ButtonText>
<CommandName>Sub Menu</CommandName>
</Strings>
</Menu>
Perintah
Perintah yang disediakan untuk IDE didefinisikan sebagai elemen Tombol atau elemen Combo. Untuk muncul pada menu atau bilah alat, perintah harus memiliki grup sebagai induknya.
Tombol
Tombol didefinisikan di bagian Buttons
. Setiap item menu, tombol, atau elemen lain yang diklik pengguna untuk menjalankan satu perintah dianggap sebagai tombol. Beberapa jenis tombol juga dapat menyertakan fungsionalitas daftar. Tombol memiliki atribut wajib dan opsional yang sama dengan yang dimiliki menu, dan juga dapat memiliki elemen Ikon yang menentukan GUID dan ID bitmap yang mewakili tombol dalam IDE. Untuk informasi selengkapnya tentang tombol dan atributnya, lihat dokumentasi elemen Tombol.
Tombol dalam contoh berikut adalah anak dari grup dalam contoh sebelumnya, dan akan muncul di IDE sebagai item menu pada menu induk grup tersebut.
<Button guid="guidTopLevelMenuCmdSet" id="cmdidTestCommand" priority="0x0100" type="Button">
<Parent guid="guidTopLevelMenuCmdSet" id="MyMenuGroup" />
<Icon guid="guidImages" id="bmpPic1" />
<Strings>
<CommandName>cmdidTestCommand</CommandName>
<ButtonText>Test Command</ButtonText>
</Strings>
</Button>
Combo
Kombo didefinisikan di bagian Combos
. Setiap Combo
elemen mewakili kotak daftar drop-down di IDE. Kotak daftar mungkin atau mungkin tidak dapat ditulis oleh pengguna, tergantung pada nilai type
atribut kombo. Kombo memiliki elemen dan perilaku yang sama dengan yang dimiliki tombol, dan juga dapat memiliki atribut tambahan berikut:
Atribut
defaultWidth
yang menentukan lebar piksel.Atribut
idCommandList
yang menentukan daftar yang berisi item yang ditampilkan dalam kotak daftar. Daftar perintah harus dideklarasikan dalam simpul yang samaGuidSymbol
yang berisi kombo.
Contoh berikut mendefinisikan elemen kombo.
<Combos>
<Combo guid="guidFirstToolWinCmdSet"
id="cmdidWindowsMediaFilename"
priority="0x0100" type="DynamicCombo"
idCommandList="cmdidWindowsMediaFilenameGetList"
defaultWidth="130">
<Parent guid="guidFirstToolWinCmdSet"
id="ToolbarGroupID" />
<CommandFlag>IconAndText</CommandFlag>
<CommandFlag>CommandWellOnly</CommandFlag>
<CommandFlag>StretchHorizontally</CommandFlag>
<Strings>
<CommandName>Filename</CommandName>
<ButtonText>Enter a Filename</ButtonText>
</Strings>
</Combo>
</Combos>
Bitmap
Perintah yang akan ditampilkan bersama dengan ikon harus menyertakan Icon
elemen yang mengacu pada bitmap dengan menggunakan GUID dan ID-nya. Setiap bitmap didefinisikan sebagai elemen Bitmap di bagian .Bitmaps
Satu-satunya atribut yang Bitmap
diperlukan untuk definisi adalah guid
dan href
, yang menunjuk ke file sumber. Jika file sumber adalah strip sumber daya, atribut usedList juga diperlukan, untuk mencantumkan gambar yang tersedia di strip. Untuk informasi selengkapnya, lihat dokumentasi elemen Bitmap.
Orangtua
Aturan berikut mengatur bagaimana item dapat memanggil item lain sebagai induknya.
Elemen | Ditentukan di bagian Tabel Perintah ini | Dapat dimuat (sebagai induk, atau berdasarkan penempatan di bagian CommandPlacements , atau keduanya) |
Mungkin berisi (disebut sebagai induk) |
---|---|---|---|
Grupkan | Elemen Grup, IDE, VSPackages lainnya | Menu, grup, item itu sendiri | Menu, grup, dan perintah |
Menu | Elemen menu, IDE, VSPackages lainnya | Grup 1 ke n | Grup 0 ke n |
Toolbar | Elemen menu, IDE, VSPackages lainnya | Item itu sendiri | Grup 0 ke n |
Item menu | Elemen tombol, IDE, VSPackages lainnya | Grup 1 hingga n , item itu sendiri | -0 ke grup n |
Tombol | Elemen tombol, IDE, VSPackages lainnya | Grup 1 hingga n , item itu sendiri | |
Kombo | Elemen combos, IDE, VSPackages lainnya | Grup 1 hingga n , item itu sendiri |
Penempatan menu, perintah, dan grup
Menu, grup, atau perintah dapat muncul di lebih dari satu lokasi di IDE. Agar item muncul di beberapa lokasi, item harus ditambahkan ke bagian CommandPlacements
sebagai elemen CommandPlacement. Menu, grup, atau perintah apa pun dapat ditambahkan sebagai penempatan perintah. Namun, toolbar tidak dapat diposisikan dengan cara ini karena tidak dapat muncul di beberapa lokasi sensitif konteks.
Penempatan perintah memiliki guid
atribut , id
, dan priority
. GUID dan ID harus cocok dengan item yang diposisikan. Atribut priority
mengatur penempatan item sehubungan dengan item lain. Ketika IDE menggabungkan dua item atau lebih yang memiliki prioritas yang sama, penempatannya tidak terdefinisi karena IDE tidak menjamin bahwa sumber daya paket dibaca dalam urutan yang sama setiap kali paket dibuat.
Jika menu atau grup muncul di beberapa lokasi, semua turunan menu atau grup tersebut akan muncul di setiap instans.
Visibilitas dan konteks perintah
Ketika beberapa VSPackages diinstal, profusi menu, item menu, dan toolbar dapat mengacaukan IDE. Untuk menghindari masalah ini, Anda dapat mengontrol visibilitas elemen UI individual dengan menggunakan batasan visibilitas dan bendera perintah.
Batasan visibilitas
Batasan visibilitas diatur sebagai elemen VisibilityItem di bagian .VisibilityConstraints
Batasan visibilitas menentukan konteks UI tertentu di mana item target terlihat. Menu atau perintah yang disertakan di bagian ini hanya terlihat ketika salah satu konteks yang ditentukan aktif. Jika menu atau perintah tidak dirujuk di bagian ini, menu atau perintah selalu terlihat secara default. Bagian ini tidak berlaku untuk grup.
VisibilityItem
elemen harus memiliki tiga atribut, sebagai berikut: guid
dan id
dari elemen UI target, dan context
. Atribut context
menentukan kapan item target akan terlihat, dan mengambil konteks UI yang valid sebagai nilainya. Konstanta konteks UI untuk Visual Studio adalah anggota VSConstants kelas. Setiap VisibilityItem
elemen hanya dapat mengambil satu nilai konteks. Untuk menerapkan konteks kedua, buat elemen kedua VisibilityItem
yang menunjuk ke item yang sama, seperti yang ditunjukkan dalam contoh berikut.
<VisibilityConstraints>
<VisibilityItem guid="guidSolutionToolbarCmdSet"
id="cmdidTestCmd"
context="UICONTEXT_SolutionHasSingleProject" />
<VisibilityItem guid="guidSolutionToolbarCmdSet"
id="cmdidTestCmd"
context="UICONTEXT_SolutionHasMultipleProjects" />
</VisibilityConstraints>
Bendera perintah
Bendera perintah berikut dapat memengaruhi visibilitas menu dan perintah yang diterapkan.
AlwaysCreate
Menu dibuat meskipun tidak memiliki grup atau tombol.
Valid untuk: Menu
CommandWellOnly
Terapkan bendera ini jika perintah tidak muncul di menu tingkat atas dan Anda ingin membuatnya tersedia untuk kustomisasi shell tambahan, misalnya, mengikatnya ke kunci. Setelah VSPackage diinstal, pengguna dapat menyesuaikan perintah ini dengan membuka kotak dialog Opsi lalu mengedit penempatan perintah di bawah kategori Lingkungan Keyboard. Tidak memengaruhi penempatan pada menu pintasan, toolbar, pengontrol menu, atau submenu.
Berlaku untuk: Button
, Combo
DefaultDisabled
Secara default, perintah dinonaktifkan jika VSPackage yang mengimplementasikan perintah tidak dimuat atau metode QueryStatus belum dipanggil.
Berlaku untuk: Button
, Combo
DefaultInvisible
Secara default, perintah tidak terlihat jika VSPackage yang mengimplementasikan perintah tidak dimuat atau metode QueryStatus belum dipanggil.
Harus dikombinasikan dengan DynamicVisibility
bendera.
Berlaku untuk: Button
, Combo
, Menu
DynamicVisibility
Visibilitas perintah dapat diubah dengan menggunakan QueryStatus
metode atau GUID konteks yang disertakan dalam bagian VisibilityConstraints
.
Berlaku untuk perintah yang muncul pada menu, bukan pada bilah alat. Item toolbar tingkat atas dapat dinonaktifkan, tetapi tidak tersembunyi, ketika OLECMDF_INVISIBLE
bendera dikembalikan dari QueryStatus
metode .
Pada menu, bendera ini juga menunjukkan bahwa bendera ini harus secara otomatis disembunyikan ketika anggotanya disembunyikan. Bendera ini biasanya ditetapkan ke submenu karena menu tingkat atas sudah memiliki perilaku ini.
Harus dikombinasikan dengan DefaultInvisible
bendera.
Berlaku untuk: Button
, Combo
, Menu
NoShowOnMenuController
Jika perintah yang memiliki bendera ini diposisikan pada pengontrol menu, perintah tidak muncul di daftar drop-down.
Valid untuk: Button
Untuk informasi selengkapnya tentang bendera perintah, lihat dokumentasi elemen CommandFlag.
Persyaratan umum
Perintah Anda harus melewati serangkaian pengujian berikut sebelum dapat ditampilkan dan diaktifkan:
Perintah diposisikan dengan benar.
Bendera
DefaultInvisible
tidak diatur.Menu atau bilah alat induk terlihat.
Perintah tidak terlihat karena entri konteks di bagian elemen VisibilityConstraints.
Kode VSPackage yang mengimplementasikan IOleCommandTarget antarmuka menampilkan dan mengaktifkan perintah Anda. Tidak ada kode antarmuka yang mencegatnya dan bertindak di atasnya.
Saat pengguna mengklik perintah Anda, perintah tersebut menjadi tunduk pada prosedur yang diuraikan dalam algoritma Perutean.
Memanggil perintah yang telah ditentukan sebelumnya
Elemen UsedCommands memungkinkan VSPackages mengakses perintah yang disediakan oleh VSPackages lain atau oleh IDE. Untuk melakukan ini, buat elemen UsedCommand yang memiliki GUID dan ID perintah yang akan digunakan. Ini memastikan bahwa perintah akan dimuat oleh Visual Studio, meskipun itu bukan bagian dari konfigurasi Visual Studio saat ini. Untuk informasi selengkapnya, lihat Elemen UsedCommand.
Tampilan elemen antarmuka
Pertimbangan untuk memilih dan memposisikan elemen perintah adalah sebagai berikut:
Visual Studio menawarkan banyak elemen UI yang muncul secara berbeda tergantung pada penempatan.
Elemen UI yang didefinisikan dengan menggunakan
DefaultInvisible
bendera tidak akan ditampilkan dalam IDE kecuali ditampilkan oleh implementasi QueryStatus VSPackage metode , atau terkait dengan konteks UI tertentu di bagian .VisibilityConstraints
Bahkan perintah yang berhasil diposisikan mungkin tidak ditampilkan. Ini karena IDE secara otomatis menyembunyikan atau menampilkan beberapa perintah, tergantung pada antarmuka yang diimplementasikan vsPackage (atau belum). Misalnya, implementasi VSPackage dari beberapa antarmuka build menyebabkan item menu terkait build ditampilkan secara otomatis.
CommandWellOnly
Menerapkan bendera dalam definisi elemen UI berarti bahwa perintah hanya dapat ditambahkan dengan kustomisasi.Perintah mungkin hanya tersedia dalam konteks UI tertentu, misalnya, hanya ketika kotak dialog ditampilkan saat IDE berada dalam tampilan desain.
Untuk menyebabkan elemen UI tertentu ditampilkan di IDE, Anda harus menerapkan satu atau beberapa antarmuka atau menulis beberapa kode.