Поделиться через


Служба образов и каталог

В этой книге содержатся рекомендации и рекомендации по внедрению службы образов и каталога образов Visual Studio, представленного в Visual Studio 2015.

Служба изображений, представленная в Visual Studio 2015, позволяет разработчикам получать лучшие изображения для устройства и выбранной пользователем темы для отображения изображения, включая исправление тем для контекста, в котором они отображаются. Внедрение службы изображений поможет устранить основные точки боли, связанные с обслуживанием активов, масштабированием HDPI и темами.

Проблемы сегодня Решения
Смешение цветов фона Встроенное альфа-смешение
Тематические (некоторые) изображения Метаданные темы
Режим высокой контрастности Альтернативные ресурсы высокой контрастности
Требуется несколько ресурсов для разных режимов DPI Доступные для выбора ресурсы с резервным вариантом на основе векторов
Повторяющиеся изображения Один идентификатор для каждого изображения

Зачем использовать службу образов?

  • Всегда получать последнее изображение "пиксель-идеальный" из Visual Studio

  • Вы можете отправлять и использовать собственные образы

  • Не нужно тестировать образы при добавлении нового масштабирования DPI в Windows

  • Устранение старых архитектурных препятствий в реализации

    Панель инструментов оболочки Visual Studio до и после использования службы образов:

    Служба образов до и после

Принцип работы

Служба образов может предоставить битовое изображение, подходящее для любой поддерживаемой платформы пользовательского интерфейса:

  • WPF: BitmapSource

  • WinForms: System.Drawing.Bitmap

  • Win32: HBITMAP

    Схема потока службы изображений

    Схема потока службы изображений

    Моникеры изображений

    Моникер изображения (или моникер для короткого) — это пара GUID/ID, которая однозначно идентифицирует ресурс изображения или ресурс списка изображений в библиотеке изображений.

    Известные моникеры

    Набор моникеров изображений, содержащихся в каталоге образов Visual Studio и общедоступный доступ к любому компоненту или расширению Visual Studio.

    Файлы манифеста изображения

    Файлы манифеста изображения (.imagemanifest) — это XML-файлы, определяющие набор ресурсов изображений, моникеры, представляющие эти ресурсы, и реальные изображения или изображения, представляющие каждый ресурс. Манифесты изображений могут определять автономные изображения или списки изображений для поддержки устаревшего пользовательского интерфейса. Кроме того, существуют атрибуты, которые можно задать в активе или на отдельных изображениях, стоящих за каждым ресурсом, чтобы изменить время и способ отображения этих ресурсов.

    Схема манифеста изображения

    Полный манифест изображения выглядит следующим образом:

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

Символы

Как помощь в удобочитаемости и обслуживании манифест изображения может использовать символы для значений атрибутов. Символы определяются следующим образом:

<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>
Подэлемента Определение
Import Импортирует символы заданного файла манифеста для использования в текущем манифесте
GUID Символ представляет GUID и должен соответствовать форматированию GUID
Идентификатор Символ представляет идентификатор и должен быть ненужным целым числом.
Строка Символ представляет произвольное строковое значение

Символы чувствительны к регистру и ссылаются на них с помощью синтаксиса $(symbol-name):

<Image Guid="$(ShellCommandGuid)" ID="$(cmdidSaveAll)" >
      <Source Uri="/$(AssemblyName);Component/Resources/image.xaml" />
</Image>

Некоторые символы предопределяются для всех манифестов. Их можно использовать в атрибуте <URI элемента Source> или <Import> для ссылки на пути на локальном компьютере.

Символ Description
CommonProgramFiles Значение переменной среды %CommonProgramFiles%
LocalAppData Значение переменной среды %LocalAppData%
ManifestFolder Папка, содержащая файл манифеста
MyDocuments Полный путь к папке "Мои документы" текущего пользователя
ProgramFiles Значение переменной среды %ProgramFiles%
Системные Папка Windows\System32
WinDir Значение переменной среды %WinDir%

Изображение

