Compartilhar via


Adicionar uma lista usada mais recentemente a um submenu

Este passo a passo se baseia nas demonstrações em Adicionar um submenu a um menu e mostra como adicionar uma lista dinâmica a um submenu. A lista dinâmica forma a base para a criação de uma lista MRU (Most Recently Used).

Uma lista de menus dinâmica começa com um espaço reservado em um menu. Toda vez que o menu é mostrado, o ambiente de desenvolvimento integrado (IDE) do Visual Studio pede ao VSPackage todos os comandos que devem ser mostrados no espaço reservado. Uma lista dinâmica pode ocorrer em qualquer lugar de um menu. No entanto, as listas dinâmicas são normalmente armazenadas e exibidas por si mesmas em submenus ou na parte inferior dos menus. Usando esses padrões de design, você habilita a lista dinâmica de comandos para expandir e contrair sem afetar a posição de outros comandos no menu. Neste passo a passo, a lista MRU dinâmica é exibida na parte inferior de um submenu existente, separada do restante do submenu por uma linha.

Tecnicamente, uma lista dinâmica também pode ser aplicada a uma barra de ferramentas. No entanto, desencorajamos esse uso porque uma barra de ferramentas deve permanecer inalterada, a menos que o usuário tome medidas específicas para alterá-la.

Este passo a passo cria uma lista MRU de quatro itens que alteram sua ordem sempre que um deles é selecionado (o item selecionado se move para o topo da lista).

Para obter mais informações sobre menus e arquivos .vsct, consulte Comandos, menus e barras de ferramentas.

Pré-requisitos

Para seguir este passo a passo, você deve instalar o SDK do Visual Studio. Para obter mais informações, confira SDK do Visual Studio.

Criar uma extensão

  • Siga os procedimentos em Adicionando um submenu a um menu para criar o submenu modificado nos procedimentos a seguir.

    Os procedimentos neste passo a passo pressupõem que o nome do VSPackage é , que é o nome que é TestCommandusado em Adicionar um menu à barra de menus do Visual Studio.

Criar um comando de lista de itens dinâmicos

  1. Abra TestCommandPackage.vsct.

  2. Symbols Na seção , no GuidSymbol nó chamado guidTestCommandPackageCmdSet, adicione o símbolo para o grupo e o MRUListGroup cmdidMRUList comando, da seguinte maneira.

    <IDSymbol name="MRUListGroup" value="0x1200"/>
    <IDSymbol name="cmdidMRUList" value="0x0200"/>
    
  3. Groups Na seção , adicione o grupo declarado após as entradas de grupo existentes.

    <Group guid="guidTestCommandPackageCmdSet" id="MRUListGroup"
            priority="0x0100">
        <Parent guid="guidTestCommandPackageCmdSet" id="SubMenu"/>
    </Group>
    
  4. Buttons Na seção , adicione um nó para representar o comando recém-declarado, após as entradas de botão existentes.

    <Button guid="guidTestCommandPackageCmdSet" id="cmdidMRUList"
        type="Button" priority="0x0100">
        <Parent guid="guidTestCommandPackageCmdSet" id="MRUListGroup" />
        <CommandFlag>DynamicItemStart</CommandFlag>
        <Strings>
            <CommandName>cmdidMRUList</CommandName>
            <ButtonText>MRU Placeholder</ButtonText>
        </Strings>
    </Button>
    

    O DynamicItemStart sinalizador permite que o comando seja gerado dinamicamente.

  5. Crie o projeto e inicie a depuração para testar a exibição do novo comando.

    No menu TestMenu, clique no novo submenu, Submenu, para exibir o novo comando, MRU Placeholder. Depois que uma lista dinâmica de comandos MRU for implementada no próximo procedimento, esse rótulo de comando será substituído por essa lista sempre que o submenu for aberto.

