Udostępnij za pośrednictwem


Usługa i katalog obrazów

Ta książka kucharka zawiera wskazówki i najlepsze rozwiązania dotyczące wdrażania usługi obrazów programu Visual Studio i wykazu obrazów wprowadzonego w programie Visual Studio 2015.

Usługa obrazów wprowadzona w programie Visual Studio 2015 umożliwia deweloperom uzyskanie najlepszych obrazów dla urządzenia i wybranego motywu użytkownika w celu wyświetlenia obrazu, w tym poprawianie motywów dla kontekstu, w którym są wyświetlane. Wdrożenie usługi obrazów pomoże wyeliminować poważne problemy związane z konserwacją zasobów, skalowaniem hdPI i motywami.

Problemy dzisiaj Rozwiązania
Łączenie kolorów tła Wbudowane mieszanie alfa
Motywy (niektóre) obrazy Metadane motywu
Tryb dużego kontrastu Alternatywne zasoby o dużym kontraście
Potrzeba wielu zasobów dla różnych trybów DPI Wybieralne zasoby z rezerwowym opartym na wektorach
Zduplikowane obrazy Jeden identyfikator na koncepcję obrazu

Dlaczego warto wdrożyć usługę obrazów?

  • Zawsze pobieraj najnowszy obraz "pixel-perfect" z programu Visual Studio

  • Możesz przesyłać własne obrazy i korzystać z nich

  • Nie trzeba testować obrazów, gdy system Windows dodaje nowe skalowanie DPI

  • Rozwiązywanie problemów ze starą architekturą w implementacjach

    Pasek narzędzi powłoki programu Visual Studio przed i po użyciu usługi obrazów:

    Usługa obrazów przed i po

Jak to działa

Usługa obrazów może dostarczyć obraz map bitowy odpowiedni dla dowolnej obsługiwanej platformy interfejsu użytkownika:

  • WPF: BitmapSource

  • WinForms: System.Drawing.Bitmap

  • Win32: HBITMAP

    Diagram przepływu usługi obrazowej

    Diagram przepływu usługi obrazów

    Obrazy monikers

    Moniker obrazu (lub moniker for short) to para identyfikatorów GUID/ID, która jednoznacznie identyfikuje zasób obrazu lub zasób listy obrazów w bibliotece obrazów.

    Znane jęki

    Zestaw elementów monikerów obrazów zawartych w wykazie obrazów programu Visual Studio i publicznie używanych przez dowolny składnik lub rozszerzenie programu Visual Studio.

    Pliki manifestu obrazu

    Pliki manifestu obrazu (imagemanifest) to pliki XML, które definiują zestaw zasobów obrazów, elementy monikers reprezentujące te zasoby oraz rzeczywisty obraz lub obrazy reprezentujące każdy zasób. Manifesty obrazów mogą definiować autonomiczne obrazy lub listy obrazów dla starszej obsługi interfejsu użytkownika. Ponadto istnieją atrybuty, które można ustawić na zasobie lub na poszczególnych obrazach za każdym zasobem, aby zmienić czas i sposób wyświetlania tych zasobów.

    Schemat manifestu obrazu

    Pełny manifest obrazu wygląda następująco:

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

Symbole

Jako pomoc w czytelności i konserwacji manifest obrazu może używać symboli dla wartości atrybutów. Symbole są zdefiniowane w następujący sposób:

<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>
Podelement Definicja
Importuj Importuje symbole danego pliku manifestu do użycia w bieżącym manifeście
Identyfikator GUID Symbol reprezentuje identyfikator GUID i musi być zgodny z formatowaniem identyfikatora GUID
ID Symbol reprezentuje identyfikator i musi być nienegacyjną liczbą całkowitą
String Symbol reprezentuje dowolną wartość ciągu

Symbole są uwzględniane w wielkości liter i odwołują się do składni $(nazwa-symbolu):

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

Niektóre symbole są wstępnie zdefiniowane dla wszystkich manifestów. Można ich użyć w atrybucie <Uri elementu Source> lub <Import> do ścieżek odwołań na komputerze lokalnym.

Symbol Opis
CommonProgramFiles Wartość zmiennej środowiskowej %CommonProgramFiles%
LocalAppData Wartość zmiennej środowiskowej %LocalAppData%
ManifestFolder Folder zawierający plik manifestu
Moje dokumenty Pełna ścieżka folderu Moje dokumenty bieżącego użytkownika
ProgramFiles Wartość zmiennej środowiskowej %ProgramFiles%
System Folder Windows\System32
WinDir Wartość zmiennej środowiskowej %WinDir%

Obraz

Element <Image> definiuje obraz, do którego można odwoływać się pod pseudonimem. Identyfikator GUID i identyfikator wzięty razem tworzą pseudonim obrazu. Pseudonim obrazu musi być unikatowy w całej bibliotece obrazów. Jeśli dany pseudonim zawiera więcej niż jeden obraz, pierwszy napotkany podczas kompilowania biblioteki jest tym, który jest zachowywany.