Элемент <Image> определяет изображение, на которое можно ссылаться моникером. GUID и идентификатор, взятые вместе, образуют моникер изображения. Моникер для изображения должен быть уникальным во всей библиотеке изображений. Если несколько изображений имеют заданный моникер, первый обнаружен при создании библиотеки является сохраненным.

Он должен содержать по крайней мере один источник. Нейтральные источники размера дают лучшие результаты в широком диапазоне размеров, но они не требуются. Если служба запрашивает изображение размера, не определенного в <элементе Image> , и нет нейтрального источника размера, служба выберет оптимальный источник для конкретного размера и масштабируется до запрошенного размера.

<Image Guid="guid" ID="int" AllowColorInversion="true/false">
      <Source ... />
      <!-- optional additional Source elements -->
</Image>
Attribute Определение
GUID [Обязательный] Часть GUID моникера изображения
Идентификатор [Обязательный] Часть идентификатора моникера изображения
AllowColorInversion [Необязательно, значение true] Указывает, может ли изображение иметь его цвета программным образом, инвертированные при использовании на темном фоне.

Источник

Элемент <Source> определяет один исходный ресурс изображения (XAML и PNG).

<Source Uri="uri" Background="background">
      <!-- optional NativeResource element -->
 </Source>
Attribute Определение
URI-адрес [Обязательный] Универсальный код ресурса (URI), определяющий, откуда можно загрузить изображение. Может принимать одно из следующих значений:

— универсальный код ресурса (URI ) пакета с помощью центра application:///
— ссылка на абсолютный ресурс компонента
— Путь к файлу, содержаму собственный ресурс
Общие сведения [Необязательно] Указывает, какой тип фона предназначен для использования источника.

Может принимать одно из следующих значений:

Свет: источник может использоваться на светлом фоне.

Темный: источник можно использовать на темном фоне.

HighContrast: источник можно использовать в любом фоновом режиме в режиме высокой контрастности.

HighContrastLight: источник можно использовать на светлом фоне в режиме высокой контрастности.

HighContrastDark: источник можно использовать на темном фоне в режиме высокой контрастности.

Если атрибут Background опущен, источник можно использовать в любом фоновом режиме.

Если фон является светлым, темным, highContrastLight или HighContrastDark, цвета источника никогда не инвертируются. Если фон опущен или задано значение HighContrast, инверсия цветов источника управляется атрибутом AllowColorInversion изображения.

Элемент <Source> может иметь ровно один из следующих необязательных подэлементов:

Element Атрибуты (все обязательные) Определение
<Размер> Значение Источник будет использоваться для изображений заданного размера (в единицах устройства). Изображение будет квадратным.
<SizeRange> MinSize, MaxSize Источник будет использоваться для изображений из MinSize в MaxSize (в единицах устройства) включительно. Изображение будет квадратным.
<Dimensions> Ширина, высота Источник будет использоваться для изображений заданной ширины и высоты (в единицах устройства).
<DimensionRange> MinWidth, MinHeight,

MaxWidth, MaxHeight
Источник будет использоваться для изображений с минимальной ширины или высоты до максимальной ширины и высоты (в единицах устройства) включительно.

Элемент <Source> также может иметь необязательный <подэлемент NativeResource> , который определяет <источник> , загруженный из собственной сборки, а не управляемой сборки.

<NativeResource Type="type" ID="int" />
Attribute Определение
Тип [Обязательный] Тип собственного ресурса , XAML или PNG
Идентификатор [Обязательный] Целочисленный идентификатор части собственного ресурса

ImageList

Элемент <ImageList> определяет коллекцию изображений, которые можно возвращать в одной полосе. Полоса строится по требованию, по мере необходимости.

<ImageList>
      <ContainedImage Guid="guid" ID="int" External="true/false" />
      <!-- optional additional ContainedImage elements -->
 </ImageList>
Attribute Определение
GUID [Обязательный] Часть GUID моникера изображения
Идентификатор [Обязательный] Часть идентификатора моникера изображения
Внешняя. [Необязательно, значение false] Указывает, ссылается ли моникер на изображение в текущем манифесте.