Preenchendo a lista MRU

  1. Em TestCommandPackageGuids.cs, adicione as seguintes linhas após as IDs de comando existentes na definição de TestCommandPackageGuids classe.

    public const string guidTestCommandPackageCmdSet = "00000000-0000-0000-0000-00000000"; // get the GUID from the .vsct file
    public const uint cmdidMRUList = 0x200;
    
  2. Em TestCommand.cs adicione a seguinte instrução using.

    using System.Collections;
    
  3. Adicione o seguinte código no construtor TestCommand após a última chamada AddCommand. O InitMRUMenu será definido posteriormente

    this.InitMRUMenu(commandService);
    
  4. Adicione o seguinte código na classe TestCommand. Esse código inicializa a lista de cadeias de caracteres que representam os itens a serem mostrados na lista MRU.

    private int numMRUItems = 4;
    private int baseMRUID = (int)TestCommandPackageGuids.cmdidMRUList;
    private ArrayList mruList;
    
    private void InitializeMRUList()
    {
        if (null == this.mruList)
        {
            this.mruList = new ArrayList();
            if (null != this.mruList)
            {
                for (int i = 0; i < this.numMRUItems; i++)
                {
                    this.mruList.Add(string.Format(CultureInfo.CurrentCulture,
                        "Item {0}", i + 1));
                }
            }
        }
    }
    
  5. Após o método, adicione o InitializeMRUList InitMRUMenu método. Isso inicializa os comandos do menu de lista MRU.

    private void InitMRUMenu(OleMenuCommandService mcs)
    {
        InitializeMRUList();
        for (int i = 0; i < this.numMRUItems; i++)
        {
            var cmdID = new CommandID(
                new Guid(TestCommandPackageGuids.guidTestCommandPackageCmdSet), this.baseMRUID + i);
            var mc = new OleMenuCommand(
                new EventHandler(OnMRUExec), cmdID);
            mc.BeforeQueryStatus += new EventHandler(OnMRUQueryStatus);
            mcs.AddCommand(mc);
        }
    }
    

    Você deve criar um objeto de comando de menu para cada item possível na lista MRU. O IDE chama o OnMRUQueryStatus método para cada item na lista MRU até que não haja mais itens. No código gerenciado, a única maneira de o IDE saber que não há mais itens é criar todos os itens possíveis primeiro. Se desejar, você pode marcar itens adicionais como não visíveis no início usando mc.Visible = false; depois que o comando de menu for criado. Esses itens podem ser tornados visíveis mais tarde usando mc.Visible = true; o OnMRUQueryStatus método.

  6. Após o método, adicione o InitMRUMenu seguinte OnMRUQueryStatus método. Esse é o manipulador que define o texto para cada item MRU.

    private void OnMRUQueryStatus(object sender, EventArgs e)
    {
        OleMenuCommand menuCommand = sender as OleMenuCommand;
        if (null != menuCommand)
        {
            int MRUItemIndex = menuCommand.CommandID.ID - this.baseMRUID;
            if (MRUItemIndex >= 0 && MRUItemIndex < this.mruList.Count)
            {
                menuCommand.Text = this.mruList[MRUItemIndex] as string;
            }
        }
    }
    
  7. Após o método, adicione o OnMRUQueryStatus seguinte OnMRUExec método. Este é o manipulador para selecionar um item MRU. Esse método move o item selecionado para a parte superior da lista e, em seguida, exibe o item selecionado em uma caixa de mensagem.

    private void OnMRUExec(object sender, EventArgs e)
    {
        var menuCommand = sender as OleMenuCommand;
        if (null != menuCommand)
        {
            int MRUItemIndex = menuCommand.CommandID.ID - this.baseMRUID;
            if (MRUItemIndex >= 0 && MRUItemIndex < this.mruList.Count)
            {
                string selection = this.mruList[MRUItemIndex] as string;
                for (int i = MRUItemIndex; i > 0; i--)
                {
                    this.mruList[i] = this.mruList[i - 1];
                }
                this.mruList[0] = selection;
                System.Windows.Forms.MessageBox.Show(
                    string.Format(CultureInfo.CurrentCulture,
                                  "Selected {0}", selection));
            }
        }
    }
    

Testando a lista MRU

  1. Compile o projeto e comece a depuração.

  2. No menu TestMenu, clique em Invoke TestCommand. Isso exibe uma caixa de mensagem que indica que o comando foi selecionado.

    Observação

    Esta etapa é necessária para forçar o VSPackage a carregar e exibir corretamente a lista MRU. Se você ignorar esta etapa, a lista MRU não será exibida.

  3. No menu Menu de teste, clique em Submenu. Uma lista de quatro itens é exibida no final do submenu, abaixo de um separador. Quando você clica em Item 3, uma caixa de mensagem deve aparecer e exibir o texto, Item selecionado 3. (Se a lista de quatro itens não for exibida, verifique se você seguiu as instruções da etapa anterior.)

  4. Abra o submenu novamente. Observe que o item 3 está agora no topo da lista e os outros itens foram empurrados para baixo uma posição. Clique em Item 3 novamente e observe que a caixa de mensagem ainda exibe o Item 3 Selecionado, o que indica que o texto foi movido corretamente para a nova posição junto com o rótulo do comando.