Musi zawierać co najmniej jedno źródło. Źródła neutralne pod względem rozmiaru dają najlepsze wyniki w szerokim zakresie rozmiarów, ale nie są wymagane. Jeśli usługa zostanie poproszona o obraz o rozmiar niezdefiniowany w <elemecie Obraz> i nie ma źródła neutralnego rozmiaru, usługa wybierze najlepsze źródło specyficzne dla rozmiaru i przeskaluje je do żądanego rozmiaru.

<Image Guid="guid" ID="int" AllowColorInversion="true/false">
      <Source ... />
      <!-- optional additional Source elements -->
</Image>
Atrybut Definicja
Identyfikator GUID [Wymagane] Część identyfikatora GUID moniker obrazu
ID [Wymagane] Część identyfikatora moniker obrazu
AllowColorInversion [Opcjonalnie, wartość domyślna true] Wskazuje, czy obraz może mieć swoje kolory programowo odwrócone w przypadku użycia na ciemnym tle.

Source

Element <Źródłowy> definiuje pojedynczy zasób źródłowy obrazu (XAML i PNG).

<Source Uri="uri" Background="background">
      <!-- optional NativeResource element -->
 </Source>
Atrybut Definicja
Identyfikator URI [Wymagane] Identyfikator URI definiujący, skąd można załadować obraz. Może to być jedna z następujących opcji:

— Identyfikator URI pakietu przy użyciu urzędu application:///
— Odwołanie do zasobów składnika bezwzględnego
- Ścieżka do pliku zawierającego zasób natywny
Tło [Opcjonalnie] Wskazuje, jakiego rodzaju tło ma być używane źródło.

Może to być jedna z następujących opcji:

Światło: Źródło może być używane na jasnym tle.

Ciemny: źródło może być używane na ciemnym tle.

HighContrast: źródło może być używane w dowolnym tle w trybie dużego kontrastu.

HighContrastLight: źródło może być używane na jasnym tle w trybie dużego kontrastu.

HighContrastDark: źródło może być używane na ciemnym tle w trybie dużego kontrastu.

Jeśli atrybut Background zostanie pominięty, źródło może być używane w dowolnym tle.

Jeśli tło jest jasne, ciemne, HighContrastLight lub HighContrastDark, kolory źródła nigdy nie są odwrócone. Jeśli w tle pominięto lub ustawiono wartość HighContrast, inwersja kolorów źródła jest kontrolowana przez atrybut AllowColorInversion obrazu.

Element <źródłowy> może mieć dokładnie jeden z następujących opcjonalnych elementów podrzędnych:

Element Atrybuty (wszystkie wymagane) Definicja
<Rozmiar> Wartość Źródło będzie używane do obrazów danego rozmiaru (w jednostkach urządzeń). Obraz będzie kwadratowy.
<SizeRange> MinSize, MaxSize Źródło będzie używane dla obrazów z minsize do MaxSize (w jednostkach urządzeń) włącznie. Obraz będzie kwadratowy.
<Wymiary> Szerokość, wysokość Źródło będzie używane do obrazów danej szerokości i wysokości (w jednostkach urządzeń).
<WymiarRange> MinWidth, MinHeight,

MaxWidth, MaxHeight
Źródło będzie używane dla obrazów z minimalnej szerokości/wysokości do maksymalnej szerokości/wysokości (w jednostkach urządzeń) włącznie.

Element <źródłowy> może również mieć opcjonalny <podelement NativeResource> , który definiuje <źródło> ładowane z zestawu natywnego, a nie z zarządzanego zestawu.

<NativeResource Type="type" ID="int" />
Atrybut Definicja
Typ [Wymagane] Typ zasobu natywnego, XAML lub PNG
ID [Wymagane] Część identyfikatora całkowitego zasobu natywnego

Lista obrazów

Element <ImageList> definiuje kolekcję obrazów, które można zwrócić w jednym pasku. Pasek jest zbudowany na żądanie zgodnie z potrzebami.

<ImageList>
      <ContainedImage Guid="guid" ID="int" External="true/false" />
      <!-- optional additional ContainedImage elements -->
 </ImageList>
Atrybut Definicja
Identyfikator GUID [Wymagane] Część identyfikatora GUID moniker obrazu
ID [Wymagane] Część identyfikatora moniker obrazu
Zewnętrzne [Opcjonalne, domyślne fałsz] Wskazuje, czy moniker obrazu odwołuje się do obrazu w bieżącym manifeście.

Pseudonim zawartego obrazu nie musi odwoływać się do obrazu zdefiniowanego w bieżącym manifeście. Jeśli nie można odnaleźć zawartego obrazu w bibliotece obrazów, w jego miejscu zostanie użyty pusty obraz zastępczy.

Korzystanie z usługi obrazów

Pierwsze kroki (zarządzane)