Моникер для содержащегося изображения не должен ссылаться на изображение, определенное в текущем манифесте. Если в библиотеке образов не удается найти автономное изображение, в его месте будет использоваться пустой заполнитель.

Использование службы образов

Первые шаги (управляемые)

Чтобы использовать службу образов, необходимо добавить ссылки на некоторые или все следующие сборки в проект:

  • Microsoft.VisualStudio.ImageCatalog.dll

    • Требуется, если вы используете встроенный каталог образов KnownMonikers.
  • Microsoft.VisualStudio.Imaging.dll

    • Требуется, если вы используете CrispImage и ImageThemingUtilities в пользовательском интерфейсе WPF.
  • Microsoft.VisualStudio.Imaging.Interop.14.0.DesignTime.dll

    • Требуется, если вы используете типы ImageMoniker и ImageAttributes .

    • Для EmbedInteropTypes должно быть задано значение true.

  • Microsoft.VisualStudio.Shell.Interop.14.0.DesignTime

    • Требуется, если используется тип IVsImageService2 .

    • Для EmbedInteropTypes должно быть задано значение true.

  • Microsoft.VisualStudio.Utilities.dll

    • Требуется, если вы используете BrushToColorConverter для ImageThemingUtilities.ImageBackgroundColor в пользовательском интерфейсе WPF.
  • Microsoft.VisualStudio.Shell.<VSVersion.0>

    • Требуется, если используется тип IVsUIObject .
  • Microsoft.VisualStudio.Shell.Interop.10.0.dll

    • Требуется, если вы используете вспомогательные средства пользовательского интерфейса, связанные с WinForms.

    • Для EmbedInteropTypes должно быть задано значение true

Первые шаги (собственные)

Чтобы использовать службу образов, необходимо включить в проект некоторые или все следующие заголовки:

  • KnownImageIds.h

    • Требуется, если используется встроенный каталог образов KnownMonikers, но не может использовать тип ImageMoniker, например при возврате значений из вызовов IVsHierarchy GetGuidProperty или GetProperty.
  • KnownMonikers.h

    • Требуется, если вы используете встроенный каталог образов KnownMonikers.
  • ImageParameters140.h

    • Требуется, если вы используете типы ImageMoniker и ImageAttributes .
  • VSShell140.h

    • Требуется, если используется тип IVsImageService2 .
  • ImageThemingUtilities.h

    • Требуется, если вы не можете разрешить службе образов обрабатывать их для вас.

    • Не используйте этот заголовок, если служба образов может обрабатывать их.

  • VsDpiAwareness.h

    • Требуется, если вы используете вспомогательные средства защиты от DPI для получения текущего DPI.

Разделы справки написать новый пользовательский интерфейс WPF?

  1. Начните с добавления ссылок на сборки, необходимые в разделе выше, в проект. Вам не нужно добавлять все из них, поэтому добавьте только нужные ссылки. (Примечание. Если вы используете или имеете доступ к Цвета вместо кистей, то можно пропустить ссылку на служебные программы, так как не потребуется преобразователь.)

  2. Выберите нужное изображение и получите его моникер. Используйте известный моникер или используйте собственные, если у вас есть собственные пользовательские изображения и моникеры.

  3. Добавьте CrispImages в XAML. (См. приведенный ниже пример.)

  4. Задайте свойство ImageThemingUtilities.ImageBackgroundColor в иерархии пользовательского интерфейса. (Это должно быть установлено в расположении, где известен цвет фона, а не обязательно на CrispImage.) (См. ниже пример.)

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

Разделы справки обновить существующий пользовательский интерфейс WPF?

Обновление существующего пользовательского интерфейса WPF является относительно простым процессом, состоящим из трех основных шагов:

  1. Замените все <элементы Image> в пользовательском интерфейсе <элементами CrispImage> .

  2. Измените все атрибуты источника на Moniker.

    • Если изображение никогда не изменяется, и вы используете KnownMonikers, то статически привязываете это свойство к KnownMoniker. (См. приведенный выше пример.)

    • Если изображение никогда не изменяется, и вы используете собственный пользовательский образ, то статически привязывается к собственному моникеру.

    • Если изображение может измениться, привязывает атрибут Moniker к свойству кода, которое уведомляет об изменениях свойств.

  3. Где-то в иерархии пользовательского интерфейса задайте ImageThemingUtilities.ImageBackgroundColor , чтобы убедиться, что цветная инверсия работает правильно.

    • Для этого может потребоваться использование класса BrushToColorConverter . (См. приведенный выше пример.)

