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:
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
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?
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.
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.
Dodaj crispImages do kodu XAML. (Zobacz poniższy przykład).
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:
Zastąp wszystkie <elementy obrazu> w interfejsie użytkownika elementami <CrispImage> .
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.
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:
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;
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:
Karta okna narzędzi, gdy karty są wystarczająco małe (używane również w przełączniku okna tabulacji Ctrl+).
Usuń te wiersze (jeśli istnieją) w konstruktorze klasy pochodzącej z typu ToolWindowPane :
this.BitmapResourceID = <Value>; this.BitmapIndex = <Value>;
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.
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
Zaimplementuj VSHPROPID_SupportsIconMonikers w interfejsie IVsHierarchy projektu i zwróć wartość true.
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).
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
Zaimplementuj i wyeksportuj interfejs IProjectTreeModifier w systemie projektu.
Ustal, którego nazwy znaneMoniker lub niestandardowego obrazu chcesz użyć.
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());
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.
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.
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.
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.
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
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.
Zaktualizuj dowolne mapowanie użyte do pobrania obrazu na wymaganym indeksie na pasku obrazów, aby zamiast tego użyć obiektów monikers.
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