Layanan dan katalog gambar
Buku masak ini berisi panduan dan praktik terbaik untuk mengadopsi Visual Studio Image Service dan Image Catalog yang diperkenalkan di Visual Studio 2015.
Layanan gambar yang diperkenalkan di Visual Studio 2015 memungkinkan pengembang mendapatkan gambar terbaik untuk perangkat dan tema yang dipilih pengguna untuk menampilkan gambar, termasuk memperbaiki tema untuk konteks di mana mereka ditampilkan. Mengadopsi layanan gambar akan membantu menghilangkan titik nyeri utama yang terkait dengan pemeliharaan aset, penskalaan HDPI, dan tema.
Masalah hari ini | Solusi |
---|---|
Perpaduan warna latar belakang | Campuran alfa bawaan |
Gambar tema (beberapa) | Metadata tema |
Mode Kontras Tinggi | Sumber daya Kontras Tinggi Alternatif |
Membutuhkan beberapa sumber daya untuk mode DPI yang berbeda | Sumber daya yang dapat dipilih dengan fallback berbasis vektor |
Gambar duplikat | Satu pengidentifikasi per konsep gambar |
Mengapa mengadopsi layanan gambar?
Selalu dapatkan gambar "sempurna piksel" terbaru dari Visual Studio
Anda dapat mengirimkan dan menggunakan gambar Anda sendiri
Tidak perlu menguji gambar Anda ketika Windows menambahkan penskalakan DPI baru
Mengatasi rintangan arsitektur lama dalam implementasi Anda
Toolbar shell Visual Studio sebelum dan sesudah menggunakan layanan gambar:
Cara kerjanya
Layanan gambar dapat menyediakan gambar bitmapped yang cocok untuk kerangka kerja UI yang didukung:
WPF: BitmapSource
WinForms: System.Drawing.Bitmap
Win32: HBITMAP
Diagram alur layanan gambar
Moniker gambar
Moniker gambar (atau moniker singkatnya) adalah pasangan GUID/ID yang secara unik mengidentifikasi aset gambar atau aset daftar gambar di pustaka gambar.
Moniker yang diketahui
Kumpulan moniker gambar yang terkandung dalam Katalog Gambar Visual Studio dan dapat dikonsumsi secara publik oleh komponen atau ekstensi Visual Studio apa pun.
File manifes gambar
File manifes gambar (.imagemanifest) adalah file XML yang menentukan sekumpulan aset gambar, moniker yang mewakili aset tersebut, dan gambar atau gambar nyata yang mewakili setiap aset. Manifes gambar dapat menentukan gambar mandiri atau daftar gambar untuk dukungan UI warisan. Selain itu, ada atribut yang dapat diatur baik pada aset atau pada gambar individual di belakang setiap aset untuk mengubah kapan dan bagaimana aset tersebut ditampilkan.
Skema manifes gambar
Manifes gambar lengkap terlihat seperti ini:
<ImageManifest>
<!-- zero or one Symbols elements -->
<Symbols>
<!-- zero or more Import, Guid, ID, or String elements -->
</Symbols>
<!-- zero or one Images elements -->
<Images>
<!-- zero or more Image elements -->
</Images>
<!-- zero or one ImageLists elements -->
<ImageLists>
<!-- zero or more ImageList elements -->
</ImageLists>
</ImageManifest>
Simbol
Sebagai bantuan keterbacaan dan pemeliharaan, manifes gambar dapat menggunakan simbol untuk nilai atribut. Simbol didefinisikan seperti ini:
<Symbols>
<Import Manifest="manifest" />
<Guid Name="ShellCommandGuid" Value="8ee4f65d-bab4-4cde-b8e7-ac412abbda8a" />
<ID Name="cmdidSaveAll" Value="1000" />
<String Name="AssemblyName" Value="Microsoft.VisualStudio.Shell.UI.Internal" />
<!-- If your assembly is strongly named, you'll need the version and public key token as well -->
<!-- <String Name="AssemblyName" Value="Microsoft.VisualStudio.Shell.UI.Internal;v17.0.0.0;b03f5f7f11d50a3a" /> -->
</Symbols>
Subelemen | Definisi |
---|---|
Impor | Mengimpor simbol file manifes yang diberikan untuk digunakan dalam manifes saat ini |
Guid | Simbol mewakili GUID dan harus cocok dengan pemformatan GUID |
ID | Simbol mewakili ID dan harus berupa bilangan bulat nonnegatif |
String | Simbol mewakili nilai string arbitrer |
Simbol peka huruf besar/kecil, dan dirujuk menggunakan sintaks $(symbol-name):
<Image Guid="$(ShellCommandGuid)" ID="$(cmdidSaveAll)" >
<Source Uri="/$(AssemblyName);Component/Resources/image.xaml" />
</Image>
Beberapa simbol telah ditentukan sebelumnya untuk semua manifes. Ini dapat digunakan dalam atribut Uri dari <elemen Sumber> atau <Impor> ke jalur referensi pada komputer lokal.
Simbol | Keterangan |
---|---|
CommonProgramFiles | Nilai variabel lingkungan %CommonProgramFiles% |
LocalAppData | Nilai variabel lingkungan %LocalAppData% |
ManifestFolder | Folder yang berisi file manifes |
MyDocuments | Jalur lengkap folder Dokumen Saya pengguna saat ini |
ProgramFiles | Nilai variabel lingkungan %ProgramFiles% |
Sistem | Folder Windows\System32 |
WinDir | Nilai variabel lingkungan %WinDir% |
Gambar
Elemen <Gambar> mendefinisikan gambar yang dapat dirujuk oleh moniker. GUID dan ID yang diambil bersama-sama membentuk moniker gambar. Moniker untuk gambar harus unik di seluruh pustaka gambar. Jika lebih dari satu gambar memiliki moniker tertentu, yang pertama ditemui saat membangun pustaka adalah gambar yang dipertahankan.
Ini harus berisi setidaknya satu sumber. Sumber ukuran netral akan memberikan hasil terbaik di berbagai ukuran, tetapi tidak diperlukan. Jika layanan dimintai gambar ukuran yang tidak ditentukan dalam <elemen Gambar> dan tidak ada sumber netral ukuran, layanan akan memilih sumber khusus ukuran terbaik dan menskalakannya ke ukuran yang diminta.
<Image Guid="guid" ID="int" AllowColorInversion="true/false">
<Source ... />
<!-- optional additional Source elements -->
</Image>
Atribut | Definisi |
---|---|
Guid | [Diperlukan] Bagian GUID dari moniker gambar |
ID | [Diperlukan] Bagian ID dari moniker gambar |
AllowColorInversion | [Opsional, default true] Menunjukkan apakah gambar dapat memiliki warna terbalik secara terprogram saat digunakan pada latar belakang gelap. |
Sumber
Elemen <Sumber> mendefinisikan satu aset sumber gambar (XAML dan PNG).
<Source Uri="uri" Background="background">
<!-- optional NativeResource element -->
</Source>
Atribut | Definisi |
---|---|
Uri | [Diperlukan] URI yang menentukan dari mana gambar dapat dimuat. Bisa jadi salah satu dari yang berikut: - URI Paket menggunakan otoritas application:/// - Referensi sumber daya komponen absolut - Jalur ke file yang berisi sumber daya asli |
Latar belakang | [Opsional] Menunjukkan apa di jenis latar belakang sumber yang dimaksudkan untuk digunakan. Bisa jadi salah satu dari yang berikut: Cahaya: Sumber dapat digunakan pada latar belakang yang terang. Gelap: Sumber dapat digunakan pada latar belakang gelap. HighContrast: Sumber dapat digunakan pada latar belakang apa pun dalam mode Kontras Tinggi. HighContrastLight: Sumber dapat digunakan pada latar belakang terang dalam mode Kontras Tinggi. HighContrastDark: Sumber dapat digunakan pada latar belakang gelap dalam mode Kontras Tinggi. Jika atribut Latar Belakang dihilangkan, sumber dapat digunakan di latar belakang apa pun. Jika Latar Belakang Terang, Gelap, HighContrastLight, atau HighContrastDark, warna sumber tidak pernah terbalik. Jika Latar Belakang dihilangkan atau diatur ke HighContrast, inversi warna sumber dikontrol oleh atribut AllowColorInversion gambar. |
<Elemen Sumber> dapat memiliki salah satu subelemen opsional berikut:
Elemen | Atribut (semua diperlukan) | Definisi |
---|---|---|
<Ukuran> | Nilai | Sumber akan digunakan untuk gambar dengan ukuran yang diberikan (dalam unit perangkat). Gambar akan persegi. |
<SizeRange> | MinSize, MaxSize | Sumber akan digunakan untuk gambar dari MinSize ke MaxSize (dalam unit perangkat) secara inklusif. Gambar akan persegi. |
<Dimensi> | Lebar, Tinggi | Sumber akan digunakan untuk gambar lebar dan tinggi yang diberikan (dalam unit perangkat). |
<DimensionRange> | MinWidth, MinHeight, MaxWidth, MaxHeight |
Sumber akan digunakan untuk gambar dari lebar/tinggi minimum hingga lebar/tinggi maksimum (dalam unit perangkat) secara inklusif. |
<Elemen Sumber> juga dapat memiliki subelemen NativeResource> opsional<, yang menentukan <Sumber> yang dimuat dari rakitan asli daripada rakitan terkelola.
<NativeResource Type="type" ID="int" />
Atribut | Definisi |
---|---|
Jenis | [Diperlukan] Jenis sumber daya asli, baik XAML atau PNG |
ID | [Diperlukan] Bagian ID bilangan bulat dari sumber daya asli |
Daftar Gambar
Elemen <ImageList> mendefinisikan kumpulan gambar yang dapat dikembalikan dalam satu strip. Strip ini dibangun sesuai permintaan, sesuai kebutuhan.
<ImageList>
<ContainedImage Guid="guid" ID="int" External="true/false" />
<!-- optional additional ContainedImage elements -->
</ImageList>
Atribut | Definisi |
---|---|
Guid | [Diperlukan] Bagian GUID dari moniker gambar |
ID | [Diperlukan] Bagian ID dari moniker gambar |
Eksternal | [Opsional, default false] Menunjukkan apakah gambar moniker mereferensikan gambar dalam manifes saat ini. |
Moniker untuk gambar yang terkandung tidak harus mereferensikan gambar yang ditentukan dalam manifes saat ini. Jika gambar yang terkandung tidak dapat ditemukan di pustaka gambar, gambar tempat penampung kosong akan digunakan di tempatnya.
Menggunakan layanan gambar
Langkah pertama (terkelola)
Untuk menggunakan layanan gambar, Anda perlu menambahkan referensi ke beberapa atau semua rakitan berikut ke proyek Anda:
Microsoft.VisualStudio.ImageCatalog.dll
- Diperlukan jika Anda menggunakan katalog gambar bawaan KnownMonikers.
Microsoft.VisualStudio.Imaging.dll
- Diperlukan jika Anda menggunakan CrispImage dan ImageThemingUtilities di UI WPF Anda.
Microsoft.VisualStudio.Imaging.Interop.14.0.DesignTime.dll
Diperlukan jika Anda menggunakan jenis ImageMoniker dan ImageAttributes .
EmbedInteropTypes harus diatur ke true.
Microsoft.VisualStudio.Shell.Interop.14.0.DesignTime
Diperlukan jika Anda menggunakan jenis IVsImageService2 .
EmbedInteropTypes harus diatur ke true.
Microsoft.VisualStudio.Utilities.dll
- Diperlukan jika Anda menggunakan BrushToColorConverter untuk ImageThemingUtilities.ImageBackgroundColor di UI WPF Anda.
Microsoft.VisualStudio.Shell.<VSVersion.0>
- Diperlukan jika Anda menggunakan jenis IVsUIObject .
Microsoft.VisualStudio.Shell.Interop.10.0.dll
Diperlukan jika Anda menggunakan pembantu UI terkait WinForms.
EmbedInteropTypes harus diatur ke true
Langkah pertama (asli)
Untuk menggunakan layanan gambar, Anda perlu menyertakan beberapa atau semua header berikut ke proyek Anda:
KnownImageIds.h
- Diperlukan jika Anda menggunakan katalog gambar bawaan KnownMonikers, tetapi tidak dapat menggunakan jenis ImageMoniker , seperti saat mengembalikan nilai dari panggilan IVsHierarchy GetGuidProperty atau GetProperty .
KnownMonikers.h
- Diperlukan jika Anda menggunakan katalog gambar bawaan KnownMonikers.
ImageParameters140.h
- Diperlukan jika Anda menggunakan jenis ImageMoniker dan ImageAttributes .
VSShell140.h
- Diperlukan jika Anda menggunakan jenis IVsImageService2 .
ImageThemingUtilities.h
Diperlukan jika Anda tidak dapat membiarkan layanan gambar menangani tema untuk Anda.
Jangan gunakan header ini jika layanan gambar dapat menangani tema gambar Anda.
VsDpiAwareness.h
- Diperlukan jika Anda menggunakan pembantu kesadaran DPI untuk mendapatkan DPI saat ini.
Bagaimana cara menulis UI WPF baru?
Mulailah dengan menambahkan referensi rakitan yang diperlukan di bagian langkah pertama di atas ke proyek Anda. Anda tidak perlu menambahkan semuanya, jadi tambahkan referensi yang Anda butuhkan saja. (Catatan: jika Anda menggunakan atau memiliki akses ke Warna alih-alih Brush, maka Anda dapat melewati referensi ke Utilitas, karena Anda tidak akan memerlukan pengonversi.)
Pilih gambar yang diinginkan dan dapatkan monikernya. Gunakan KnownMoniker, atau gunakan gambar dan moniker kustom Anda sendiri.
Tambahkan CrispImages ke XAML Anda. (Lihat contoh di bawah ini.)
Atur properti ImageThemingUtilities.ImageBackgroundColor di hierarki UI Anda. (Ini harus diatur di lokasi di mana warna latar belakang diketahui, belum tentu pada CrispImage.) (Lihat contoh di bawah ini.)
<Window
x:Class="WpfApplication.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:imaging="clr-namespace:Microsoft.VisualStudio.Imaging;assembly=Microsoft.VisualStudio.Imaging"
xmlns:theming="clr-namespace:Microsoft.VisualStudio.PlatformUI;assembly=Microsoft.VisualStudio.Imaging"
xmlns:utilities="clr-namespace:Microsoft.VisualStudio.PlatformUI;assembly=Microsoft.VisualStudio.Utilities"
xmlns:catalog="clr-namespace:Microsoft.VisualStudio.Imaging;assembly=Microsoft.VisualStudio.ImageCatalog"
Title="MainWindow" Height="350" Width="525" UseLayoutRounding="True">
<Window.Resources>
<utilities:BrushToColorConverter x:Key="BrushToColorConverter"/>
</Window.Resources>
<StackPanel Background="White" VerticalAlignment="Center"
theming:ImageThemingUtilities.ImageBackgroundColor="{Binding Background, RelativeSource={RelativeSource Self}, Converter={StaticResource BrushToColorConverter}}">
<imaging:CrispImage Width="16" Height="16" Moniker="{x:Static catalog:KnownMonikers.MoveUp}" />
</StackPanel>
</Window>
Bagaimana cara memperbarui UI WPF yang ada?
Memperbarui WPF UI yang ada adalah proses yang relatif sederhana yang terdiri dari tiga langkah dasar:
Ganti semua <elemen Gambar> di UI Anda dengan <elemen CrispImage> .
Ubah semua atribut Sumber menjadi atribut Moniker.
Jika gambar tidak pernah berubah dan Anda menggunakan KnownMonikers, maka secara statis mengikat properti tersebut ke KnownMoniker. (Lihat contoh di atas.)
Jika gambar tidak pernah berubah dan Anda menggunakan gambar kustom Anda sendiri, maka secara statis mengikat moniker Anda sendiri.
Jika gambar dapat berubah, ikat atribut Moniker ke properti kode yang memberi tahu perubahan properti.
Di suatu tempat dalam hierarki UI, atur ImageThemingUtilities.ImageBackgroundColor untuk memastikan inversi warna berfungsi dengan benar.
- Ini mungkin memerlukan penggunaan kelas BrushToColorConverter . (Lihat contoh di atas.)
Bagaimana cara memperbarui UI Win32?
Tambahkan yang berikut ke kode Anda di mana pun sesuai untuk menggantikan pemuatan gambar mentah. Alihkan nilai untuk mengembalikan HBITMAP versus HICON versus HIMAGELIST sesuai kebutuhan.
Mendapatkan layanan gambar
CComPtr<IVsImageService2> spImgSvc;
CGlobalServiceProvider::HrQueryService(SID_SVsImageService, &spImgSvc);
Meminta gambar
UINT dpiX, dpiY;
HWND hwnd = // get the HWND where the image will be displayed
VsUI::CDpiAwareness::GetDpiForWindow(hwnd, &dpiX, &dpiY);
ImageAttributes attr = { 0 };
attr.StructSize = sizeof(attributes);
attr.Format = DF_Win32;
// IT_Bitmap for HBITMAP, IT_Icon for HICON, IT_ImageList for HIMAGELIST
attr.ImageType = IT_Bitmap;
attr.LogicalWidth = 16;
attr.LogicalHeight = 16;
attr.Dpi = dpiX;
// Desired RGBA color, if you don't use this, don't set IAF_Background below
attr.Background = 0xFFFFFFFF;
attr.Flags = IAF_RequiredFlags | IAF_Background;
CComPtr<IVsUIObject> spImg;
// Replace this KnownMoniker with your desired ImageMoniker
spImgSvc->GetImage(KnownMonikers::Blank, attributes, &spImg);
Bagaimana cara memperbarui UI WinForms?
Tambahkan yang berikut ke kode Anda di mana pun sesuai untuk menggantikan pemuatan gambar mentah. Alihkan nilai untuk mengembalikan Bitmap versus Ikon sesuai kebutuhan.
Berguna menggunakan pernyataan
using GelUtilities = Microsoft.Internal.VisualStudio.PlatformUI.Utilities;
Mendapatkan layanan gambar
// This or your preferred way of querying for Visual Studio services
IVsImageService2 imageService = (IVsImageService2)Package.GetGlobalService(typeof(SVsImageService));
Meminta gambar
Control control = // get the control where the image will be displayed
ImageAttributes attributes = new ImageAttributes
{
StructSize = Marshal.SizeOf(typeof(ImageAttributes)),
// IT_Bitmap for Bitmap, IT_Icon for Icon, IT_ImageList for ImageList
ImageType = (uint)_UIImageType.IT_Bitmap,
Format = (uint)_UIDataFormat.DF_WinForms,
LogicalWidth = 16,
LogicalHeight = 16,
Dpi = (int)DpiAwareness.GetWindowDpi(control.Handle);
// Desired RGBA color, if you don't use this, don't set IAF_Background below
Background = 0xFFFFFFFF,
Flags = unchecked((uint)_ImageAttributesFlags.IAF_RequiredFlags | _ImageAttributesFlags.IAF_Background),
};
// Replace this KnownMoniker with your desired ImageMoniker
IVsUIObject uIObj = imageService.GetImage(KnownMonikers.Blank, attributes);
Bitmap bitmap = (Bitmap)GelUtilities.GetObjectData(uiObj); // Use this if you need a bitmap
// Icon icon = (Icon)GelUtilities.GetObjectData(uiObj); // Use this if you need an icon
Bagaimana cara menggunakan moniker gambar di jendela alat baru?
Templat proyek paket VSIX diperbarui untuk Visual Studio 2015. Untuk membuat jendela alat baru, klik kanan pada proyek VSIX dan pilih Tambahkan>Item Baru (Ctrl+Shift+A). Di bawah simpul Ekstensibilitas untuk bahasa proyek, pilih Jendela Alat Kustom, beri nama jendela alat, dan tekan tombol Tambahkan .
Ini adalah tempat utama untuk menggunakan moniker di jendela alat. Ikuti instruksi untuk masing-masing:
Tab jendela alat saat tab menjadi cukup kecil (juga digunakan di pengalih jendela Tab Ctrl+).
Tambahkan baris ini ke konstruktor untuk kelas yang berasal dari jenis ToolWindowPane :
// Replace this KnownMoniker with your desired ImageMoniker this.BitmapImageMoniker = KnownMonikers.Blank;
Perintah untuk membuka jendela alat.
.vsct
Dalam file untuk paket, edit tombol perintah jendela alat:<Button guid="guidPackageCmdSet" id="CommandId" priority="0x0100" type="Button"> <Parent guid="guidSHLMainMenu" id="IDG_VS_WNDO_OTRWNDWS1"/> <!-- Replace this KnownMoniker with your desired ImageMoniker --> <Icon guid="ImageCatalogGuid" id="Blank" /> <!-- Add this --> <CommandFlag>IconIsMoniker</CommandFlag> <Strings> <ButtonText>MyToolWindow</ButtonText> </Strings> </Button>
Pastikan hal berikut ini juga ada di bagian atas file, setelah
<Extern>
elemen:<Include href="KnownImageIds.vsct"/>
Bagaimana cara menggunakan moniker gambar di jendela alat yang ada?
Memperbarui jendela alat yang ada untuk menggunakan moniker gambar mirip dengan langkah-langkah untuk membuat jendela alat baru.
Ini adalah tempat utama untuk menggunakan moniker di jendela alat. Ikuti instruksi untuk masing-masing:
Tab jendela alat saat tab menjadi cukup kecil (juga digunakan di pengalih jendela Tab Ctrl+).
Hapus baris ini (jika ada) di konstruktor untuk kelas yang berasal dari jenis ToolWindowPane :
this.BitmapResourceID = <Value>; this.BitmapIndex = <Value>;
Lihat langkah #1 dari bagian "Bagaimana cara menggunakan moniker gambar di jendela alat baru?" di atas.
Perintah untuk membuka jendela alat.
- Lihat langkah #2 dari bagian "Bagaimana cara menggunakan moniker gambar di jendela alat baru?" di atas.
Bagaimana cara menggunakan moniker gambar dalam file .vsct?
Perbarui file Anda .vsct
seperti yang ditunjukkan oleh baris yang dikomentari di bawah ini:
<?xml version="1.0" encoding="utf-8"?>
<CommandTable xmlns="http://schemas.microsoft.com/VisualStudio/2005-10-18/CommandTable" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<!-- Include the definitions for images included in the VS image catalog -->
<Include href="KnownImageIds.vsct"/>
<Commands package="guidMyPackage">
<Buttons>
<Button guid="guidMyCommandSet" id="cmdidMyCommand" priority="0x0000" type="Button">
<!-- Add an Icon element, changing the attributes to match the image moniker you want to use.
In this case, we're using the Guid for the VS image catalog.
Change the id attribute to be the ID of the desired image moniker. -->
<Icon guid="ImageCatalogGuid" id="OpenFolder" />
<CommandFlag>DynamicVisibility</CommandFlag>
<CommandFlag>DefaultInvisible</CommandFlag>
<CommandFlag>DefaultDisabled</CommandFlag>
<CommandFlag>CommandWellOnly</CommandFlag>
<CommandFlag>IconAndText</CommandFlag>
<!-- Add the IconIsMoniker CommandFlag -->
<CommandFlag>IconIsMoniker</CommandFlag>
<Strings>
<ButtonText>Quick Fixes...</ButtonText>
<CommandName>Show Quick Fixes</CommandName>
<CanonicalName>ShowQuickFixes</CanonicalName>
<LocCanonicalName>ShowQuickFixes</LocCanonicalName>
</Strings>
</Button>
</Buttons>
</Commands>
<!-- It is recommended that you remove <Bitmap> elements that are no longer used in the vsct file -->
<Symbols>
<GuidSymbol name="guidMyPackage" value="{1491e936-6ffe-474e-8371-30e5920d8fdd}" />
<GuidSymbol name="guidMyCommandSet" value="{10347de4-69a9-47f4-a950-d3301f6d2bc7}">
<IDSymbol name="cmdidMyCommand" value="0x9437" />
</GuidSymbol>
</Symbols>
</CommandTable>
Bagaimana jika file .vsct saya juga perlu dibaca oleh versi Visual Studio yang lebih lama?
Versi Lama Visual Studio tidak mengenali bendera perintah IconIsMoniker . Anda dapat menggunakan gambar dari layanan gambar pada versi Visual Studio yang mendukungnya, tetapi terus menggunakan gambar gaya lama pada versi Visual Studio yang lebih lama. Untuk melakukan ini, Anda akan membiarkan .vsct
file tidak berubah (dan karena itu kompatibel dengan versi Visual Studio yang lebih lama), dan membuat file CSV (nilai yang dipisahkan koma) yang memetakan dari pasangan GUID/ID yang ditentukan dalam .vsct
elemen Bitmaps> file <ke pasangan GUID/ID moniker gambar.
Format file CSV pemetaan adalah:
Icon guid, Icon id, Moniker guid, Moniker id
b714fcf7-855e-4e4c-802a-1fd87144ccad,1,fda30684-682d-421c-8be4-650a2967058e,100
b714fcf7-855e-4e4c-802a-1fd87144ccad,2,fda30684-682d-421c-8be4-650a2967058e,200
File CSV disebarkan dengan paket dan lokasinya ditentukan oleh properti IconMappingFilename dari atribut paket ProvideMenuResource :
[ProvideMenuResource("MyPackage.ctmenu", 1, IconMappingFilename="IconMappings.csv")]
IconMappingFilename adalah jalur relatif yang secara implisit berakar pada $PackageFolder$ (seperti pada contoh di atas), atau jalur absolut yang secara eksplisit berakar pada direktori yang ditentukan oleh variabel lingkungan, seperti @"%UserProfile%\dir1\dir2\MyMappingFile.csv".
Bagaimana cara mem-port sistem proyek?
Cara menyediakan ImageMonikers untuk proyek
Terapkan VSHPROPID_SupportsIconMonikers pada IVsHierarchy proyek, dan kembalikan true.
Terapkan VSHPROPID_IconMonikerImageList (jika proyek asli yang digunakan VSHPROPID_IconImgList) atau VSHPROPID_IconMonikerGuid, VSHPROPID_IconMonikerId, VSHPROPID_OpenFolderIconMonikerGuid, VSHPROPID_OpenFolderIconMonikerId (jika proyek asli digunakan VSHPROPID_IconHandle dan VSHPROPID_OpenFolderIconHandle).
Ubah implementasi VSHPROPID asli untuk ikon guna membuat versi ikon "warisan" jika titik ekstensi memintanya. IVsImageService2 menyediakan fungsionalitas yang diperlukan untuk mendapatkan ikon tersebut
Persyaratan tambahan untuk ragam proyek VB/C#
Hanya terapkan VSHPROPID_SupportsIconMonikers jika Anda mendeteksi bahwa proyek Anda adalah rasa terluar. Jika tidak, rasa terluar yang sebenarnya mungkin tidak mendukung moniker gambar pada kenyataannya, dan rasa dasar Anda mungkin secara efektif "menyembunyikan" gambar yang disesuaikan.
Bagaimana cara menggunakan moniker gambar di CPS?
Mengatur gambar kustom di CPS (Common Project System) dapat dilakukan secara manual atau melalui templat item yang dilengkapi dengan Project System Extensibility SDK.
Menggunakan SDK Ekstensibilitas Sistem Proyek
Ikuti instruksi di Menyediakan ikon kustom untuk jenis Jenis/Item Proyek untuk menyesuaikan gambar CPS Anda. Informasi selengkapnya tentang CPS dapat ditemukan di dokumentasi ekstensibilitas Visual Studio Project System
Menggunakan ImageMonikers secara manual
Terapkan dan ekspor antarmuka IProjectTreeModifier dalam sistem proyek Anda.
Tentukan KnownMoniker atau moniker gambar kustom mana yang ingin Anda gunakan.
Dalam metode ApplyModifications, lakukan hal berikut di suatu tempat dalam metode sebelum mengembalikan pohon baru, mirip dengan contoh di bawah ini:
// Replace this KnownMoniker with your desired ImageMoniker tree = tree.SetIcon(KnownMonikers.Blank.ToProjectSystemType());
Jika Anda membuat pohon baru, Anda dapat mengatur gambar kustom dengan meneruskan moniker yang diinginkan ke metode NewTree, mirip dengan contoh di bawah ini:
// Replace this KnownMoniker with your desired ImageMoniker ProjectImageMoniker icon = KnownMonikers.FolderClosed.ToProjectSystemType(); ProjectImageMoniker expandedIcon = KnownMonikers.FolderOpened.ToProjectSystemType(); return this.ProjectTreeFactory.Value.NewTree(/*caption*/<value>, /*filePath*/<value>, /*browseObjectProperties*/<value>, icon, expandedIcon);
Bagaimana cara mengonversi dari strip gambar nyata ke strip gambar berbasis moniker?
Saya perlu mendukung HIMAGELISTs
Jika ada strip gambar yang sudah ada untuk kode yang ingin Anda perbarui untuk menggunakan layanan gambar, tetapi Anda dibatasi oleh API yang memerlukan melewati daftar gambar, Anda masih bisa mendapatkan manfaat dari layanan gambar. Untuk membuat strip gambar berbasis moniker, ikuti langkah-langkah di bawah ini untuk membuat manifes dari moniker yang ada.
Jalankan alat ManifestFromResources , lewati strip gambar. Ini akan menghasilkan manifes untuk strip.
- Disarankan: berikan nama non default untuk manifes agar sesuai dengan penggunaannya.
Jika Anda hanya menggunakan KnownMonikers, lakukan hal berikut:
Ganti bagian <Gambar> dari manifes dengan <Gambar/>.
Hapus semua ID subimage (apa pun dengan <imagestrip name>_##).
Disarankan: ganti nama simbol AssetsGuid dan simbol strip gambar agar sesuai dengan penggunaannya.
Ganti setiap GUID ContainedImage dengan $(ImageCatalogGuid), ganti setiap ID ContainedImage dengan $(<moniker>), dan tambahkan atribut External="true" ke setiap ContainedImage
- <moniker> harus diganti dengan KnownMoniker yang cocok dengan gambar tetapi dengan "KnownMonikers." dihapus dari nama.
Tambahkan <Manifes Impor="$(ManifestFolder)\<Relatif pasang jalur dir ke *>\Microsoft.VisualStudio.ImageCatalog.imagemanifest" /*> ke bagian <atas bagian Simbol> .
- Jalur relatif ditentukan oleh lokasi penyebaran yang ditentukan dalam penulisan penyiapan untuk manifes.
Jalankan alat ManifestToCode untuk menghasilkan pembungkus sehingga kode yang ada memiliki moniker yang dapat digunakan untuk mengkueri layanan gambar untuk strip gambar.
- Disarankan: berikan nama nondefault untuk pembungkus dan namespace agar sesuai dengan penggunaannya.
Lakukan semua penambahan, penyiapan penulisan/penyebaran, dan perubahan kode lainnya untuk bekerja dengan layanan gambar dan file baru.
Manifes sampel termasuk gambar internal dan eksternal untuk melihat seperti apa tampilannya:
<?xml version="1.0"?>
<ImageManifest
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns="http://schemas.microsoft.com/VisualStudio/ImageManifestSchema/2014">
<Symbols>
<!-- This needs to be the relative path from your manifest to the ImageCatalog's manifest
where $(ManifestFolder) is the deployed location of this manifest. -->
<Import Manifest="$(ManifestFolder)\<RelPath>\Microsoft.VisualStudio.ImageCatalog.imagemanifest" />
<String Name="Resources" Value="/My.Assembly.Name;Component/Resources/ImageStrip" />
<Guid Name="ImageGuid" Value="{fb41b7ef-6587-480c-aa27-5b559d42cfc9}" />
<Guid Name="ImageStripGuid" Value="{9c84a570-d9a7-4052-a340-188fb276f973}" />
<ID Name="MyImage_0" Value="100" />
<ID Name="MyImage_1" Value="101" />
<ID Name="InternalList" Value="1001" />
<ID Name="ExternalList" Value="1002" />
</Symbols>
<Images>
<Image Guid="$(ImageGuid)" ID="$(MyImage_0)">
<Source Uri="$(Resources)/MyImage_0.png">
<Size Value="16" />
</Source>
</Image>
<Image Guid="$(ImageGuid)" ID="$(MyImage_1)">
<Source Uri="$(Resources)/MyImage_1.png">
<Size Value="16" />
</Source>
</Image>
</Images>
<ImageLists>
<ImageList Guid="$(ImageStripGuid)" ID="$(InternalList)">
<ContainedImage Guid="$(ImageGuid)" ID="$(MyImage_0)" />
<ContainedImage Guid="$(ImageGuid)" ID="$(MyImage_1)" />
</ImageList>
<ImageList Guid="$(ImageStripGuid)" ID="$(ExternalList)">
<ContainedImage Guid="$(ImageCatalogGuid)" ID="$(StatusError)" External="true" />
<ContainedImage Guid="$(ImageCatalogGuid)" ID="$(StatusWarning)" External="true" />
<ContainedImage Guid="$(ImageCatalogGuid)" ID="$(StatusInformation)" External="true" />
</ImageList>
</ImageLists>
</ImageManifest>
Saya tidak perlu mendukung HIMAGELISTs
Tentukan set KnownMonikers yang cocok dengan gambar di strip gambar Anda, atau buat moniker Anda sendiri untuk gambar di strip gambar Anda.
Perbarui pemetaan apa pun yang Anda gunakan untuk mendapatkan gambar pada indeks yang diperlukan di strip gambar untuk menggunakan moniker sebagai gantinya.
Perbarui kode Anda untuk menggunakan layanan gambar untuk meminta moniker melalui pemetaan yang diperbarui. (Ini mungkin berarti memperbarui ke CrispImages untuk kode terkelola, atau meminta HBITMAP atau HICON dari layanan gambar dan meneruskannya untuk kode asli.)
Menguji gambar Anda
Anda dapat menggunakan alat Penampil Pustaka Gambar untuk menguji manifes gambar Anda untuk memastikan semuanya ditulis dengan benar. Anda dapat menemukan alat di Visual Studio 2015 SDK. Dokumentasi untuk alat ini dan lainnya dapat ditemukan di sini.
Sumber Daya Tambahan:
Sampel
Beberapa sampel Visual Studio di GitHub telah diperbarui untuk menunjukkan cara menggunakan layanan gambar sebagai bagian dari berbagai titik ekstensibilitas Visual Studio.
Periksa http://github.com/Microsoft/VSSDK-Extensibility-Samples
sampel terbaru.
Alat
Sekumpulan alat dukungan untuk Layanan Gambar dibuat untuk membantu dalam membuat/memperbarui UI yang berfungsi dengan Layanan Gambar. Untuk informasi selengkapnya tentang setiap alat, periksa dokumentasi yang disertakan dengan alat. Alat ini disertakan sebagai bagian dari Visual Studio 2015 SDK.
ManifestFromResources
Alat Manifes dari Sumber Daya mengambil daftar sumber daya gambar (PNG atau XAML) dan menghasilkan file manifes gambar untuk menggunakan gambar tersebut dengan layanan gambar.
ManifestToCode
Alat Manifes ke Kode mengambil file manifes gambar dan menghasilkan file pembungkus untuk mereferensikan nilai manifes dalam kode (C++, C#, atau VB) atau .vsct
file.
ImageLibraryViewer
Alat Penampil Pustaka Gambar dapat memuat manifes gambar dan memungkinkan pengguna untuk memanipulasinya dengan cara yang sama seperti Visual Studio untuk memastikan manifes ditulis dengan benar. Pengguna dapat mengubah latar belakang, ukuran, pengaturan DPI, Kontras Tinggi, dan pengaturan lainnya. Ini juga menampilkan informasi pemuatan untuk menemukan kesalahan dalam manifes dan menampilkan informasi sumber untuk setiap gambar dalam manifes.
FAQ
Apakah ada dependensi yang harus Anda sertakan <saat memuat Referensi Include="Microsoft.VisualStudio.*. Interop.14.0.DesignTime" />?
- Atur EmbedInteropTypes="true" pada semua DLL interop.
Bagaimana cara menyebarkan manifes gambar dengan ekstensi saya?
Tambahkan file ke
.imagemanifest
proyek Anda.Atur "Sertakan dalam VSIX" ke True.
Gambar saya masih tidak berfungsi, bagaimana cara mengetahui apa yang salah?
Visual Studio mungkin tidak menemukan manifes gambar Anda. Untuk alasan performa Visual Studio membatasi kedalaman pencarian folder, jadi disarankan agar manifes gambar disimpan di folder akar ekstensi Anda.
Anda mungkin kehilangan informasi rakitan dalam file manifes gambar Anda. Rakitan yang diberi nama kuat memerlukan informasi tambahan agar dapat dimuat oleh Visual Studio. Untuk memuat rakitan bernama kuat, Anda perlu menyertakan (selain nama rakitan) versi rakitan dan token kunci publik di URI sumber daya untuk gambar dalam manifes gambar Anda.
<ImageManifest xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.microsoft.com/VisualStudio/ImageManifestSchema/2014"> <Symbols> <String Name="Resources" Value="/Microsoft.VisualStudio.Shell.UI.Internal;v17.0.0.0;b03f5f7f11d50a3a;Component/Resources" /> ... </Symbols> ... </ImageManifest>
Anda mungkin kehilangan entri basis kode untuk rakitan gambar Anda. Jika assembly Anda belum dimuat pada saat Visual Studio membutuhkannya, Visual Studio perlu mengetahui di mana menemukan assembly Anda untuk memuatnya. Untuk menambahkan basis kode untuk assembly Anda, Anda dapat menggunakan ProvideCodeBaseAttribute untuk memastikan entri basis kode dibuat dan disertakan dalam pkgdef ekstensi Anda.
[assembly: ProvideCodeBase(AssemblyName = "ClassLibrary1", Version = "1.0.0.0", CodeBase = "$PackageFolder$\\ClassLibrary1.dll")]
Jika opsi sebelumnya tidak mengatasi masalah beban gambar Anda, Anda dapat mengaktifkan pengelogan dengan menghilangkan entri berikut ke dalam pkgdef di ekstensi Anda:
[$RootKey$\ImageLibrary] "TraceLevel"="Verbose" "TraceFilename"="ImageLibrary.log"
Ini akan membuat file log yang disebut ImageLibrary.log di folder %UserProfile%. Pastikan untuk menjalankan "devenv /updateConfiguration" dari perintah pengembang setelah menambahkan entri ini ke pkgdef. Ini memastikan bahwa entri pengelogan diaktifkan dan vs me-refresh cache manifes gambar untuk membantu menemukan kesalahan yang mungkin terjadi saat membaca manifes gambar Anda. Jika Anda kemudian menjalankan skenario di mana gambar Anda diharapkan untuk dimuat, file log Anda akan berisi pengelogan pendaftaran dan pengelogan permintaan untuk gambar Anda.
Saya memperbarui Sistem Proyek CPS saya. Apa yang terjadi dengan ImageName dan StockIconService?
Ini dihapus ketika CPS diperbarui untuk menggunakan moniker. Anda tidak perlu lagi memanggil StockIconService, cukup teruskan KnownMoniker yang diinginkan ke metode atau properti menggunakan metode ekstensi ToProjectSystemType() di utilitas CPS. Anda dapat menemukan pemetaan dari ImageName ke KnownMonikers di bawah ini:
ImageName KnownMoniker ImageName.OfflineWebApp KnownImageIds.Web ImageName.WebReferencesFolder KnownImageIds.Web ImageName.OpenReferenceFolder KnownImageIds.FolderOpened ImageName.ReferenceFolder KnownImageIds.Reference ImageName.Reference KnownImageIds.Reference ImageName.SdlWebReference KnownImageIds.WebReferenceFolder ImageName.DiscoWebReference KnownImageIds.DynamicDiscoveryDocument ImageName.Folder KnownImageIds.FolderClosed ImageName.OpenFolder KnownImageIds.FolderOpened ImageName.ExcludedFolder KnownImageIds.HiddenFolderClosed ImageName.OpenExcludedFolder KnownImageIds.HiddenFolderOpened ImageName.ExcludedFile KnownImageIds.HiddenFile ImageName.DependentFile KnownImageIds.GenerateFile ImageName.MissingFile KnownImageIds.DocumentWarning ImageName.WindowsForm KnownImageIds.WindowsForm ImageName.WindowsUserControl KnownImageIds.UserControl ImageName.WindowsComponent KnownImageIds.ComponentFile ImageName.XmlSchema KnownImageIds.XMLSchema ImageName.XmlFile KnownImageIds.XMLFile ImageName.WebForm KnownImageIds.Web ImageName.WebService KnownImageIds.WebService ImageName.WebUserControl KnownImageIds.WebUserControl ImageName.WebCustomUserControl KnownImageIds.WebCustomControl ImageName.AspPage KnownImageIds.ASPFile ImageName.GlobalApplicationClass KnownImageIds.SettingsFile ImageName.WebConfig KnownImageIds.ConfigurationFile ImageName.HtmlPage KnownImageIds.HTMLFile ImageName.StyleSheet KnownImageIds.StyleSheet ImageName.ScriptFile KnownImageIds.JSScript ImageName.TextFile KnownImageIds.Document ImageName.SettingsFile KnownImageIds.Settings ImageName.Resources KnownImageIds.DocumentGroup ImageName.Bitmap KnownImageIds.Image ImageName.Icon KnownImageIds.IconFile ImageName.Image KnownImageIds.Image ImageName.ImageMap KnownImageIds.ImageMapFile ImageName.XWorld KnownImageIds.XWorldFile ImageName.Audio KnownImageIds.Sound ImageName.Video KnownImageIds.Media ImageName.Cab KnownImageIds.CABProject ImageName.Jar KnownImageIds.JARFile ImageName.DataEnvironment KnownImageIds.DataTable ImageName.PreviewFile KnownImageIds.Report ImageName.DanglingReference KnownImageIds.ReferenceWarning ImageName.XsltFile KnownImageIds.XSLTransform ImageName.Cursor KnownImageIds.CursorFile ImageName.AppDesignerFolder KnownImageIds.Property ImageName.Data KnownImageIds.Database ImageName.Application KnownImageIds.Application ImageName.DataSet KnownImageIds.DatabaseGroup ImageName.Pfx KnownImageIds.Certificate ImageName.Snk KnownImageIds.Rule ImageName.VisualBasicProject KnownImageIds.VBProjectNode ImageName.CSharpProject KnownImageIds.CSProjectNode ImageName.Empty KnownImageIds.Blank ImageName.MissingFolder KnownImageIds.FolderOffline ImageName.SharedImportReference KnownImageIds.SharedProject ImageName.SharedProjectCs KnownImageIds.CSSharedProject ImageName.SharedProjectVc KnownImageIds.CPPSharedProject ImageName.SharedProjectJs KnownImageIds.JSSharedProject ImageName.CSharpCodeFile KnownImageIds.CSFileNode ImageName.VisualBasicCodeFile KnownImageIds.VBFileNode
Saya memperbarui penyedia daftar penyelesaian saya. Apa yang cocok dengan nilai StandardGlyphGroup dan StandardGlyph lama?
Nama Nama Nama GlyphGroupClass GlyphItemPublic ClassPublic GlyphGroupClass GlyphItemInternal ClassInternal GlyphGroupClass GlyphItemFriend ClassInternal GlyphGroupClass GlyphItemProtected ClassProtected GlyphGroupClass GlyphItemPrivate ClassPrivate GlyphGroupClass GlyphItemShortcut ClassShortcut GlyphGroupConstant GlyphItemPublic ConstantPublic GlyphGroupConstant GlyphItemInternal ConstantInternal GlyphGroupConstant GlyphItemFriend ConstantInternal GlyphGroupConstant GlyphItemProtected ConstantProtected GlyphGroupConstant GlyphItemPrivate ConstantPrivate GlyphGroupConstant GlyphItemShortcut ConstantShortcut GlyphGroupDelegate GlyphItemPublic DelegasiPublic GlyphGroupDelegate GlyphItemInternal DelegateInternal GlyphGroupDelegate GlyphItemFriend DelegateInternal GlyphGroupDelegate GlyphItemProtected DelegasiLindungi GlyphGroupDelegate GlyphItemPrivate DelegasiPrivate GlyphGroupDelegate GlyphItemShortcut DelegateShortcut GlyphGroupEnum GlyphItemPublic EnumerasiPublik GlyphGroupEnum GlyphItemInternal EnumerationInternal GlyphGroupEnum GlyphItemFriend EnumerationInternal GlyphGroupEnum GlyphItemProtected EnumerationProtected GlyphGroupEnum GlyphItemPrivate EnumerationPrivate GlyphGroupEnum GlyphItemShortcut EnumerationShortcut GlyphGroupEnumMember GlyphItemPublic EnumerationItemPublic GlyphGroupEnumMember GlyphItemInternal EnumerationItemInternal GlyphGroupEnumMember GlyphItemFriend EnumerationItemInternal GlyphGroupEnumMember GlyphItemProtected EnumerationItemProtected GlyphGroupEnumMember GlyphItemPrivate EnumerationItemPrivate GlyphGroupEnumMember GlyphItemShortcut EnumerationItemShortcut GlyphGroupEvent GlyphItemPublic EventPublic GlyphGroupEvent GlyphItemInternal EventInternal GlyphGroupEvent GlyphItemFriend EventInternal GlyphGroupEvent GlyphItemProtected EventProtected GlyphGroupEvent GlyphItemPrivate EventPrivate GlyphGroupEvent GlyphItemShortcut EventShortcut GlyphGroupException GlyphItemPublic ExceptionPublic GlyphGroupException GlyphItemInternal ExceptionInternal GlyphGroupException GlyphItemFriend ExceptionInternal GlyphGroupException GlyphItemProtected ExceptionProtected GlyphGroupException GlyphItemPrivate ExceptionPrivate GlyphGroupException GlyphItemShortcut ExceptionShortcut GlyphGroupField GlyphItemPublic FieldPublic GlyphGroupField GlyphItemInternal FieldInternal GlyphGroupField GlyphItemFriend FieldInternal GlyphGroupField GlyphItemProtected FieldProtected GlyphGroupField GlyphItemPrivate FieldPrivate GlyphGroupField GlyphItemShortcut FieldShortcut GlyphGroupInterface GlyphItemPublic InterfacePublic GlyphGroupInterface GlyphItemInternal InterfaceInternal GlyphGroupInterface GlyphItemFriend InterfaceInternal GlyphGroupInterface GlyphItemProtected InterfaceProtected GlyphGroupInterface GlyphItemPrivate InterfacePrivate GlyphGroupInterface GlyphItemShortcut InterfaceShortcut GlyphGroupMacro GlyphItemPublic MakroPublic GlyphGroupMacro GlyphItemInternal MakroInternal GlyphGroupMacro GlyphItemFriend MakroInternal GlyphGroupMacro GlyphItemProtected MacroProtected GlyphGroupMacro GlyphItemPrivate MacroPrivate GlyphGroupMacro GlyphItemShortcut MacroShortcut GlyphGroupMap GlyphItemPublic MapPublic GlyphGroupMap GlyphItemInternal MapInternal GlyphGroupMap GlyphItemFriend MapInternal GlyphGroupMap GlyphItemProtected MapProtected GlyphGroupMap GlyphItemPrivate MapPrivate GlyphGroupMap GlyphItemShortcut MapShortcut GlyphGroupMapItem GlyphItemPublic MapItemPublic GlyphGroupMapItem GlyphItemInternal MapItemInternal GlyphGroupMapItem GlyphItemFriend MapItemInternal GlyphGroupMapItem GlyphItemProtected MapItemProtected GlyphGroupMapItem GlyphItemPrivate MapItemPrivate GlyphGroupMapItem GlyphItemShortcut MapItemShortcut GlyphGroupMethod GlyphItemPublic MethodPublic GlyphGroupMethod GlyphItemInternal MethodInternal GlyphGroupMethod GlyphItemFriend MethodInternal GlyphGroupMethod GlyphItemProtected MethodProtected GlyphGroupMethod GlyphItemPrivate MethodPrivate GlyphGroupMethod GlyphItemShortcut MethodShortcut GlyphGroupOverload GlyphItemPublic MethodPublic GlyphGroupOverload GlyphItemInternal MethodInternal GlyphGroupOverload GlyphItemFriend MethodInternal GlyphGroupOverload GlyphItemProtected MethodProtected GlyphGroupOverload GlyphItemPrivate MethodPrivate GlyphGroupOverload GlyphItemShortcut MethodShortcut GlyphGroupModule GlyphItemPublic ModulePublic GlyphGroupModule GlyphItemInternal ModuleInternal GlyphGroupModule GlyphItemFriend ModuleInternal GlyphGroupModule GlyphItemProtected ModuleProtected GlyphGroupModule GlyphItemPrivate ModulePrivate GlyphGroupModule GlyphItemShortcut ModuleShortcut GlyphGroupNamespace GlyphItemPublic NamespacePublic GlyphGroupNamespace GlyphItemInternal NamespaceInternal GlyphGroupNamespace GlyphItemFriend NamespaceInternal GlyphGroupNamespace GlyphItemProtected NamespaceProtected GlyphGroupNamespace GlyphItemPrivate NamespacePrivate GlyphGroupNamespace GlyphItemShortcut NamespaceShortcut GlyphGroupOperator GlyphItemPublic OperatorPublic GlyphGroupOperator GlyphItemInternal OperatorInternal GlyphGroupOperator GlyphItemFriend OperatorInternal GlyphGroupOperator GlyphItemProtected Operator Dilindungi GlyphGroupOperator GlyphItemPrivate OperatorPrivate GlyphGroupOperator GlyphItemShortcut OperatorShortcut GlyphGroupProperty GlyphItemPublic PropertyPublic GlyphGroupProperty GlyphItemInternal PropertyInternal GlyphGroupProperty GlyphItemFriend PropertyInternal GlyphGroupProperty GlyphItemProtected PropertyProtected GlyphGroupProperty GlyphItemPrivate PropertyPrivate GlyphGroupProperty GlyphItemShortcut PropertyShortcut GlyphGroupStruct GlyphItemPublic StructurePublic GlyphGroupStruct GlyphItemInternal StructureInternal GlyphGroupStruct GlyphItemFriend StructureInternal GlyphGroupStruct GlyphItemProtected StructureProtected GlyphGroupStruct GlyphItemPrivate StructurePrivate GlyphGroupStruct GlyphItemShortcut StructureShortcut GlyphGroupTemplate GlyphItemPublic TemplatePublic GlyphGroupTemplate GlyphItemInternal TemplateInternal GlyphGroupTemplate GlyphItemFriend TemplateInternal GlyphGroupTemplate GlyphItemProtected Templat Dilindungi GlyphGroupTemplate GlyphItemPrivate TemplatePrivate GlyphGroupTemplate GlyphItemShortcut TemplateShortcut GlyphGroupTypedef GlyphItemPublic TypeDefinitionPublic GlyphGroupTypedef GlyphItemInternal TypeDefinitionInternal GlyphGroupTypedef GlyphItemFriend TypeDefinitionInternal GlyphGroupTypedef GlyphItemProtected TypeDefinitionProtected GlyphGroupTypedef GlyphItemPrivate TypeDefinitionPrivate GlyphGroupTypedef GlyphItemShortcut TypeDefinitionShortcut GlyphGroupType GlyphItemPublic TypePublic GlyphGroupType GlyphItemInternal TypeInternal GlyphGroupType GlyphItemFriend TypeInternal GlyphGroupType GlyphItemProtected TypeProtected GlyphGroupType GlyphItemPrivate TypePrivate GlyphGroupType GlyphItemShortcut TypeShortcut GlyphGroupUnion GlyphItemPublic UnionPublic GlyphGroupUnion GlyphItemInternal UnionInternal GlyphGroupUnion GlyphItemFriend UnionInternal GlyphGroupUnion GlyphItemProtected UnionProtected GlyphGroupUnion GlyphItemPrivate UnionPrivate GlyphGroupUnion GlyphItemShortcut UnionShortcut GlyphGroupVariable GlyphItemPublic FieldPublic GlyphGroupVariable GlyphItemInternal FieldInternal GlyphGroupVariable GlyphItemFriend FieldInternal GlyphGroupVariable GlyphItemProtected FieldProtected GlyphGroupVariable GlyphItemPrivate FieldPrivate GlyphGroupVariable GlyphItemShortcut FieldShortcut GlyphGroupValueType GlyphItemPublic ValueTypePublic GlyphGroupValueType GlyphItemInternal ValueTypeInternal GlyphGroupValueType GlyphItemFriend ValueTypeInternal GlyphGroupValueType GlyphItemProtected ValueTypeProtected GlyphGroupValueType GlyphItemPrivate ValueTypePrivate GlyphGroupValueType GlyphItemShortcut ValueTypeShortcut GlyphGroupIntrinsic GlyphItemPublic ObjectPublic GlyphGroupIntrinsic GlyphItemInternal ObjectInternal GlyphGroupIntrinsic GlyphItemFriend ObjectInternal GlyphGroupIntrinsic GlyphItemProtected ObjectProtected GlyphGroupIntrinsic GlyphItemPrivate ObjectPrivate GlyphGroupIntrinsic GlyphItemShortcut ObjectShortcut GlyphGroupJSharpMethod GlyphItemPublic MethodPublic GlyphGroupJSharpMethod GlyphItemInternal MethodInternal GlyphGroupJSharpMethod GlyphItemFriend MethodInternal GlyphGroupJSharpMethod GlyphItemProtected MethodProtected GlyphGroupJSharpMethod GlyphItemPrivate MethodPrivate GlyphGroupJSharpMethod GlyphItemShortcut MethodShortcut GlyphGroupJSharpField GlyphItemPublic FieldPublic GlyphGroupJSharpField GlyphItemInternal FieldInternal GlyphGroupJSharpField GlyphItemFriend FieldInternal GlyphGroupJSharpField GlyphItemProtected FieldProtected GlyphGroupJSharpField GlyphItemPrivate FieldPrivate GlyphGroupJSharpField GlyphItemShortcut FieldShortcut GlyphGroupJSharpClass GlyphItemPublic ClassPublic GlyphGroupJSharpClass GlyphItemInternal ClassInternal GlyphGroupJSharpClass GlyphItemFriend ClassInternal GlyphGroupJSharpClass GlyphItemProtected ClassProtected GlyphGroupJSharpClass GlyphItemPrivate ClassPrivate GlyphGroupJSharpClass GlyphItemShortcut ClassShortcut GlyphGroupJSharpNamespace GlyphItemPublic NamespacePublic GlyphGroupJSharpNamespace GlyphItemInternal NamespaceInternal GlyphGroupJSharpNamespace GlyphItemFriend NamespaceInternal GlyphGroupJSharpNamespace GlyphItemProtected NamespaceProtected GlyphGroupJSharpNamespace GlyphItemPrivate NamespacePrivate GlyphGroupJSharpNamespace GlyphItemShortcut NamespaceShortcut GlyphGroupJSharpInterface GlyphItemPublic InterfacePublic GlyphGroupJSharpInterface GlyphItemInternal InterfaceInternal GlyphGroupJSharpInterface GlyphItemFriend InterfaceInternal GlyphGroupJSharpInterface GlyphItemProtected InterfaceProtected GlyphGroupJSharpInterface GlyphItemPrivate InterfacePrivate GlyphGroupJSharpInterface GlyphItemShortcut InterfaceShortcut GlyphGroupError StatusError GlyphBscFile ClassFile GlyphAssembly Referensi GlyphLibrary Pustaka GlyphVBProject VBProjectNode GlyphCoolProject CSProjectNode GlyphCppProject CPPProjectNode GlyphDialogId Dialog GlyphOpenFolder FolderBuka GlyphClosedFolder FolderClosed GlyphArrow GoToNext GlyphCSharpFile CSFileNode GlyphCSharpExpansion Cuplikan Kode GlyphKeyword IntellisenseKeyword GlyphInformation StatusInformation GlyphReference ClassMethodReference GlyphRecursion Rekursi GlyphXmlItem Tag GlyphJSharpProject DocumentCollection GlyphJSharpDocument Dokumen GlyphForwardType GoToNext GlyphCallersGraph Panggil Ke GlyphCallGraph CallFrom GlyphWarning StatusWarning GlyphMaybeReference Tanda Tanya GlyphMaybeCaller Panggil Ke GlyphMaybeCall CallFrom GlyphExtensionMethod ExtensionMethod GlyphExtensionMethodInternal ExtensionMethod GlyphExtensionMethodFriend ExtensionMethod GlyphExtensionMethodProtected ExtensionMethod GlyphExtensionMethodPrivate ExtensionMethod GlyphExtensionMethodShortcut ExtensionMethod GlyphXmlAttribute XmlAttribute GlyphXmlChild XmlElement GlyphXmlDescendant XmlDescendant GlyphXmlNamespace XmlNamespace GlyphXmlAttributeQuestion XmlAttributeLowConfidence GlyphXmlAttributeCheck XmlAttributeHighConfidence GlyphXmlChildQuestion XmlElementLowConfidence GlyphXmlChildCheck XmlElementHighConfidence GlyphXmlDescendantQuestion XmlDescendantLowConfidence GlyphXmlDescendantCheck XmlDescendantHighConfidence GlyphCompletionWarning IntellisenseWarning