Разделы справки обновить пользовательский интерфейс Win32?

Добавьте следующий код в любом месте, где нужно заменить необработанную загрузку изображений. Переключение значений для возврата HBITMAPs и HICON и HIMAGELIST по мере необходимости.

Получение службы образов

CComPtr<IVsImageService2> spImgSvc;
CGlobalServiceProvider::HrQueryService(SID_SVsImageService, &spImgSvc);

Запрос изображения

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);

Разделы справки обновить пользовательский интерфейс WinForms?

Добавьте следующий код в любом месте, где нужно заменить необработанную загрузку изображений. Переключение значений для возврата растровых изображений и значков по мере необходимости.

Полезное использование инструкции

using GelUtilities = Microsoft.Internal.VisualStudio.PlatformUI.Utilities;

Получение службы образов

// This or your preferred way of querying for Visual Studio services
IVsImageService2 imageService = (IVsImageService2)Package.GetGlobalService(typeof(SVsImageService));

Запрос изображения

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

Разделы справки использовать моникеры изображений в новом окне инструментов?

Шаблон проекта пакета VSIX был обновлен для Visual Studio 2015. Чтобы создать окно инструментов, щелкните правой кнопкой мыши проект VSIX и выберите "Добавить>новый элемент" (CTRL SHIFT++A). В узле расширяемости для языка проекта выберите "Пользовательское окно инструментов", присвойте окну инструмента имя и нажмите кнопку "Добавить ".

Это ключевые места для использования моникеров в окне инструментов. Следуйте инструкциям для каждого из них:

  1. Вкладка окна инструментов, когда вкладки будут достаточно маленькими (также используется в переключателе окна CTRL+TAB).

    Добавьте эту строку в конструктор для класса, наследуемого от типа ToolWindowPane :

    // Replace this KnownMoniker with your desired ImageMoniker
    this.BitmapImageMoniker = KnownMonikers.Blank;
    
  2. Команда для открытия окна инструментов.

    В файле пакета измените .vsct кнопку окна инструментов:

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

    Убедитесь, что в верхней части файла также существует следующее:<Extern>

    <Include href="KnownImageIds.vsct"/>
    

Разделы справки использовать моникеры изображений в существующем окне инструментов?

Обновление существующего окна инструментов для использования моникеров изображений аналогично действиям по созданию нового окна инструментов.

Это ключевые места для использования моникеров в окне инструментов. Следуйте инструкциям для каждого из них:

  1. Вкладка окна инструментов, когда вкладки будут достаточно маленькими (также используется в переключателе окна CTRL+TAB).

    1. Удалите эти строки (если они существуют) в конструкторе для класса, наследуемого от типа ToolWindowPane :

      this.BitmapResourceID = <Value>;
      this.BitmapIndex = <Value>;
      
    2. См. шаг 1 статьи "Разделы справки использовать моникеры изображений в новом окне инструментов?" выше.

  2. Команда для открытия окна инструментов.

    • См. шаг 2 статьи "Разделы справки использовать моникеры изображений в новом окне инструментов?" выше.

Разделы справки использовать моникеры изображений в VSCT-файле?

Обновите .vsct файл, как указано в закомментированных строках ниже:

<?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>

Что делать, если файл VSCT также должен быть прочитан более старыми версиями Visual Studio?

Старые версии Visual Studio не распознают флаг команды IconIsMoniker . Образы из службы образов можно использовать в версиях Visual Studio, поддерживающих ее, но продолжать использовать старые образы в более старых версиях Visual Studio. Для этого вы оставьте .vsct файл без изменений (и, следовательно, совместим с более старыми версиями Visual Studio) и создадите CSV-файл (разделенные запятыми значения), который сопоставляется с парами GUID/ID, определенными в .vsct элементе Bitmaps файла <, с парами идентификаторов> GUID и идентификаторов изображения.

