Bagikan melalui


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:

    Layanan Gambar Sebelum dan Sesudah

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

    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?

  1. 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.)

  2. Pilih gambar yang diinginkan dan dapatkan monikernya. Gunakan KnownMoniker, atau gunakan gambar dan moniker kustom Anda sendiri.

  3. Tambahkan CrispImages ke XAML Anda. (Lihat contoh di bawah ini.)

  4. 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:

  1. Ganti semua <elemen Gambar> di UI Anda dengan <elemen CrispImage> .

  2. 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.

  3. 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:

  1. 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;
    
  2. 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:

  1. Tab jendela alat saat tab menjadi cukup kecil (juga digunakan di pengalih jendela Tab Ctrl+).

    1. Hapus baris ini (jika ada) di konstruktor untuk kelas yang berasal dari jenis ToolWindowPane :

      this.BitmapResourceID = <Value>;
      this.BitmapIndex = <Value>;
      
    2. Lihat langkah #1 dari bagian "Bagaimana cara menggunakan moniker gambar di jendela alat baru?" di atas.

  2. 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

  1. Terapkan VSHPROPID_SupportsIconMonikers pada IVsHierarchy proyek, dan kembalikan true.

  2. 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).

  3. 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

  4. Terapkan dan ekspor antarmuka IProjectTreeModifier dalam sistem proyek Anda.

  5. Tentukan KnownMoniker atau moniker gambar kustom mana yang ingin Anda gunakan.

  6. 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());
    
  7. 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.

  1. Jalankan alat ManifestFromResources , lewati strip gambar. Ini akan menghasilkan manifes untuk strip.

    • Disarankan: berikan nama non default untuk manifes agar sesuai dengan penggunaannya.
  2. 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.
  3. 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.
  4. 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

  1. Tentukan set KnownMonikers yang cocok dengan gambar di strip gambar Anda, atau buat moniker Anda sendiri untuk gambar di strip gambar Anda.

  2. Perbarui pemetaan apa pun yang Anda gunakan untuk mendapatkan gambar pada indeks yang diperlukan di strip gambar untuk menggunakan moniker sebagai gantinya.

  3. 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