Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este livro de receitas contém diretrizes e práticas recomendadas para adotar o Serviço de Imagem do Visual Studio e o Catálogo de Imagens introduzidos no Visual Studio 2015.
O serviço de imagem introduzido no Visual Studio 2015 permite que os desenvolvedores obtenham as melhores imagens para o dispositivo e o tema escolhido pelo usuário para exibir a imagem, incluindo o tema correto para o contexto em que eles são exibidos. A adoção do serviço de imagem ajudará a eliminar os principais pontos de dor relacionados à manutenção de ativos digitais, à escala HDPI e à personalização de temas.
| Problemas de hoje | Soluções |
|---|---|
| Mesclagem de cores de plano de fundo | Mesclagem alfa integrada |
| A aplicação de temas em (algumas) imagens | Metadados de tema |
| Modo de Alto Contraste | Recursos alternativos de alto contraste |
| Precisa de vários recursos para diferentes modos de DPI | Recursos selecionáveis com fallback baseado em vetor |
| Imagens duplicadas | Um identificador por conceito de imagem |
Por que adotar o serviço de imagem?
Sempre obtenha a mais recente imagem "pixel-perfect" do Visual Studio
Você pode enviar e usar suas próprias imagens
Não é necessário testar suas imagens quando o Windows adiciona o novo dimensionamento de DPI
Resolver obstáculos arquitetônicos antigos em suas implementações
A barra de ferramentas do shell do Visual Studio antes e depois de usar o serviço de imagem:
Como funciona
O serviço de imagem pode fornecer uma imagem em bitmap adequada para qualquer estrutura de interface do usuário suportada.
WPF: BitmapSource
WinForms: System.Drawing.Bitmap
Win32: HBITMAP
Diagrama de fluxo do serviço de imagem
Identificadores de imagem
Um moniker de imagem (ou simplesmente moniker) é um par GUID/ID que identifica de forma exclusiva um recurso de imagem ou um recurso de lista de imagens na biblioteca de imagens.
Apelidos conhecidos
O conjunto de monikers de imagem contido no Catálogo de Imagens do Visual Studio e consumível publicamente por qualquer componente ou extensão do Visual Studio.
Arquivos de manifesto de imagem
Os arquivos de manifesto de imagem (.imagemanifest) são arquivos XML que definem um conjunto de ativos de imagem, os monikers que representam esses ativos e a imagem real ou as imagens que representam cada ativo. Manifestos de imagem podem definir imagens autônomas ou listas de imagens para suporte à interface do usuário herdada. Além disso, há atributos que podem ser definidos no ativo ou nas imagens individuais por trás de cada ativo para alterar quando e como esses ativos são exibidos.
Esquema de manifesto de imagem
Um manifesto de imagem completo tem esta aparência:
<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>
Símbolos
Como um auxílio de leitura e manutenção, o manifesto da imagem pode usar símbolos para valores de atributo. Os símbolos são definidos da seguinte maneira:
<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>
| Subelemento | Definição |
|---|---|
| Import | Importa os símbolos do arquivo de manifesto fornecido para uso no manifesto atual |
| Guid | O símbolo representa um GUID e deve corresponder ao formato GUID. |
| ID | O símbolo representa uma ID e deve ser um inteiro nãonegativo |
| String | O símbolo representa um valor de cadeia de caracteres arbitrária |
Os símbolos são sensíveis a maiúsculas e minúsculas e são referenciados usando a sintaxe '$(symbol-name)':
<Image Guid="$(ShellCommandGuid)" ID="$(cmdidSaveAll)" >
<Source Uri="/$(AssemblyName);Component/Resources/image.xaml" />
</Image>
Alguns símbolos são predefinidos para todos os manifestos. Eles podem ser usados no atributo Uri do <elemento Source> ou <Import> para referenciar caminhos no computador local.
| Símbolo | Descrição |
|---|---|
| CommonProgramFiles | O valor da variável de ambiente %CommonProgramFiles% |
| LocalAppData | O valor da variável de ambiente %LocalAppData% |
| ManifestFolder | A pasta que contém o arquivo de manifesto |
| MyDocuments | O caminho completo da pasta Meus Documentos do usuário atual |
| ProgramFiles | O valor da variável de ambiente %ProgramFiles% |
| System | A pasta Windows\System32 |
| WinDir | O valor da variável de ambiente %WinDir% |
Imagem
O <elemento Image> define uma imagem que pode ser referenciada por um moniker. O GUID e o ID juntos formam o identificador de imagem. O moniker para a imagem deve ser exclusivo em toda a biblioteca de imagens. Se mais de uma imagem tiver um determinado moniker, a primeira encontrada ao construir a biblioteca é a que é mantida.
Ele deve conter pelo menos uma fonte. As fontes neutras em tamanho darão os melhores resultados em uma ampla gama de tamanhos, mas eles não são necessários. Se o serviço for solicitado a obter uma imagem de um tamanho não definido no <elemento Image> e não houver nenhuma origem neutra em tamanho, o serviço escolherá a melhor origem específica do tamanho e a dimensionará para o tamanho solicitado.
<Image Guid="guid" ID="int" AllowColorInversion="true/false">
<Source ... />
<!-- optional additional Source elements -->
</Image>
| Atributo | Definição |
|---|---|
| Guid | [Obrigatório] A parte GUID do identificador de imagem |
| ID | [Obrigatório] A parte da ID do moniker de imagem |
| PermitirInversãoDeCor | [Opcional, (true por padrão)] Indica se a imagem pode ter suas cores invertidas programaticamente quando usada em um fundo escuro. |
Fonte
O elemento <Source> define um único ativo de origem de imagem (XAML e PNG).
<Source Uri="uri" Background="background">
<!-- optional NativeResource element -->
</Source>
| Atributo | Definição |
|---|---|
| Uri | [Obrigatório] Um URI que define de onde a imagem pode ser carregada. Pode ser um dos seguintes: - Um URI de Pacote usando a autoridade application:/// - Uma referência de recurso absoluto de componente - Um caminho para um arquivo que contém um recurso nativo |
| Contexto | [Opcional] Indica em que tipo de plano de fundo a origem é destinada a ser usada. Pode ser um dos seguintes: Luz: A origem pode ser usada em um plano de fundo leve. Escuro: O recurso pode ser usado em um plano de fundo escuro. HighContrast: A origem pode ser usada em qualquer plano de fundo no modo de Alto Contraste. HighContrastLight: A origem pode ser usada em um plano de fundo claro no modo de Alto Contraste. HighContrastDark: A origem pode ser usada em um plano de fundo escuro no modo de Alto Contraste. Se o atributo Background for omitido, a origem poderá ser usada em qualquer plano de fundo. Se Plano de Fundo for Claro, Escuro, HighContrastLight ou HighContrastDark, as cores da origem nunca serão invertidas. Se o Background for omitido ou configurado como HighContrast, a inversão das cores da fonte será controlada pelo atributo AllowColorInversion da imagem. |
Um <elemento de origem> pode ter exatamente um dos seguintes subelementos opcionais:
| Elemento | Atributos (todos necessários) | Definição |
|---|---|---|
| <Tamanho> | Value | A origem será usada para imagens do tamanho especificado (em unidades de dispositivo). A imagem será quadrada. |
| <Intervalo de Tamanho> | TamanhoMínimo, TamanhoMáximo | A origem será usada para imagens de MinSize a MaxSize (em unidades de dispositivo), inclusive. A imagem será quadrada. |
| <Dimensões> | Largura, Altura | A fonte será usada para imagens da largura e altura fornecidas (em unidades do dispositivo). |
| <Faixa de Dimensão> | MinWidth, MinHeight, LarguraMáxima, AlturaMáxima |
A origem será usada para imagens da largura/altura mínima até a largura/altura máxima (em unidades de dispositivo) inclusive. |
Um <Elemento Source> também pode ter um subelemento <NativeResource> opcional, que define uma <Source> carregada a partir de um assembly nativo em vez de um assembly gerenciado.
<NativeResource Type="type" ID="int" />
| Atributo | Definição |
|---|---|
| Tipo | [Obrigatório] O tipo do recurso nativo, XAML ou PNG |
| ID | [Obrigatório] A parte inteira da ID do recurso nativo |
ImageList
O <elemento ImageList> define uma coleção de imagens que podem ser retornadas em uma única faixa. A faixa é construída sob demanda, conforme necessário.
<ImageList>
<ContainedImage Guid="guid" ID="int" External="true/false" />
<!-- optional additional ContainedImage elements -->
</ImageList>
| Atributo | Definição |
|---|---|
| Guid | [Obrigatório] A parte GUID do identificador de imagem |
| ID | [Obrigatório] A parte da ID do moniker de imagem |
| External | [Opcional, falso por padrão] Indica se o moniker de imagem faz referência a uma imagem no manifesto atual. |
O moniker para a imagem contida não precisa referenciar uma imagem definida no manifesto atual. Se a imagem contida não puder ser encontrada na biblioteca de imagens, uma imagem de espaço reservado em branco será usada em seu lugar.
Usando o serviço de imagem
Primeiras etapas (gerenciadas)
Para usar o serviço de imagem, você precisa adicionar referências a alguns ou a todos os seguintes assemblies ao seu projeto:
Microsoft.VisualStudio.ImageCatalog.dll
- Necessário se você usar o catálogo de imagens interno KnownMonikers.
Microsoft.VisualStudio.Imaging.dll
- Necessário se você usar CrispImage e ImageThemingUtilities na interface do usuário do WPF.
Microsoft.VisualStudio.Imaging.Interop.14.0.DesignTime.dll
Obrigatório se você usar os tipos ImageMoniker e ImageAttributes .
EmbedInteropTypes deve ser definido como true.
Microsoft.VisualStudio.Shell.Interop.14.0.DesignTime
Obrigatório se você usar o tipo IVsImageService2 .
EmbedInteropTypes deve ser definido como true.
Microsoft.VisualStudio.Utilities.dll
- Obrigatório se você usar o BrushToColorConverter para imageThemingUtilities.ImageBackgroundColor na interface do usuário do WPF.
Microsoft.VisualStudio.Shell.<VSVersion>.0
- Obrigatório se você usar o tipo IVsUIObject .
Microsoft.VisualStudio.Shell.Interop.10.0.dll
Necessário se você usar os auxiliares de interface do usuário relacionados ao WinForms.
EmbedInteropTypes deve ser definido como true
Primeiras etapas (nativas)
Para usar o serviço de imagem, você precisa incluir alguns ou todos os seguintes cabeçalhos ao seu projeto:
KnownImageIds.h
- Necessário se você usar o catálogo de imagens interno KnownMonikers, mas não puder usar o tipo ImageMoniker, como ao retornar valores de chamadas IVsHierarchy GetGuidProperty ou GetProperty.
KnownMonikers.h
- Necessário se você usar o catálogo de imagens interno KnownMonikers.
ImageParameters140.h
- Obrigatório se você usar os tipos ImageMoniker e ImageAttributes .
VSShell140.h
- Obrigatório se você usar o tipo IVsImageService2 .
ImageThemingUtilities.h
Necessário se você não conseguir permitir que o serviço de imagem faça o gerenciamento de temas para você.
Não use esse cabeçalho se o serviço de imagem puder lidar com o tema da imagem.
VsDpiAwareness.h
- Necessário se você usar os auxiliares de reconhecimento de DPI para obter o DPI atual.
Como fazer para escrever uma nova interface do usuário do WPF?
Comece adicionando as referências de assembly necessárias na seção de primeiras etapas acima ao seu projeto. Você não precisa adicionar todas elas, portanto, adicione apenas as referências necessárias. (Observação: se você estiver usando ou tiver acesso a Cores em vez de Pincéis, poderá ignorar a referência a Utilitários, já que não precisará do conversor.)
Selecione a imagem desejada e obtenha seu apelido. Utilize um KnownMoniker ou use seus próprios, caso tenha imagens e monikers personalizados.
Adicione CrispImages ao seu XAML. (Veja o exemplo abaixo.)
Defina a propriedade ImageThemingUtilities.ImageBackgroundColor em sua hierarquia de interface do usuário. (Isso deve ser definido no local onde a cor da tela de fundo é conhecida, não necessariamente no CrispImage.) (Veja o exemplo abaixo.)
<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>
Como fazer para atualizar a interface do usuário do WPF existente?
Atualizar a interface do usuário do WPF existente é um processo relativamente simples que consiste em três etapas básicas:
Substitua todos os <Image> na interface do usuário por <CrispImage>.
Altere todos os atributos de origem para atributos Moniker.
Se a imagem nunca for alterada e você estiver usando KnownMonikers, associe estaticamente essa propriedade ao KnownMoniker. (Consulte o exemplo acima.)
Se a imagem nunca for alterada e você estiver usando sua própria imagem personalizada, vincule-a estaticamente ao seu próprio identificador.
Se a imagem puder ser alterada, associe o atributo Moniker a uma propriedade de código que notifica sobre alterações de propriedade.
Em algum lugar na hierarquia da interface do usuário, defina ImageThemingUtilities.ImageBackgroundColor para garantir que a inversão de cores funcione corretamente.
- Isso pode exigir o uso da classe BrushToColorConverter . (Consulte o exemplo acima.)
Como atualizar a interface do usuário do Win32?
Adicione o seguinte ao código sempre que apropriado para substituir o carregamento bruto de imagens. Alterne valores para retornar HBITMAPs versus HICONs versus HIMAGELIST, conforme necessário.
Obter o serviço de imagem
CComPtr<IVsImageService2> spImgSvc;
CGlobalServiceProvider::HrQueryService(SID_SVsImageService, &spImgSvc);
Solicitando a imagem
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);
Como fazer para atualizar a interface do usuário do WinForms?
Adicione o seguinte ao código sempre que apropriado para substituir o carregamento bruto de imagens. Alterne valores para retornar Bitmaps versus Ícones, conforme necessário.
Instrução de uso útil
using GelUtilities = Microsoft.Internal.VisualStudio.PlatformUI.Utilities;
Obter o serviço de imagens
// This or your preferred way of querying for Visual Studio services
IVsImageService2 imageService = (IVsImageService2)Package.GetGlobalService(typeof(SVsImageService));
Solicitar a imagem
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
Como usar monikers de imagem em uma nova janela de ferramentas?
O modelo de projeto do pacote VSIX foi atualizado para o Visual Studio 2015. Para criar uma nova janela de ferramentas, clique com o botão direito do mouse no projeto VSIX e selecione Adicionar>Novo Item (Ctrl+Shift+A). No nó Extensibilidade do idioma do projeto, selecione Janela de Ferramentas Personalizada, atribua um nome à janela de ferramentas e pressione o botão Adicionar.
Esses são os principais pontos para usar monikers em uma janela de ferramentas. Siga as instruções para cada um:
A guia da janela de ferramentas quando as abas ficam pequenas o suficiente (também usado no alternador de janelas Ctrl+Tab).
Adicione essa linha ao construtor da classe que deriva do tipo ToolWindowPane :
// Replace this KnownMoniker with your desired ImageMoniker this.BitmapImageMoniker = KnownMonikers.Blank;O comando para abrir a janela de ferramentas.
No arquivo do pacote
.vsct, edite o botão de comando da janela de ferramenta:<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>Verifique se o seguinte também existe na parte superior do arquivo, depois dos
<Extern>elementos:<Include href="KnownImageIds.vsct"/>
Como usar identificadores de imagem em uma janela de ferramenta existente?
Atualizar uma janela de ferramenta existente para usar monikers de imagem é semelhante aos passos para criar uma nova janela de ferramenta.
Esses são os principais locais para usar monikers em uma janela de ferramentas. Siga as instruções para cada um:
A guia da janela de ferramentas quando as abas ficam suficientemente pequenas (também usado no comutador de janelas++Tab).
Remova essas linhas (se existirem) no construtor da classe que deriva do tipo ToolWindowPane :
this.BitmapResourceID = <Value>; this.BitmapIndex = <Value>;Veja a etapa nº 1 da seção "Como usar monikers de imagem em uma nova janela de ferramentas?" acima.
O comando para abrir a janela de ferramentas.
- Veja a etapa nº 2 da seção "Como usar monikers de imagem em uma nova janela de ferramentas?" acima.
Como posso usar monikers de imagem em um arquivo .vsct?
Atualize o .vsct arquivo conforme indicado pelas linhas comentadas abaixo:
<?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>
E se meu arquivo .vsct também precisar ser lido por versões mais antigas do Visual Studio?
As versões mais antigas do Visual Studio não reconhecem o sinalizador de comando IconIsMoniker . Você pode usar imagens do serviço de imagem em versões do Visual Studio que dão suporte a ela, mas continuar a usar imagens de estilo antigo em versões mais antigas do Visual Studio. Para fazer isso, você deixaria o arquivo .vsct inalterado (e, portanto, compatível com versões mais antigas do Visual Studio) e criaria um arquivo CSV (valores separados por vírgulas) que mapeia de pares GUID/ID definidos no elemento <>Bitmaps de um arquivo para pares GUID/ID do identificador de imagem.
O formato do arquivo CSV de mapeamento é:
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
O arquivo CSV é implantado com o pacote e sua localização é especificada pela propriedade IconMappingFilename do atributo de pacote ProvideMenuResource :
[ProvideMenuResource("MyPackage.ctmenu", 1, IconMappingFilename="IconMappings.csv")]
O IconMappingFilename é um caminho relativo implicitamente enraizado em $PackageFolder$ (como no exemplo acima) ou um caminho absoluto explicitamente enraizado em um diretório definido por uma variável de ambiente, como @"%UserProfile%\dir1\dir2\MyMappingFile.csv".
Como fazer para portar um sistema de projeto?
Como fornecer ImageMonikers para um projeto
Implemente VSHPROPID_SupportsIconMonikers no IVsHierarchy do projeto e retorne true.
Implemente VSHPROPID_IconMonikerImageList (se o projeto original usado VSHPROPID_IconImgList) ou VSHPROPID_IconMonikerGuid, VSHPROPID_IconMonikerId, VSHPROPID_OpenFolderIconMonikerGuid, VSHPROPID_OpenFolderIconMonikerId (se o projeto original usou VSHPROPID_IconHandle e VSHPROPID_OpenFolderIconHandle).
Altere a implementação dos VSHPROPIDs originais para ícones para criar versões "herdadas" dos ícones se os pontos de extensão os solicitarem. O IVsImageService2 fornece a funcionalidade necessária para obter esses ícones
Requisitos extras para as versões de projeto de VB/C#
Implemente VSHPROPID_SupportsIconMonikers somente se você detectar que seu projeto é o flavor mais externo. Caso contrário, o sabor mais externo real pode não dar suporte a apelidos de imagem na realidade, e seu sabor base pode efetivamente "ocultar" imagens personalizadas.
Como usar identificadores de imagem no CPS?
A configuração de imagens personalizadas no CPS (Common Project System) pode ser feita manualmente ou por meio de um modelo de item que vem com o SDK de Extensibilidade do Sistema de Projeto.
Usando o SDK de Extensibilidade do Sistema de Projeto
Siga as instruções em Fornecer ícones personalizados para o tipo Tipo de Projeto/Item para personalizar suas imagens do CPS. Mais informações sobre o CPS podem ser encontradas na documentação de extensibilidade do Visual Studio Project System
Usar manualmente ImageMonikers
Implemente e exporte a interface IProjectTreeModifier em seu sistema de projeto.
Determine qual KnownMoniker ou moniker de imagem personalizada você deseja usar.
No método ApplyModifications , faça o seguinte em algum lugar no método antes de retornar a nova árvore, semelhante ao exemplo abaixo:
// Replace this KnownMoniker with your desired ImageMoniker tree = tree.SetIcon(KnownMonikers.Blank.ToProjectSystemType());Se você estiver criando uma nova árvore, poderá definir as imagens personalizadas passando os apelidos desejados para o método NewTree, semelhante ao exemplo abaixo:
// 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);
Como converter uma tira de imagem real em uma tira de imagem baseada em moniker?
Preciso dar suporte a HIMAGELISTs
Se houver uma faixa de imagem já existente para o código que você deseja atualizar para usar o serviço de imagem, mas você estiver restrito por APIs que exigem a passagem de listas de imagens, você ainda poderá obter os benefícios do serviço de imagem. Para criar uma faixa de imagem baseada em moniker, siga as etapas abaixo para criar um manifesto com base em monikers existentes.
Execute a ferramenta ManifestFromResources, passando a faixa de imagem. Isso irá gerar um manifesto para o strip.
- Recomendado: forneça um nome não padrão para o manifesto para atender ao seu uso.
Se você estiver usando apenas KnownMonikers, faça o seguinte:
Substitua a <seção Imagens> do manifesto por <Imagens/>.
Remova todas as IDs de subimagem (qualquer coisa com <imagestrip name>_##).
Recomendado: renomeie o símbolo AssetsGuid e o símbolo de sequência de imagens para adequá-los ao seu uso.
Substitua o GUID de cada ContainedImage por $(ImageCatalogGuid), substitua a ID de cada ContainedImage por $(<moniker>) e adicione o atributo External="true" a cada ContainedImage
- <o moniker> deve ser substituído pelo KnownMoniker que corresponde à imagem, mas com "KnownMonikers." removido do nome.
Adicione <Import Manifest="$(ManifestFolder)\<Caminho relativo do diretório de instalação para *>\Microsoft.VisualStudio.ImageCatalog.imagemanifest" /*> ao topo da seção <Símbolos>.
- O caminho relativo é determinado pelo local de implantação definido na criação da instalação para o manifesto.
Execute a ferramenta ManifestToCode para gerar wrappers para que o código existente tenha um moniker que possa ser usado para consultar o serviço de imagem para a faixa de imagem.
- Recomendado: forneça nomes não padrão para que os wrappers e namespaces se adaptem ao seu uso.
Faça todas as adições, configuração de criação/implantação e outras alterações de código para trabalhar com o serviço de imagem e os novos arquivos.
Manifesto de exemplo, incluindo imagens internas e externas para ver como deve ser:
<?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>
Não preciso dar suporte a HIMAGELISTs
Determine o conjunto de KnownMonikers que correspondem às imagens em sua faixa de imagem ou crie seus próprios apelidos para as imagens na faixa de imagens.
Atualize o mapeamento usado para obter a imagem no índice necessário na faixa de imagens para usar os apelidos.
Atualize seu código para usar o serviço de imagem e solicitar identificadores através do mapeamento atualizado. (Isso pode significar atualizar para CrispImages para código gerenciado ou solicitar HBITMAPs ou HICONs do serviço de imagem e transferi-los para código nativo.)
Testando suas imagens
Você pode usar a ferramenta Visualizador da Biblioteca de Imagens para testar seus manifestos de imagem para garantir que tudo seja criado corretamente. Você pode encontrar a ferramenta no SDK do Visual Studio 2015. A documentação desta e de outras ferramentas pode ser encontrada aqui.
Recursos adicionais
Samples
Vários exemplos do Visual Studio no GitHub foram atualizados para mostrar como usar o serviço de imagem como parte de vários pontos de extensibilidade do Visual Studio.
Verifique http://github.com/Microsoft/VSSDK-Extensibility-Samples os exemplos mais recentes.
Tooling
Um conjunto de ferramentas de suporte para o Serviço de Imagem foi criado para ajudar na criação/atualização da interface do usuário que funciona com o Serviço de Imagem. Para obter mais informações sobre cada ferramenta, verifique a documentação que vem com as ferramentas. As ferramentas são incluídas como parte do SDK do Visual Studio 2015.
ManifestFromResources
A ferramenta Manifesto de Recursos usa uma lista de recursos de imagem (PNG ou XAML) e gera um arquivo de manifesto de imagem para usar essas imagens com o serviço de imagem.
ManifestToCode
A ferramenta Manifest to Code usa um arquivo de manifesto de imagem e gera um arquivo wrapper para referenciar os valores de manifesto no código (C++, C# ou VB) ou em .vsct arquivos.
ImageLibraryViewer
A ferramenta Visualizador da Biblioteca de Imagens pode carregar manifestos de imagem e permite que o usuário os manipule da mesma forma que o Visual Studio faria para garantir que o manifesto seja criado corretamente. O usuário pode alterar plano de fundo, tamanhos, configuração de DPI, Alto Contraste e outras configurações. Ele também exibe informações de carregamento para encontrar erros nos manifestos e exibe informações de origem para cada imagem no manifesto.
perguntas frequentes
Há dependências que você deve incluir ao carregar <Reference Include="Microsoft.VisualStudio.*.Interop.14.0.DesignTime" />?
- Defina EmbedInteropTypes="true" em todas as DLLs de interoperabilidade.
Como desplegar um manifesto de imagem com minha extensão?
Adicione o
.imagemanifestarquivo ao seu projeto.Defina "Incluir no VSIX" como Verdadeiro.
Minhas imagens ainda não estão funcionando, como faço para descobrir o que há de errado?
O Visual Studio pode não estar encontrando seu manifesto de imagem. Por motivos de desempenho, o Visual Studio limita a profundidade da pesquisa de pastas, portanto, é recomendável que o manifesto da imagem seja mantido na pasta raiz da extensão.
Você pode estar deixando de incluir informações de assembly no arquivo manifesto de imagem. Assemblies com nomes fortes exigem informações adicionais para serem carregados pelo Visual Studio. Para carregar um assembly fortemente nomeado, é necessário incluir (além do nome do assembly) a versão do assembly e o token de chave pública nos URIs de recurso para as imagens no manifesto da imagem.
<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>Talvez você esteja perdendo uma entrada de código-fonte para a assemblagem de imagem. Se o assembly ainda não estiver carregado quando o Visual Studio precisar dele, ele precisará saber onde encontrar seu assembly para carregá-lo. Para adicionar uma base de código para o assembly, você pode usar o ProvideCodeBaseAttribute para garantir que uma entrada de base de código seja gerada e incluída no pkgdef da sua extensão.
[assembly: ProvideCodeBase(AssemblyName = "ClassLibrary1", Version = "1.0.0.0", CodeBase = "$PackageFolder$\\ClassLibrary1.dll")]Se as opções anteriores não resolverem o problema de carga de imagem, você poderá habilitar o registro em log soltando as seguintes entradas em um pkgdef em sua extensão:
[$RootKey$\ImageLibrary] "TraceLevel"="Verbose" "TraceFilename"="ImageLibrary.log"Isso criará um arquivo de log chamado ImageLibrary.log na pasta %UserProfile%. Execute "devenv /updateConfiguration" em um prompt de comando do desenvolvedor depois de adicionar essas entradas a um pkgdef. Isso garante que as entradas de registro estejam habilitadas e que o Visual Studio atualize o cache de manifesto da imagem para facilitar a identificação de erros que possam ocorrer ao ler o manifesto da imagem. Se você então executar o cenário em que sua imagem deverá ser carregada, o arquivo de log conterá tanto o registro de registro quanto o registro de solicitação para sua imagem.
Estou atualizando meu Sistema de Projetos do CPS. O que aconteceu com ImageName e StockIconService?
Eles foram removidos quando o CPS foi atualizado para usar apelidos. Você não precisa mais chamar o StockIconService, basta passar o KnownMoniker desejado para o método ou propriedade usando o método de extensão ToProjectSystemType() nos utilitários CPS. Você pode encontrar um mapeamento de ImageName para KnownMonikers abaixo:
ImageName KnownMoniker ImageName.OfflineWebApp KnownImageIds.Web ImageName.WebReferencesFolder KnownImageIds.Web ImageName.OpenReferenceFolder KnownImageIds.FolderOpened ImageName.ReferenceFolder KnownImageIds.Reference ImageName.Reference KnownImageIds.Reference ImageName.SdlWebReference KnownImageIds.WebReferenceFolder ImageName.DiscoWebReference KnownImageIds.DynamicDiscoveryDocument ImageName.Folder KnownImageIds.FolderClosed ImageName.OpenFolder KnownImageIds.FolderOpened ImageName.ExcludedFolder KnownImageIds.HiddenFolderClosed ImageName.OpenExcludedFolder KnownImageIds.PastaOcultaAberta 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.ArquivoDeConfiguração 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 Propriedade KnownImageIds.Property ImageName.Data KnownImageIds.Database ImageName.Application KnownImageIds.Application ImageName.DataSet KnownImageIds.DatabaseGroup ImageName.Pfx KnownImageIds.Certificado ImageName.Snk KnownImageIds.Rule ImageName.VisualBasicProject KnownImageIds.VBProjectNode ImageName.CSharpProject KnownImageIds.CSProjectNode ImageName.Empty KnownImageIds.Blank ImageName.MissingFolder KnownImageIds.FolderOffline ImageName.SharedImportReference KnownImageIds.SharedProject ImageName.SharedProjectCs KnownImageIds.CSSharedProject ImageName.SharedProjectVc KnownImageIds.CPPSharedProject ImageName.SharedProjectJs KnownImageIds.JSSharedProject ImageName.CSharpCodeFile KnownImageIds.CSFileNode ImageName.VisualBasicCodeFile KnownImageIds.VBFileNode
Estou atualizando meu provedor de lista de conclusão. Quais KnownMonikers correspondem aos antigos valores de StandardGlyphGroup e StandardGlyph?
Nome Nome Nome GlyphGroupClass GlyphItemPublic ClassPublic GlyphGroupClass GlyphItemInternal ClassInternal GlyphGroupClass GlyphItemFriend ClassInternal GlyphGroupClass GlyphItemProtected ClasseProtegida 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 DelegateProtegido GlyphGroupDelegate GlyphItemPrivate DelegatePrivate GlyphGroupDelegate GlyphItemShortcut DelegateShortcut GlyphGroupEnum GlyphItemPublic EnumeraçãoPública GlyphGroupEnum GlyphItemInternal EnumerationInternal GlyphGroupEnum GlyphItemFriend EnumerationInternal GlyphGroupEnum GlyphItemProtected EnumerationProtected GlyphGroupEnum GlyphItemPrivate EnumerationPrivate GlyphGroupEnum GlyphItemShortcut AtalhoDeEnumeração GlyphGroupEnumMember GlyphItemPublic Item de Enumeração Público GlyphGroupEnumMember GlyphItemInternal EnumerationItemInternal GlyphGroupEnumMember GlyphItemFriend EnumerationItemInternal GlyphGroupEnumMember GlyphItemProtected EnumeraçãoItemProtegido GlyphGroupEnumMember GlyphItemPrivate EnumerationItemPrivate GlyphGroupEnumMember GlyphItemShortcut ItemDeEnumeraçãoAtalho GlyphGroupEvent GlyphItemPublic EventPublic GlyphGroupEvent GlyphItemInternal EventInternal GlyphGroupEvent GlyphItemFriend EventInternal GlyphGroupEvent GlyphItemProtected EventProtected GlyphGroupEvent GlyphItemPrivate EventPrivate GlyphGroupEvent GlyphItemShortcut EventShortcut GlyphGroupException GlyphItemPublic ExceptionPublic GlyphGroupException GlyphItemInternal ExceptionInternal GlyphGroupException GlyphItemFriend ExceptionInternal GlyphGroupException GlyphItemProtected ExceptionProtected GlyphGroupException GlyphItemPrivate ExceptionPrivate GlyphGroupException GlyphItemShortcut ExceptionShortcut GlyphGroupField GlyphItemPublic FieldPublic GlyphGroupField GlyphItemInternal FieldInternal GlyphGroupField GlyphItemFriend FieldInternal GlyphGroupField GlyphItemProtected CampoProtegido GlyphGroupField GlyphItemPrivate FieldPrivate GlyphGroupField GlyphItemShortcut FieldShortcut GlyphGroupInterface GlyphItemPublic InterfacePublic GlyphGroupInterface GlyphItemInternal InterfaceInternal GlyphGroupInterface GlyphItemFriend InterfaceInternal GlyphGroupInterface GlyphItemProtected InterfaceProtected GlyphGroupInterface GlyphItemPrivate InterfacePrivate GlyphGroupInterface GlyphItemShortcut InterfaceShortcut GlyphGroupMacro GlyphItemPublic MacroPublic GlyphGroupMacro GlyphItemInternal MacroInternal GlyphGroupMacro GlyphItemFriend MacroInternal GlyphGroupMacro GlyphItemProtected MacroProtegido GlyphGroupMacro GlyphItemPrivate MacroPrivate GlyphGroupMacro GlyphItemShortcut MacroShortcut GlyphGroupMap (Mapa de Grupos de Glifos) 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 Módulo Interno GlyphGroupModule GlyphItemFriend ModuleInternal GlyphGroupModule GlyphItemProtected MóduloProtegido GlyphGroupModule GlyphItemPrivate MóduloPrivado GlyphGroupModule GlyphItemShortcut ModuleShortcut GlyphGroupNamespace GlyphItemPublic NamespacePublic GlyphGroupNamespace GlyphItemInternal NamespaceInternal GlyphGroupNamespace GlyphItemFriend NamespaceInternal GlyphGroupNamespace GlyphItemProtected NamespaceProtected GlyphGroupNamespace GlyphItemPrivate NamespacePrivate GlyphGroupNamespace GlyphItemShortcut NamespaceShortcut GlyphGroupOperator GlyphItemPublic OperatorPublic GlyphGroupOperator GlyphItemInternal OperatorInternal GlyphGroupOperator GlyphItemFriend OperatorInternal GlyphGroupOperator GlyphItemProtected OperatorProtected GlyphGroupOperator GlyphItemPrivate OperatorPrivate GlyphGroupOperator GlyphItemShortcut OperatorShortcut GlyphGroupProperty GlyphItemPublic PropertyPublic GlyphGroupProperty GlyphItemInternal PropertyInternal GlyphGroupProperty GlyphItemFriend PropertyInternal GlyphGroupProperty GlyphItemProtected PropriedadeProtegida GlyphGroupProperty GlyphItemPrivate PropertyPrivate GlyphGroupProperty GlyphItemShortcut PropertyShortcut GlyphGroupStruct GlyphItemPublic EstruturaPública GlyphGroupStruct GlyphItemInternal EstruturaInterna GlyphGroupStruct GlyphItemFriend StructureInternal GlyphGroupStruct GlyphItemProtected EstruturaProtegida GlyphGroupStruct GlyphItemPrivate EstruturaPrivada GlyphGroupStruct GlyphItemShortcut Atalho de Estrutura GlyphGroupTemplate GlyphItemPublic TemplatePublic GlyphGroupTemplate GlyphItemInternal ModeloInterno GlyphGroupTemplate GlyphItemFriend TemplateInternal GlyphGroupTemplate GlyphItemProtected TemplateProtected GlyphGroupTemplate GlyphItemPrivate TemplatePrivate GlyphGroupTemplate GlyphItemShortcut TemplateShortcut GlyphGroupTypedef GlyphItemPublic TypeDefinitionPublic GlyphGroupTypedef GlyphItemInternal TypeDefinitionInternal GlyphGroupTypedef GlyphItemFriend TipoDefiniçãoInterno GlyphGroupTypedef GlyphItemProtected DefiniçãoDeTipoProtegido GlyphGroupTypedef GlyphItemPrivate TypeDefinitionPrivate GlyphGroupTypedef GlyphItemShortcut TypeDefinitionShortcut GlyphGroupType GlyphItemPublic TypePublic GlyphGroupType GlyphItemInternal TypeInternal GlyphGroupType GlyphItemFriend TypeInternal GlyphGroupType GlyphItemProtected TypeProtected GlyphGroupType GlyphItemPrivate TypePrivate GlyphGroupType GlyphItemShortcut TypeShortcut GlyphGroupUnion GlyphItemPublic UnionPublic GlyphGroupUnion GlyphItemInternal UnionInternal GlyphGroupUnion GlyphItemFriend UnionInternal GlyphGroupUnion GlyphItemProtected UnionProtected GlyphGroupUnion GlyphItemPrivate UnionPrivate GlyphGroupUnion GlyphItemShortcut UnionShortcut GlyphGroupVariable GlyphItemPublic FieldPublic GlyphGroupVariable GlyphItemInternal FieldInternal GlyphGroupVariable GlyphItemFriend FieldInternal GlyphGroupVariable GlyphItemProtected CampoProtegido 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 ObjetoProtegido GlyphGroupIntrinsic GlyphItemPrivate ObjectPrivate GlyphGroupIntrinsic GlyphItemShortcut ObjectShortcut GlyphGroupJSharpMethod GlyphItemPublic MethodPublic GlyphGroupJSharpMethod GlyphItemInternal MethodInternal GlyphGroupJSharpMethod GlyphItemFriend MethodInternal GlyphGroupJSharpMethod GlyphItemProtected MethodProtected GlyphGroupJSharpMethod GlyphItemPrivate MethodPrivate GlyphGroupJSharpMethod GlyphItemShortcut MethodShortcut GlyphGroupJSharpField GlyphItemPublic FieldPublic GlyphGroupJSharpField GlyphItemInternal FieldInternal GlyphGroupJSharpField GlyphItemFriend FieldInternal GlyphGroupJSharpField GlyphItemProtected CampoProtegido GlyphGroupJSharpField GlyphItemPrivate FieldPrivate GlyphGroupJSharpField GlyphItemShortcut FieldShortcut GlyphGroupJSharpClass GlyphItemPublic ClassPublic GlyphGroupJSharpClass GlyphItemInternal ClassInternal GlyphGroupJSharpClass GlyphItemFriend ClassInternal GlyphGroupJSharpClass GlyphItemProtected ClasseProtegida GlyphGroupJSharpClass GlyphItemPrivate ClassPrivate GlyphGroupJSharpClass GlyphItemShortcut ClassShortcut GlyphGroupJSharpNamespace GlyphItemPublic NamespacePublic GlyphGroupJSharpNamespace GlyphItemInternal NamespaceInternal GlyphGroupJSharpNamespace GlyphItemFriend NamespaceInternal GlyphGroupJSharpNamespace GlyphItemProtected NamespaceProtected GlyphGroupJSharpNamespace GlyphItemPrivate NamespacePrivate GlyphGroupJSharpNamespace GlyphItemShortcut NamespaceShortcut GlyphGroupJSharpInterface GlyphItemPublic InterfacePublic GlyphGroupJSharpInterface GlyphItemInternal InterfaceInternal GlyphGroupJSharpInterface GlyphItemFriend InterfaceInternal GlyphGroupJSharpInterface GlyphItemProtected InterfaceProtected GlyphGroupJSharpInterface GlyphItemPrivate InterfacePrivate GlyphGroupJSharpInterface GlyphItemShortcut InterfaceShortcut GlyphGroupError StatusError GlyphBscFile ClassFile GlyphAssembly Referência GlyphLibrary Biblioteca GlyphVBProject VBProjectNode GlyphCoolProject CSProjectNode GlyphCppProject CPPProjectNode GlyphDialogId Dialog GlyphOpenFolder PastaAberta GlyphClosedFolder PastaFechada GlyphArrow GoToNext GlyphCSharpFile CSFileNode GlyphCSharpExpansion Fragmento GlyphKeyword IntellisenseKeyword GlyphInformation Informações de Status GlifoReference ClassMethodReference GlifoRecursion Recursão GlyphXmlItem Etiqueta GlyphJSharpProject ColeçãoDeDocumentos GlyphJSharpDocument Documento GlyphForwardType GoToNext GlyphCallersGraph CallTo GlyphCallGraph CallFrom GlyphWarning StatusWarning GlyphMaybeReference QuestionMark GlyphMaybeCaller CallTo GlyphMaybeCall CallFrom GlyphExtensionMethod ExtensionMethod GlyphExtensionMethodInternal Método de Extensão (ExtensionMethod) GlyphExtensionMethodFriend Método de Extensão (ExtensionMethod) GlyphExtensionMethodProtected ExtensionMethod GlyphExtensionMethodPrivate ExtensionMethod GlyphExtensionMethodShortcut ExtensionMethod GlyphXmlAttribute XmlAttribute GlyphXmlChild XmlElement GlyphXmlDescendant XmlDescendant GlyphXmlNamespace XmlNamespace GlyphXmlAttributeQuestion XmlAttributeLowConfidence GlyphXmlAttributeCheck XmlAtributoAltaConfiança GlyphXmlChildQuestion XmlElementLowConfidence GlyphXmlChildCheck ElementoXmlAltaConfiança GlyphXmlDescendantQuestion XmlDescendantLowConfidence GlyphXmlDescendantCheck XmlDescendantAltaConfiança GlyphCompletionWarning IntellisenseWarning