Формат CSV-файла сопоставления:

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

CSV-файл развертывается с пакетом и его расположение указывается свойством IconMappingFilename атрибута пакета ProvideMenuResource:

[ProvideMenuResource("MyPackage.ctmenu", 1, IconMappingFilename="IconMappings.csv")]

IconMappingFilename — это относительный путь, неявно корень в $PackageFolder$ (как в приведенном выше примере), или абсолютный путь явно корень в каталоге, определенном переменной среды, например @"%UserProfile%\dir1\dir2\MyMappingFile.csv".

Разделы справки переносить систему проекта?

Как предоставить ImageMonikers для проекта

  1. Реализуйте VSHPROPID_SupportsIconMonikers в IVsHierarchy проекта и верните значение true.

  2. Реализуйте либо VSHPROPID_IconMonikerImageList (если исходный проект использовал VSHPROPID_IconImgList) или VSHPROPID_IconMonikerGuid, VSHPROPID_IconMonikerId, VSHPROPID_OpenFolderIconMonikerGuid, VSHPROPID_OpenFolderIconMonikerId (если исходный проект использовал VSHPROPID_IconHandle и VSHPROPID_OpenFolderIconHandle).

  3. Измените реализацию исходных VSHPROPID для значков, чтобы создать устаревшие версии значков, если точки расширения запрашивают их. IVsImageService2 предоставляет функциональные возможности, необходимые для получения этих значков

    Дополнительные требования к вкусам проекта VB/C#

    Реализуйте только VSHPROPID_SupportsIconMonikers, если вы обнаружите, что проект является самым внешним вкусом. В противном случае фактический внешний вкус может не поддерживать моникеры изображений в реальности, и ваш базовый вкус может эффективно "скрыть" настраиваемые изображения.

    Разделы справки использовать моникеры изображений в CPS?

    Настройка пользовательских образов в CPS (Common Project System) можно выполнять вручную или с помощью шаблона элемента, который поставляется с пакетом SDK расширяемости системы проекта.

    Использование пакета SDK расширяемости системы проекта

    Следуйте инструкциям, приведенным в разделе "Предоставление настраиваемых значков для типа проекта или элемента", чтобы настроить образы CPS. Дополнительные сведения о CPS см. в документации по расширяемости системы проектов Visual Studio

    Использование ImageMonikers вручную

  4. Реализуйте и экспортируйте интерфейс IProjectTreeModifier в системе проекта.

  5. Определите, какой известный моникер или пользовательский моникер изображений вы хотите использовать.

  6. В методе ApplyModifications выполните следующие действия, прежде чем возвращать новое дерево, как показано в следующем примере:

    // Replace this KnownMoniker with your desired ImageMoniker
    tree = tree.SetIcon(KnownMonikers.Blank.ToProjectSystemType());
    
  7. При создании нового дерева можно задать пользовательские образы, передав нужные моникеры в метод NewTree, как показано в следующем примере:

    // 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);
    

Разделы справки преобразовать из реальной полосы изображений в моникерную полосу изображений?

Мне нужно поддерживать HIMAGELISTs