Aby użyć usługi obrazów, należy dodać odwołania do niektórych lub wszystkich następujących zestawów do projektu:

  • Microsoft.VisualStudio.ImageCatalog.dll

    • Wymagane, jeśli używasz wbudowanego wykazu obrazów KnownMonikers.
  • Microsoft.VisualStudio.Imaging.dll

    • Wymagane w przypadku używania funkcji CrispImage i ImageThemingUtilities w interfejsie użytkownika WPF.
  • Microsoft.VisualStudio.Imaging.Interop.14.0.DesignTime.dll

    • Wymagane w przypadku używania typów ImageMoniker i ImageAttributes .

    • Parametr EmbedInteropTypes powinien mieć wartość true.

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

    • Wymagane, jeśli używasz typu IVsImageService2 .

    • Parametr EmbedInteropTypes powinien mieć wartość true.

  • Microsoft.VisualStudio.Utilities.dll

    • Wymagane, jeśli używasz elementu BrushToColorConverter dla elementu ImageThemingUtilities.ImageBackgroundColor w interfejsie użytkownika WPF.
  • Microsoft.VisualStudio.Shell.<VSVersion.0>

    • Wymagane, jeśli używasz typu IVsUIObject .
  • Microsoft.VisualStudio.Shell.Interop.10.0.dll

    • Wymagane w przypadku korzystania z pomocników interfejsu użytkownika związanych z formularzami WinForms.

    • Parametr EmbedInteropTypes powinien mieć wartość true

Pierwsze kroki (natywne)

Aby użyć usługi obrazów, musisz uwzględnić niektóre lub wszystkie następujące nagłówki w projekcie:

  • KnownImageIds.h

    • Wymagane, jeśli używasz wbudowanego wykazu obrazów KnownMonikers, ale nie można użyć typu ImageMoniker , takiego jak podczas zwracania wartości z IVsHierarchy GetGuidProperty lub GetProperty wywołań.
  • KnownMonikers.h

    • Wymagane, jeśli używasz wbudowanego wykazu obrazów KnownMonikers.
  • ImageParameters140.h

    • Wymagane w przypadku używania typów ImageMoniker i ImageAttributes .
  • VSShell140.h

    • Wymagane, jeśli używasz typu IVsImageService2 .
  • ImageThemingUtilities.h

    • Wymagane, jeśli nie możesz zezwolić usłudze obrazów na obsługę ich za Ciebie.

    • Nie używaj tego nagłówka, jeśli usługa obrazu może obsługiwać motywy obrazu.

  • VsDpiAwareness.h

    • Wymagane w przypadku używania pomocników rozpoznawania dpi w celu uzyskania bieżącego dpi.

