Disponibilizando comandos

Quando vários VSPackages são adicionados ao Visual Studio, a interface do usuário (UI) pode ficar superlotada com comandos. Você pode programar seu pacote para ajudar a reduzir esse problema, da seguinte maneira:

  • Programe o pacote para que ele seja carregado somente quando um usuário exigir.

  • Programe o pacote para que seus comandos sejam exibidos somente quando forem necessários no contexto do estado atual do ambiente de desenvolvimento integrado (IDE).

Carregamento atrasado

A maneira típica de habilitar o carregamento atrasado é projetar o VSPackage para que seus comandos sejam exibidos na interface do usuário, mas o pacote em si não é carregado até que um usuário clique em um dos comandos. Para fazer isso, no arquivo .vsct, crie comandos que não tenham sinalizadores de comando.

O exemplo a seguir mostra a definição de um comando de menu de um arquivo .vsct. Este é o comando que é gerado pelo modelo de pacote do Visual Studio quando a opção de comando de menu no modelo é selecionada.

<Button guid="guidTopLevelMenuCmdSet" id="cmdidTestCommand" priority="0x0100" type="Button">
  <Parent guid="guidTopLevelMenuCmdSet" id="MyMenuGroup" />
  <Icon guid="guidImages" id="bmpPic1" />
  <Strings>
    <CommandName>cmdidTestCommand</CommandName>
    <ButtonText>Test Command</ButtonText>
  </Strings>
</Button>

No exemplo, se o grupo pai, , for filho de um menu de nível superior, como o menu Ferramentas, o comando ficará visível nesse menu, MyMenuGroupmas o pacote que executa o comando não será carregado até que o comando seja clicado por um usuário. No entanto, programando o comando para implementar a interface, você pode habilitar o pacote a IOleCommandTarget ser carregado quando o menu que contém o comando for expandido pela primeira vez.

Observe que o carregamento atrasado também pode melhorar o desempenho da inicialização.

Contexto atual e a visibilidade dos comandos

Você pode programar comandos VSPackage para serem visíveis ou ocultos, dependendo do estado atual dos dados VSPackage ou das ações que são relevantes no momento. Você pode habilitar o VSPackage para definir o estado de seus comandos, normalmente usando uma implementação do QueryStatus método da IOleCommandTarget interface, mas isso requer que o VSPackage seja carregado antes que ele possa executar o código. Em vez disso, recomendamos que você habilite o IDE para gerenciar a visibilidade dos comandos sem carregar o pacote. Para fazer isso, no arquivo .vsct, associe comandos a um ou mais contextos especiais da interface do usuário. Esses contextos de interface do usuário são identificados por um GUID conhecido como GUID de contexto de comando.

O Visual Studio monitora as alterações resultantes de ações do usuário, como carregar um projeto ou passar da edição para a compilação. À medida que as alterações ocorrem, a aparência do IDE é modificada automaticamente. A tabela a seguir mostra quatro contextos principais de alteração do IDE que o Visual Studio monitora.

Tipo de Contexto Descrição
Tipo de projeto ativo Para a maioria dos tipos de projeto, esse GUID valor é o mesmo que o GUID do VSPackage que implementa o projeto. No entanto, projetos do Visual C++ usam o tipo GUID de projeto como o valor.
Janela ativa Normalmente, essa é a última janela de documento ativo que estabelece o contexto atual da interface do usuário para associações de chave. No entanto, também pode ser uma janela de ferramenta que tenha uma tabela de vinculação de chave semelhante ao navegador da Web interno. Para janelas de documentos com várias guias, como o editor de HTML, cada guia tem um contexto GUIDde comando diferente.
Serviço de Idiomas Ativos O serviço de idioma associado ao arquivo que é exibido atualmente em um editor de texto.
Janela de ferramenta ativa Uma janela de ferramenta que está aberta e tem foco.

Uma quinta grande área de contexto é o estado da interface do usuário do IDE. Os contextos da interface do usuário são identificados por contextos GUIDde comando ativos, da seguinte maneira:

Esses GUIDs são marcados como ativos ou inativos, dependendo do estado atual do IDE. Vários contextos de interface do usuário podem estar ativos ao mesmo tempo.

Ocultar e exibir comandos com base no contexto

Você pode exibir ou ocultar um comando de pacote no IDE sem carregar o pacote em si. Para fazer isso, defina o comando no arquivo .vsct do pacote usando os DefaultDisabledsinalizadores de comando , DefaultInvisiblee e DynamicVisibility adicionando um ou mais elementos VisibilityItem à seção VisibilityConstraints . Quando um contexto GUID de comando especificado se torna ativo, o comando é exibido sem carregar o pacote.

GUIDs de contexto personalizados

Se um GUID de contexto de comando apropriado ainda não estiver definido, você poderá definir um em seu VSPackage e, em seguida, programá-lo para ser ativo ou inativo conforme necessário para controlar a visibilidade de seus comandos. Use o SVsShellMonitorSelection serviço para:

  • Registre GUIDs de contexto (chamando o GetCmdUIContextCookie método).

  • Obtenha o estado de um contexto GUID (chamando o IsCmdUIContextActive método).

  • Ative e desative os contextos GUID(chamando o SetCmdUIContext método).

    Cuidado

    Certifique-se de que seu VSPackage não afeta o estado de qualquer GUID de contexto existente, pois outros VSPackages podem depender deles.

Exemplo

O exemplo a seguir de um comando VSPackage demonstra a visibilidade dinâmica de um comando que é gerenciado por contextos de comando sem carregar o VSPackage.

O comando é definido para ser habilitado e exibido sempre que existir uma solução; ou seja, sempre que um dos seguintes GUIDs de contexto de comando estiver ativo:

No exemplo, observe que cada sinalizador de comando é um elemento Command Flag separado.

<Button guid="guidDynamicVisibilityCmdSet" id="cmdidMyCommand"
        priority="0x0100" type="Button">
  <Parent guid="guidDynamicVisibilityCmdSet" id="MyMenuGroup" />
  <Icon guid="guidImages" id="bmpPic1" />
  <CommandFlag>DefaultDisabled</CommandFlag>
  <CommandFlag>DefaultInvisible</CommandFlag>
  <CommandFlag>DynamicVisibility</CommandFlag>
  <Strings>
    <CommandName>cmdidMyCommand</CommandName>
    <ButtonText>My Command name</ButtonText>
  </Strings>
</Button>

Observe também que cada contexto de interface do usuário deve ser fornecido em um elemento separado VisibilityItem , da seguinte maneira.

<VisibilityConstraints>
  <VisibilityItem guid="guidDynamicVisibilityCmdSet"
                  id="cmdidMyCommand" context="UICONTEXT_EmptySolution" />
  <VisibilityItem guid="guidDynamicVisibilityCmdSet"
                      id="cmdidMyCommand" context="UICONTEXT_SolutionHasSingleProject" />
  <VisibilityItem guid="guidDynamicVisibilityCmdSet"
                  id="cmdidMyCommand" context="UICONTEXT_SolutionHasMultipleProjects" />
</VisibilityConstraints>