Если для кода уже существует полоса изображений, которую требуется обновить для использования службы образов, но api, требующие передачи списков изображений, по-прежнему могут получить преимущества службы образов. Чтобы создать моникерную полосу изображений, выполните приведенные ниже действия, чтобы создать манифест из существующих моникеров.

  1. Запустите средство ManifestFromResources, передавая его полосу изображений. Это приведет к созданию манифеста для полосы.

    • Рекомендуется: укажите имя манифеста, не используемое по умолчанию.
  2. Если вы используете только ИзвестныеMonikers, выполните следующие действия:

    • Замените <раздел "Изображения"> манифеста изображениями </>.

    • Удалите все идентификаторы подимажных элементов (все, что угодно с <помощью imagestrip name>_#).

    • Рекомендуется переименовать символ AssetsGuid и символ полосы изображений, чтобы соответствовать его использованию.

    • Замените идентификатор GUID ContainedImage на $(ImageCatalogGuid), замените каждый идентификатор ContainedImage $(<moniker>) и добавьте атрибут External="true" для каждого containedImage

      • <моникер> должен быть заменен именем KnownMoniker , который соответствует изображению, но с именем "ИзвестныеMonikers".
    • Добавьте <путь импорта Manifest="$(ManifestFolder)\<Relative install dir к *>\Microsoft.VisualStudio.ImageCatalog.imagemanifest" /*> в верхней части <раздела "Символы> ".

      • Относительный путь определяется расположением развертывания, определенным в создании программы установки для манифеста.
  3. Запустите средство ManifestToCode, чтобы создать оболочки, чтобы существующий код мог использовать для запроса службы изображений для полосы изображений.

    • Рекомендуется: укажите неотделимые имена для оболочки и пространств имен, чтобы они соответствовали их использованию.
  4. Выполните все добавления, настройку разработки и развертывания и другие изменения кода для работы со службой образов и новыми файлами.

    Пример манифеста, включая внутренние и внешние образы, чтобы увидеть, как оно должно выглядеть:

<?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>

Мне не нужно поддерживать HIMAGELISTs

  1. Определите набор известных моникеров , которые соответствуют изображениям в полосе изображений, или создайте собственные моникеры для изображений в полосе изображений.

  2. Обновите любое сопоставление, используемое для получения изображения по требуемому индексу в полосе изображений, чтобы вместо этого использовать моникеры.

  3. Обновите код, чтобы использовать службу изображений для запроса моникеров с помощью обновленного сопоставления. (Это может означать обновление до CrispImages для управляемого кода или запроса HBITMAPs или HICON из службы образов и передачи их для машинного кода.)

Тестирование образов

Средство просмотра библиотек изображений можно использовать для проверки манифестов изображений, чтобы убедиться, что все создано правильно. Средство можно найти в пакете SDK для Visual Studio 2015. Здесь приведена документация по этому инструменту и другим пользователям.

Дополнительные ресурсы

Примеры

Несколько примеров Visual Studio на GitHub были обновлены, чтобы показать, как использовать службу образов в составе различных точек расширяемости Visual Studio.

Проверьте http://github.com/Microsoft/VSSDK-Extensibility-Samples последние примеры.

Средства

Набор средств поддержки службы образов был создан для создания и обновления пользовательского интерфейса, который работает со службой образов. Дополнительные сведения о каждом инструменте см. в документации, которая поставляется с инструментами. Средства включены в состав пакета SDK для Visual Studio 2015.

ManifestFromResources

Средство "Манифест из ресурсов" принимает список ресурсов изображения (PNG или XAML) и создает файл манифеста изображения для использования этих изображений со службой изображений.

ManifestToCode

Средство манифеста кода принимает файл манифеста изображения и создает файл-оболочку для ссылки на значения манифеста в коде (C++, C#или VB) или .vsct файлах.

ImageLibraryViewer

Средство просмотра библиотек изображений может загружать манифесты изображений и позволяет пользователю управлять ими так же, как Visual Studio, чтобы убедиться, что манифест создан правильно. Пользователь может изменять фон, размеры, параметры DPI, высокую контрастность и другие параметры. Он также отображает сведения о загрузке для поиска ошибок в манифестах и отображения исходных сведений для каждого изображения в манифесте.

Вопросы и ответы

  • Существуют ли зависимости, которые необходимо включить при загрузке <ссылки Include="Microsoft.VisualStudio.*. Interop.14.0.DesignTime" />?

    • Задайте значение EmbedInteropTypes="true" во всех библиотеках DLL взаимодействия.
  • Разделы справки развернуть манифест образа с помощью расширения?

    • Добавьте файл в .imagemanifest проект.

    • Задайте для параметра "Включить в VSIX" значение True.

  • Мои изображения по-прежнему не работают, как выяснить, что не так?

    • Visual Studio может не находить манифест изображения. По соображениям производительности Visual Studio ограничивает глубину поиска папок, поэтому рекомендуется хранить манифест изображения в корневой папке расширения.

    • Возможно, в файле манифеста изображения отсутствуют сведения о сборке. Сборки, которые строго именуются, требуют дополнительных сведений для загрузки Visual Studio. Чтобы загрузить строго именованную сборку, необходимо включить (в дополнение к имени сборки) версию сборки и маркер открытого ключа в URI ресурса для изображений в манифесте образа.

      <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>
      
    • Возможно, для сборки образа отсутствует запись базы кода. Если сборка еще не загружена по времени, когда Visual Studio нуждается в ней, необходимо знать, где найти сборку, чтобы загрузить ее. Чтобы добавить базу кода для сборки, можно использовать файл ProvideCodeBaseAttribute, чтобы убедиться, что запись базы кода создается и включена в pkgdef расширения.

      [assembly: ProvideCodeBase(AssemblyName = "ClassLibrary1", Version = "1.0.0.0", CodeBase = "$PackageFolder$\\ClassLibrary1.dll")]
      
    • Если предыдущие параметры не разрешают проблему загрузки образа, вы можете включить ведение журнала, сбросив следующие записи в pkgdef в расширении:

      [$RootKey$\ImageLibrary]
      "TraceLevel"="Verbose"
      "TraceFilename"="ImageLibrary.log"
      

      При этом будет создан файл журнала с именем ImageLibrary.log в папке %UserProfile% . Не забудьте запустить devenv /updateConfiguration из командной строки разработчика после добавления этих записей в pkgdef. Это гарантирует, что записи ведения журнала включены и что VS обновляет кэш манифеста изображения, чтобы помочь найти любые ошибки, которые могут возникать при чтении манифеста изображения. Если вы будете выполнять сценарий загрузки образа, файл журнала будет содержать как ведение журнала регистрации, так и ведение журнала запросов для образа.

  • Я обновляю систему проекта CPS. Что произошло с ImageName и StockIconService?

    • Они были удалены при обновлении CPS для использования моникеров. Вам больше не нужно вызывать StockIconService, просто передайте нужный ИзвестныйMoniker методу или свойству с помощью метода расширения ToProjectSystemType() в служебных программ CPS. Вы можете найти сопоставление из ImageName с ИзвестнымиMonikers ниже:

      ImageName ИзвестныйMoniker
      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
  • Я обновляю поставщика списка завершения. Какие известныеMonikers соответствуют старым значениям StandardGlyphGroup и StandardGlyph ?

    Имя. Имя. Имя.
    GlyphGroupClass GlyphItemPublic ClassPublic
    GlyphGroupClass GlyphItemInternal ClassInternal
    GlyphGroupClass GlyphItemFriend ClassInternal
    GlyphGroupClass GlyphItemProtected КлассProtected
    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 ДелегатPublic
    GlyphGroupDelegate GlyphItemInternal ДелегатInternal
    GlyphGroupDelegate GlyphItemFriend ДелегатInternal
    GlyphGroupDelegate GlyphItemProtected ДелегатЗащищено
    GlyphGroupDelegate GlyphItemPrivate ДелегатPrivate
    GlyphGroupDelegate GlyphItemShortcut ДелегатShortcut
    GlyphGroupEnum GlyphItemPublic ПеречислениеPublic
    GlyphGroupEnum GlyphItemInternal ПеречислениеInternal
    GlyphGroupEnum GlyphItemFriend ПеречислениеInternal
    GlyphGroupEnum GlyphItemProtected ПеречислениеProtected
    GlyphGroupEnum GlyphItemPrivate ПеречислениеPrivate
    GlyphGroupEnum GlyphItemShortcut ПеречислениеShortcut
    GlyphGroupEnumMember GlyphItemPublic ПеречислениеItemPublic
    GlyphGroupEnumMember GlyphItemInternal ПеречислениеItemInternal
    GlyphGroupEnumMember GlyphItemFriend ПеречислениеItemInternal
    GlyphGroupEnumMember GlyphItemProtected ПеречислениеItemProtected
    GlyphGroupEnumMember GlyphItemPrivate ПеречислениеItemPrivate
    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 MacroPublic
    GlyphGroupMacro GlyphItemInternal МакросInternal
    GlyphGroupMacro GlyphItemFriend МакросInternal
    GlyphGroupMacro GlyphItemProtected Макрозащищено
    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 Пространство именInternal
    GlyphGroupNamespace GlyphItemFriend Пространство именInternal
    GlyphGroupNamespace GlyphItemProtected NamespaceProtected
    GlyphGroupNamespace GlyphItemPrivate NamespacePrivate
    GlyphGroupNamespace GlyphItemShortcut NamespaceShortcut
    GlyphGroupOperator GlyphItemPublic ОператорPublic
    GlyphGroupOperator GlyphItemInternal ОператорInternal
    GlyphGroupOperator GlyphItemFriend ОператорInternal
    GlyphGroupOperator GlyphItemProtected ОператорProtected
    GlyphGroupOperator GlyphItemPrivate ОператорPrivate
    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 СтруктураInternal
    GlyphGroupStruct GlyphItemFriend СтруктураInternal
    GlyphGroupStruct GlyphItemProtected StructureProtected
    GlyphGroupStruct GlyphItemPrivate StructurePrivate
    GlyphGroupStruct GlyphItemShortcut StructureShortcut
    GlyphGroupTemplate GlyphItemPublic TemplatePublic
    GlyphGroupTemplate GlyphItemInternal TemplateInternal
    GlyphGroupTemplate GlyphItemFriend TemplateInternal
    GlyphGroupTemplate GlyphItemProtected TemplateProtected
    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 КлассProtected
    GlyphGroupJSharpClass GlyphItemPrivate ClassPrivate
    GlyphGroupJSharpClass GlyphItemShortcut ClassShortcut
    GlyphGroupJSharpNamespace GlyphItemPublic NamespacePublic
    GlyphGroupJSharpNamespace GlyphItemInternal Пространство именInternal
    GlyphGroupJSharpNamespace GlyphItemFriend Пространство именInternal
    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
    ГлифАссембли Справочные материалы
    ГлифLibrary Библиотека
    GlyphVBProject VBProjectNode
    GlyphCoolProject CSProjectNode
    GlyphCppProject CPPProjectNode
    GlyphDialogId Диалоговое окно
    GlyphOpenFolder FolderOpened
    GlyphClosedFolder FolderClosed
    ГлифАрроу GoToNext
    GlyphCSharpFile CSFileNode
    GlyphCSharpExpansion Фрагмент кода
    GlyphKeyword IntellisenseKeyword
    GlyphInformation StatusInformation
    GlyphReference ClassMethodReference
    ГлифRecursion Рекурсия
    GlyphXmlItem Тег
    GlyphJSharpProject DocumentCollection
    GlyphJSharpDocument Документ
    GlyphForwardType GoToNext
    GlyphCallersGraph CallTo
    GlyphCallGraph CallFrom
    ГлифВарнинг StatusWarning
    GlyphMaybeReference Вопросим
    GlyphMaybeCaller CallTo
    GlyphMaybeCall CallFrom
    GlyphExtensionMethod ExtensionMethod
    GlyphExtensionMethodInternal ExtensionMethod
    GlyphExtensionMethodFriend ExtensionMethod
    GlyphExtensionMethodProtected ExtensionMethod
    GlyphExtensionMethodPrivate ExtensionMethod
    GlyphExtensionMethodShortcut ExtensionMethod
    GlyphXmlAttribute XmlAttribute
    ГлифXmlChild XmlElement
    GlyphXmlDescendant XmlDescendant
    GlyphXmlNamespace Пространство XmlName
    GlyphXmlAttributeQuestion XmlAttributeLowConfidence
    GlyphXmlAttributeCheck XmlAttributeHighConfidence
    GlyphXmlChildQuestion XmlElementLowConfidence
    GlyphXmlChildCheck XmlElementHighConfidence
    GlyphXmlDescendantQuestion XmlDescendantLowConfidence
    GlyphXmlDescendantCheck XmlDescendantHighConfidence
    GlyphCompletionWarning IntellisenseWarning