Jak mogę napisać nowy interfejs użytkownika WPF?

  1. Zacznij od dodania odwołań do zestawu wymaganych w powyższej sekcji pierwszych kroków do projektu. Nie musisz dodawać wszystkich z nich, więc dodaj tylko potrzebne odwołania. (Uwaga: jeśli używasz lub masz dostęp do Kolory zamiast pędzli, a następnie można pominąć odwołanie do narzędzi, ponieważ nie będzie potrzebny konwerter.

  2. Wybierz żądany obraz i pobierz jego pseudonim. Użyj obiektu KnownMoniker lub użyj własnego, jeśli masz własne niestandardowe obrazy i elementy monikers.

  3. Dodaj crispImages do kodu XAML. (Zobacz poniższy przykład).

  4. Ustaw właściwość ImageThemingUtilities.ImageBackgroundColor w hierarchii interfejsu użytkownika. (Należy to ustawić w lokalizacji, w której jest znany kolor tła, niekoniecznie na CrispImage.) (zobacz poniższy przykład).

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

Jak mogę zaktualizować istniejący interfejs użytkownika WPF?

Aktualizowanie istniejącego interfejsu użytkownika WPF jest stosunkowo prostym procesem składającym się z trzech podstawowych kroków:

  1. Zastąp wszystkie <elementy obrazu> w interfejsie użytkownika elementami <CrispImage> .

  2. Zmień wszystkie atrybuty źródłowe na Atrybuty Moniker.

    • Jeśli obraz nigdy się nie zmienia i używasz metody KnownMonikers, statycznie powiąż te właściwości z elementem KnownMoniker. (Zobacz powyższy przykład).

    • Jeśli obraz nigdy się nie zmienia i używasz własnego obrazu niestandardowego, statycznie powiązać z własnym monikerem.

    • Jeśli obraz może ulec zmianie, powiąż atrybut Moniker z właściwością kodu, która powiadamia o zmianach właściwości.

  3. Gdzieś w hierarchii interfejsu użytkownika ustaw wartość ImageThemingUtilities.ImageBackgroundColor , aby upewnić się, że inwersja kolorów działa poprawnie.

    • Może to wymagać użycia klasy BrushToColorConverter . (Zobacz powyższy przykład).

Jak mogę zaktualizować interfejs użytkownika win32?

Dodaj następujący kod wszędzie tam, gdzie jest to właściwe, aby zastąpić nieprzetworzone ładowanie obrazów. Przełącz wartości dla zwracania HBITMAPs a HICON i HIMAGELIST zgodnie z potrzebami.

Pobieranie usługi obrazów

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

Żądanie obrazu

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

Jak mogę zaktualizować interfejs użytkownika winforms?

Dodaj następujący kod wszędzie tam, gdzie jest to właściwe, aby zastąpić nieprzetworzone ładowanie obrazów. Przełącz wartości dla zwracania map bitowych i ikon zgodnie z potrzebami.

Pomocna instrukcja using

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

Pobieranie usługi obrazów

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

Żądanie obrazu

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

Jak mogę używać monikers obrazów w nowym oknie narzędzi?

Szablon projektu pakietu VSIX został zaktualizowany dla programu Visual Studio 2015. Aby utworzyć nowe okno narzędzia, kliknij prawym przyciskiem myszy projekt VSIX i wybierz polecenie Dodaj>nowy element (Ctrl+Shift+A). W węźle Rozszerzalność języka projektu wybierz pozycję Okno narzędzi niestandardowych, nadaj okno narzędzia nazwę i naciśnij przycisk Dodaj .

Są to kluczowe miejsca do używania monikers w oknie narzędzi. Postępuj zgodnie z instrukcjami dla każdego z nich:

  1. Karta okna narzędzi, gdy karty są wystarczająco małe (używane również w przełączniku okna tabulacji Ctrl+).

    Dodaj ten wiersz do konstruktora klasy pochodzącej z typu ToolWindowPane :

    // Replace this KnownMoniker with your desired ImageMoniker
    this.BitmapImageMoniker = KnownMonikers.Blank;
    
  2. Polecenie, aby otworzyć okno narzędzia.

    .vsct W pliku pakietu edytuj przycisk polecenia okna narzędzi:

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

    Upewnij się, że w górnej części pliku <Extern> istnieją również następujące elementy:

    <Include href="KnownImageIds.vsct"/>
    

Jak mogę używać monikers obrazów w istniejącym oknie narzędzi?

Aktualizowanie istniejącego okna narzędzi w celu używania monikers obrazów jest podobne do kroków tworzenia nowego okna narzędzi.

Są to kluczowe miejsca do używania monikers w oknie narzędzi. Postępuj zgodnie z instrukcjami dla każdego z nich:

  1. Karta okna narzędzi, gdy karty są wystarczająco małe (używane również w przełączniku okna tabulacji Ctrl+).

    1. Usuń te wiersze (jeśli istnieją) w konstruktorze klasy pochodzącej z typu ToolWindowPane :

      this.BitmapResourceID = <Value>;
      this.BitmapIndex = <Value>;
      
    2. Zobacz krok 1 sekcji "Jak mogę use image monikers in a new tool window?" (Jak mogę użyj monikers obrazów w nowym oknie narzędzia?" powyżej.

  2. Polecenie, aby otworzyć okno narzędzia.

    • Zobacz krok 2 sekcji "Jak mogę use image monikers in a new tool window?" (Jak mogę używać monikers obrazów w nowym oknie narzędzi?" powyżej.

Jak mogę używać monikers obrazów w pliku vsct?

.vsct Zaktualizuj plik zgodnie z poniższymi komentarzami:

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

Co zrobić, jeśli mój plik vsct musi być również odczytany przez starsze wersje programu Visual Studio?

Starsze wersje programu Visual Studio nie rozpoznają flagi polecenia IconIsMoniker . Możesz używać obrazów z usługi obrazów w wersjach programu Visual Studio, które go obsługują, ale nadal używać obrazów starego stylu w starszych wersjach programu Visual Studio. W tym celu pozostawisz .vsct plik bez zmian (i dlatego jest zgodny ze starszymi wersjami programu Visual Studio) i utworzysz plik CSV (wartości rozdzielone przecinkami) mapowany z par identyfikatorów GUID/ID zdefiniowanych w .vsct elemencie Mapy bitowe> pliku <na pary identyfikatorów GUID/ID obrazu.

Format pliku CSV mapowania to:

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

Plik CSV jest wdrażany z pakietem, a jego lokalizacja jest określana przez właściwość IconMappingFilename atrybutu pakietu ProvideMenuResource:

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

IconMappingFilename to ścieżka względna niejawnie zakorzeniona w $PackageFolder$ (jak w powyższym przykładzie) lub ścieżka bezwzględna jawnie zakorzeniona w katalogu zdefiniowanym przez zmienną środowiskową, taką jak @"%UserProfile%\dir1\dir2\MyMappingFile.csv".

Jak mogę port systemu projektu?

Jak dostarczyć element ImageMonikers dla projektu

  1. Zaimplementuj VSHPROPID_SupportsIconMonikers w interfejsie IVsHierarchy projektu i zwróć wartość true.

  2. Zaimplementuj VSHPROPID_IconMonikerImageList (jeśli oryginalny projekt używał VSHPROPID_IconImgList) lub VSHPROPID_IconMonikerGuid, VSHPROPID_IconMonikerId, VSHPROPID_OpenFolderIconMonikerGuid, VSHPROPID_OpenFolderIconMonikerId (jeśli oryginalny projekt używał VSHPROPID_IconHandle i VSHPROPID_OpenFolderIconHandle).

  3. Zmień implementację oryginalnych identyfikatorów VSHPROPID dla ikon, aby utworzyć "starsze" wersje ikon, jeśli punkty rozszerzenia ich zażądają. Usługa IVsImageService2 udostępnia funkcje niezbędne do pobrania tych ikon

    Dodatkowe wymagania dotyczące odmian projektów VB/C#

    Zaimplementuj VSHPROPID_SupportsIconMonikers tylko wtedy, gdy wykryjesz, że projekt jest najbardziej zewnętrznym smakiem. W przeciwnym razie rzeczywisty najbardziej zewnętrzny smak może nie obsługiwać monikers obrazów w rzeczywistości, a twój podstawowy smak może skutecznie "ukryć" dostosowane obrazy.

    Jak mogę używać monikers obrazów w CPS?

    Ustawianie obrazów niestandardowych w programie CPS (common Project System) można wykonać ręcznie lub za pomocą szablonu elementu dostarczanego z zestawem SDK rozszerzalności systemu project.

    Korzystanie z zestawu PROJECT System Extensibility SDK

    Postępuj zgodnie z instrukcjami podanymi w temacie Udostępnianie ikon niestandardowych dla typu projektu/typu elementu, aby dostosować obrazy CPS. Więcej informacji na temat cpS można znaleźć w dokumentacji rozszerzalności programu Visual Studio Project System

    Ręczne używanie elementu ImageMonikers

  4. Zaimplementuj i wyeksportuj interfejs IProjectTreeModifier w systemie projektu.

  5. Ustal, którego nazwy znaneMoniker lub niestandardowego obrazu chcesz użyć.

  6. W metodzie ApplyModifications wykonaj następujące czynności w metodzie przed zwróceniem nowego drzewa, podobnie jak w poniższym przykładzie:

    // Replace this KnownMoniker with your desired ImageMoniker
    tree = tree.SetIcon(KnownMonikers.Blank.ToProjectSystemType());
    
  7. Jeśli tworzysz nowe drzewo, możesz ustawić obrazy niestandardowe, przekazując żądane elementy monikers do metody NewTree, podobnie jak w poniższym przykładzie:

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

Jak mogę przekonwertować z rzeczywistego paska obrazu na pasek obrazu oparty na moniker?

Muszę wspierać HIMAGELISTs

Jeśli istnieje już istniejący pasek obrazów dla kodu, który chcesz zaktualizować w celu korzystania z usługi obrazów, ale masz ograniczenie przez interfejsy API, które wymagają przekazywania list obrazów, nadal możesz uzyskać korzyści z usługi obrazów. Aby utworzyć pasek obrazów oparty na moniker, wykonaj poniższe kroki, aby utworzyć manifest na podstawie istniejących elementów monikers.

  1. Uruchom narzędzie ManifestFromResources, przekazując go do paska obrazu. Spowoduje to wygenerowanie manifestu dla paska.

    • Zalecane: podaj inną niż domyślną nazwę manifestu, aby odpowiadała jego użyciu.
  2. Jeśli używasz tylko znanychmonikers, wykonaj następujące czynności:

    • Zastąp sekcję <Obrazy> manifestu obrazami </>.

    • Usuń wszystkie identyfikatory podobrazów (wszystkie elementy z <nazwą>_##) elementu imagestrip.

    • Zalecane: zmień nazwę symbolu AssetsGuid i symbolu paska obrazu, aby dopasować go do jego użycia.

    • Zastąp identyfikator GUID każdego obiektu ContainedImage wartością $(ImageCatalogGuid), zastąp każdy identyfikator ZawarteImage wartością $(<moniker>) i dodaj atrybut External="true" do każdego atrybutu ContainedImage

      • <element moniker> powinien zostać zastąpiony ciągiem KnownMoniker zgodnym z obrazem, ale ciągiem "KnownMonikers".
    • Dodaj <ścieżkę dir import Manifest="$(ManifestFolder)\<Relative install dir path to *>\Microsoft.VisualStudio.ImageCatalog.imagemanifest" /*> w górnej <części sekcji Symbole> .

      • Ścieżka względna jest określana przez lokalizację wdrożenia zdefiniowaną w konfiguracji tworzenia manifestu.
  3. Uruchom narzędzie ManifestToCode, aby wygenerować otoki, aby istniejący kod miał pseudonim, którego może użyć do wykonywania zapytań dotyczących usługi obrazów dla paska obrazów.

    • Zalecane: podaj nazwy niezdefinicyjne dla otoek i przestrzeni nazw, aby odpowiadały ich użyciu.
  4. Wykonaj wszystkie czynności związane z dodawaniem, konfigurowaniem tworzenia/wdrażaniem i innymi zmianami kodu, aby pracować z usługą obrazów i nowymi plikami.

    Przykładowy manifest zawierający obrazy wewnętrzne i zewnętrzne, aby zobaczyć, jak powinien wyglądać:

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

Nie muszę wspierać HIMAGELISTs

  1. Określ zestaw znanychmonikerów, które pasują do obrazów w pasku obrazu, lub utwórz własne elementy monikers dla obrazów na pasku obrazów.

  2. Zaktualizuj dowolne mapowanie użyte do pobrania obrazu na wymaganym indeksie na pasku obrazów, aby zamiast tego użyć obiektów monikers.

  3. Zaktualizuj kod, aby używał usługi obrazów do żądania monikers za pośrednictwem zaktualizowanego mapowania. (Może to oznaczać aktualizację do CrispImages dla kodu zarządzanego lub żądania HBITMAPs lub HICON z usługi obrazów i przekazywanie ich do kodu natywnego.

Testowanie obrazów

Aby przetestować manifesty obrazów, możesz użyć narzędzia Przeglądarka biblioteki obrazów, aby upewnić się, że wszystko zostało poprawnie utworzone. Narzędzie można znaleźć w zestawie Visual Studio 2015 SDK. Dokumentację tego narzędzia i innych można znaleźć tutaj.

Dodatkowe zasoby

Przykłady

Zaktualizowano kilka przykładów programu Visual Studio w witrynie GitHub, aby pokazać, jak używać usługi obrazów w ramach różnych punktów rozszerzalności programu Visual Studio.

Sprawdź http://github.com/Microsoft/VSSDK-Extensibility-Samples najnowsze przykłady.

Narzędzia

Utworzono zestaw narzędzi pomocy technicznej dla usługi obrazów, który pomaga w tworzeniu/aktualizowaniu interfejsu użytkownika, który współpracuje z usługą obrazów. Aby uzyskać więcej informacji na temat każdego narzędzia, zapoznaj się z dokumentacją dostarczaną z narzędziami. Narzędzia są dołączone do zestawu Visual Studio 2015 SDK.

ManifestFromResources

Narzędzie Manifest z zasobów pobiera listę zasobów obrazu (PNG lub XAML) i generuje plik manifestu obrazu do używania tych obrazów z usługą obrazów.

ManifestToCode

Narzędzie Manifest to Code pobiera plik manifestu obrazu i generuje plik otoki do odwoływania się do wartości manifestu w kodzie (C++, C#lub VB) lub .vsct plikach.

ImageLibraryViewer

Narzędzie Przeglądarka bibliotek obrazów może ładować manifesty obrazów i umożliwia użytkownikowi manipulowanie nimi w taki sam sposób, jak program Visual Studio, aby upewnić się, że manifest jest poprawnie utworzony. Użytkownik może zmienić tło, rozmiary, ustawienie DPI, duży kontrast i inne ustawienia. Wyświetla również informacje o ładowaniu w celu znalezienia błędów w manifestach i wyświetla informacje o źródle dla każdego obrazu w manifeście.

Często zadawane pytania

  • Czy istnieją zależności, które należy uwzględnić podczas ładowania <odwołania Include="Microsoft.VisualStudio.*. Interop.14.0.DesignTime" />?

    • Ustaw wartość EmbedInteropTypes="true" we wszystkich bibliotekach DLL międzyoperacyjności.
  • Jak mogę wdrożyć manifest obrazu z moim rozszerzeniem?

    • .imagemanifest Dodaj plik do projektu.

    • Ustaw wartość "Include in VSIX" (Uwzględnij w VSIX) na true.

  • Moje obrazy nadal nie działają, jak dowiedzieć się, co jest złe?

    • Program Visual Studio może nie znajdować manifestu obrazu. Ze względu na wydajność program Visual Studio ogranicza głębokość wyszukiwania folderów, dlatego zalecane jest, aby manifest obrazu był przechowywany w folderze głównym rozszerzenia.

    • Być może brakuje informacji o zestawie w pliku manifestu obrazu. Zestawy, które są silnie nazwane, wymagają dodatkowych informacji w celu załadowania przez program Visual Studio. Aby załadować silnie nazwany zestaw, należy uwzględnić (oprócz nazwy zestawu) wersję zestawu i token klucza publicznego w identyfikatorach URI zasobów dla obrazów w manifeście obrazu.

      <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>
      
    • Być może brakuje wpisu bazy kodu dla zestawu obrazów. Jeśli zestaw nie został jeszcze załadowany przez czas, w którym program Visual Studio go potrzebuje, będzie musiał wiedzieć, gdzie znaleźć zestaw, aby go załadować. Aby dodać bazę kodu dla zestawu, możesz użyć atrybutu ProvideCodeBaseAttribute, aby upewnić się, że wpis bazy kodu jest generowany i uwzględniony w pliku pkgdef rozszerzenia.

      [assembly: ProvideCodeBase(AssemblyName = "ClassLibrary1", Version = "1.0.0.0", CodeBase = "$PackageFolder$\\ClassLibrary1.dll")]
      
    • Jeśli poprzednie opcje nie rozwiążą problemu z ładowaniem obrazu, możesz włączyć rejestrowanie, upuszczając następujące wpisy do pliku pkgdef w rozszerzeniu:

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

      Spowoduje to utworzenie pliku dziennika o nazwie ImageLibrary.log w folderze %UserProfile%. Pamiętaj, aby uruchomić polecenie "devenv /updateConfiguration" z wiersza polecenia dewelopera po dodaniu tych wpisów do pliku pkgdef. Dzięki temu wpisy rejestrowania są włączone i program VS odświeża pamięć podręczną manifestu obrazu, aby ułatwić znalezienie błędów, które mogą wystąpić podczas odczytywania manifestu obrazu. Jeśli następnie przejdziesz przez scenariusz, w którym obraz ma zostać załadowany, plik dziennika będzie zawierać zarówno rejestrowanie rejestracji, jak i rejestrowanie żądań dla obrazu.

  • Aktualizuję system projektu CPS. Co się stało z elementami ImageName i StockIconService?

    • Zostały one usunięte, gdy cpS został zaktualizowany do korzystania z monikers. Nie musisz już wywoływać metody StockIconService. Wystarczy przekazać żądany element KnownMoniker do metody lub właściwości przy użyciu metody rozszerzenia ToProjectSystemType() w narzędziach CPS. Mapowanie z ImageName na ZnaneMonikers można znaleźć poniżej:

      Nazwa obrazu ZnanyMoniker
      ImageName.OfflineWebApp KnownImageIds.Web
      ImageName.WebReferencesFolder KnownImageIds.Web
      ImageName.OpenReferenceFolder ZnaneImageIds.FolderOtwórz
      ImageName.ReferenceFolder KnownImageIds.Reference
      ImageName.Reference KnownImageIds.Reference
      ImageName.SdlWebReference KnownImageIds.WebReferenceFolder
      ImageName.DiscoWebReference KnownImageIds.DynamicDiscoveryDocument
      ImageName.Folder ZnaneImageIds.FolderClosed
      ImageName.OpenFolder ZnaneImageIds.FolderOtwórz
      ImageName.ExcludedFolder KnownImageIds.HiddenFolderClosed
      ImageName.OpenExcludedFolder KnownImageIds.HiddenFolderOtwórz
      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 ZnaneImageIds.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
  • Aktualizuję mojego dostawcę listy uzupełniania. Jakie wartości KnownMonikers są zgodne ze starymi wartościami StandardGlyphGroup i StandardGlyph ?

    Nazwisko Nazwisko Nazwisko
    GlyphGroupClass GlyphItemPublic ClassPublic
    GlyphGroupClass GlyphItemInternal KlasaInternal
    GlyphGroupClass GlyphItemFriend KlasaInternal
    GlyphGroupClass GlyphItemProtected KlasaProtected
    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 DelegatePublic
    GlyphGroupDelegate GlyphItemInternal DelegateInternal
    GlyphGroupDelegate GlyphItemFriend DelegateInternal
    GlyphGroupDelegate GlyphItemProtected DelegateProtected
    GlyphGroupDelegate GlyphItemPrivate DelegatePrivate
    GlyphGroupDelegate GlyphItemShortcut DelegateShortcut
    GlyphGroupEnum GlyphItemPublic EnumerationPublic
    GlyphGroupEnum GlyphItemInternal WyliczenieInternal
    GlyphGroupEnum GlyphItemFriend WyliczenieInternal
    GlyphGroupEnum GlyphItemProtected WyliczenieProtected
    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 Zdarzenie chronione
    GlyphGroupEvent GlyphItemPrivate EventPrivate
    GlyphGroupEvent GlyphItemShortcut EventShortcut
    GlyphGroupException GlyphItemPublic ExceptionPublic
    GlyphGroupException GlyphItemInternal WyjątekInternal
    GlyphGroupException GlyphItemFriend WyjątekInternal
    GlyphGroupException GlyphItemProtected WyjątekOchroniony
    GlyphGroupException GlyphItemPrivate ExceptionPrivate
    GlyphGroupException GlyphItemShortcut ExceptionShortcut
    Pole GlyphGroup GlyphItemPublic FieldPublic
    Pole GlyphGroup GlyphItemInternal PoleInternal
    Pole GlyphGroup GlyphItemFriend PoleInternal
    Pole GlyphGroup GlyphItemProtected FieldProtected
    Pole GlyphGroup GlyphItemPrivate FieldPrivate
    Pole GlyphGroup 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 MakroInternal
    GlyphGroupMacro GlyphItemFriend MakroInternal
    GlyphGroupMacro GlyphItemProtected MakroChronione
    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 ModułInternal
    GlyphGroupModule GlyphItemFriend ModułInternal
    GlyphGroupModule GlyphItemProtected ModuleProtected
    GlyphGroupModule GlyphItemPrivate ModulePrivate
    GlyphGroupModule GlyphItemShortcut ModuleShortcut
    GlyphGroupNamespace GlyphItemPublic Przestrzeń nazwPublic
    GlyphGroupNamespace GlyphItemInternal Przestrzeń nazwInternal
    GlyphGroupNamespace GlyphItemFriend Przestrzeń nazwInternal
    GlyphGroupNamespace GlyphItemProtected Przestrzeń nazwProtected
    GlyphGroupNamespace GlyphItemPrivate Przestrzeń nazwPrivate
    GlyphGroupNamespace GlyphItemShortcut Przestrzeń nazwSzortcut
    GlyphGroupOperator GlyphItemPublic OperatorPublic
    GlyphGroupOperator GlyphItemInternal OperatorInternal
    GlyphGroupOperator GlyphItemFriend OperatorInternal
    GlyphGroupOperator GlyphItemProtected OperatorProtected
    GlyphGroupOperator GlyphItemPrivate OperatorPrivate
    GlyphGroupOperator GlyphItemShortcut OperatorShortcut
    GlyphGroupProperty GlyphItemPublic PropertyPublic
    GlyphGroupProperty GlyphItemInternal WłaściwośćInternal
    GlyphGroupProperty GlyphItemFriend WłaściwośćInternal
    GlyphGroupProperty GlyphItemProtected WłaściwośćProtected
    GlyphGroupProperty GlyphItemPrivate PropertyPrivate
    GlyphGroupProperty GlyphItemShortcut WłaściwośćShortcut
    GlyphGroupStruct GlyphItemPublic StructurePublic
    GlyphGroupStruct GlyphItemInternal StrukturaInternal
    GlyphGroupStruct GlyphItemFriend StrukturaInternal
    GlyphGroupStruct GlyphItemProtected StrukturaChroniona
    GlyphGroupStruct GlyphItemPrivate StructurePrivate
    GlyphGroupStruct GlyphItemShortcut StrukturaSzortcut
    GlyphGroupTemplate GlyphItemPublic TemplatePublic
    GlyphGroupTemplate GlyphItemInternal SzablonInternal
    GlyphGroupTemplate GlyphItemFriend SzablonInternal
    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
    Typ GlyphGroupType GlyphItemPublic TypePublic
    Typ GlyphGroupType GlyphItemInternal TypInternal
    Typ GlyphGroupType GlyphItemFriend TypInternal
    Typ GlyphGroupType GlyphItemProtected TypeProtected
    Typ GlyphGroupType GlyphItemPrivate TypePrivate
    Typ 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 PoleInternal
    GlyphGroupVariable GlyphItemFriend PoleInternal
    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 PoleInternal
    GlyphGroupJSharpField GlyphItemFriend PoleInternal
    GlyphGroupJSharpField GlyphItemProtected FieldProtected
    GlyphGroupJSharpField GlyphItemPrivate FieldPrivate
    GlyphGroupJSharpField GlyphItemShortcut FieldShortcut
    GlyphGroupJSharpClass GlyphItemPublic ClassPublic
    GlyphGroupJSharpClass GlyphItemInternal KlasaInternal
    GlyphGroupJSharpClass GlyphItemFriend KlasaInternal
    GlyphGroupJSharpClass GlyphItemProtected KlasaProtected
    GlyphGroupJSharpClass GlyphItemPrivate ClassPrivate
    GlyphGroupJSharpClass GlyphItemShortcut ClassShortcut
    GlyphGroupJSharpNamespace GlyphItemPublic Przestrzeń nazwPublic
    GlyphGroupJSharpNamespace GlyphItemInternal Przestrzeń nazwInternal
    GlyphGroupJSharpNamespace GlyphItemFriend Przestrzeń nazwInternal
    GlyphGroupJSharpNamespace GlyphItemProtected Przestrzeń nazwProtected
    GlyphGroupJSharpNamespace GlyphItemPrivate Przestrzeń nazwPrivate
    GlyphGroupJSharpNamespace GlyphItemShortcut Przestrzeń nazwSzortcut
    GlyphGroupJSharpInterface GlyphItemPublic InterfacePublic
    GlyphGroupJSharpInterface GlyphItemInternal InterfaceInternal
    GlyphGroupJSharpInterface GlyphItemFriend InterfaceInternal
    GlyphGroupJSharpInterface GlyphItemProtected InterfaceProtected
    GlyphGroupJSharpInterface GlyphItemPrivate InterfacePrivate
    GlyphGroupJSharpInterface GlyphItemShortcut InterfaceShortcut
    GlyphGroupError StatusError
    GlyphBscFile ClassFile
    GlyphAssembly Odwołanie
    GlyphLibrary Biblioteka
    GlyphVBProject VBProjectNode
    GlyphCoolProject CSProjectNode
    GlyphCppProject CPPProjectNode
    GlyphDialogId Dialog
    GlyphOpenFolder FolderOtwórz
    GlyphClosedFolder FolderKlosed
    GlyphArrow GoToNext
    GlyphCSharpFile CSFileNode
    GlyphCSharpExpansion Fragment kodu
    GlyphKeyword IntellisenseKeyword
    GlyphInformation StatusInformation
    GlyphReference ClassMethodReference
    GlyphRecursion Rekursja
    GlyphXmlItem Tag
    GlyphJSharpProject DocumentCollection
    GlyphJSharpDocument Dokument
    GlyphForwardType GoToNext
    GlyphCallersGraph CallTo
    GlyphCallGraph WywołanieZ
    GlyphWarning StatusWarning
    GlyphMaybeReference Znak zapytania
    GlyphMaybeCaller CallTo
    GlyphMaybeCall WywołanieZ
    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