Share via


Agregar una lista usada más recientemente a un submenú

Este tutorial se basa en las demostraciones de Agregar un submenú a un menú y muestra cómo agregar una lista dinámica a un submenú. La lista dinámica constituye la base para crear una lista usada más recientemente (MRU).

Una lista de menús dinámico comienza con un marcador de posición en un menú. Cada vez que se muestra el menú, el entorno de desarrollo integrado (IDE) de Visual Studio solicita el VSPackage para todos los comandos que se deben mostrar en el marcador de posición. Una lista dinámica puede producirse en cualquier lugar de un menú. Sin embargo, las listas dinámicas suelen almacenarse y mostrarse por sí mismas en submenús o en la parte inferior de los menús. Al usar estos patrones de diseño, se habilita la lista dinámica de comandos para expandir y contraer sin afectar a la posición de otros comandos en el menú. En este tutorial, la lista de MRU dinámica se muestra en la parte inferior de un submenú existente, separado del resto del submenú por una línea.

Técnicamente, una lista dinámica también se puede aplicar a una barra de herramientas. Sin embargo, se desaconseja ese uso porque una barra de herramientas debe permanecer sin cambios a menos que el usuario realice pasos específicos para cambiarlo.

En este tutorial se crea una lista de MRU de cuatro elementos que cambian su orden cada vez que se selecciona uno de ellos (el elemento seleccionado se mueve a la parte superior de la lista).

Para obtener más información sobre los menús y los archivos .vsct , vea Comandos, menús y barras de herramientas.

Requisitos previos

Para seguir este tutorial, debe instalar SDK de Visual Studio. Para obtener más información, vea SDK de Visual Studio.

Creación de una extensión

  • Siga los procedimientos descritos en Adición de un submenú a un menú para crear el submenú que se modifica en los procedimientos siguientes.

    En los procedimientos de este tutorial se supone que el nombre del VSPackage es TestCommand, que es el nombre que se usa en Agregar un menú a la barra de menús de Visual Studio.

Crear un comando de lista de elementos dinámicos

  1. Abra TestCommandPackage.vsct.

  2. En la Symbols sección , en el GuidSymbol nodo denominado guidTestCommandPackageCmdSet, agregue el símbolo para el MRUListGroup grupo y el cmdidMRUList comando , como se indica a continuación.

    <IDSymbol name="MRUListGroup" value="0x1200"/>
    <IDSymbol name="cmdidMRUList" value="0x0200"/>
    
  3. En la Groups sección , agregue el grupo declarado después de las entradas de grupo existentes.

    <Group guid="guidTestCommandPackageCmdSet" id="MRUListGroup"
            priority="0x0100">
        <Parent guid="guidTestCommandPackageCmdSet" id="SubMenu"/>
    </Group>
    
  4. En la Buttons sección , agregue un nodo para representar el comando recién declarado, después de las entradas del botón 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>
    

    La DynamicItemStart marca permite que el comando se genere dinámicamente.

  5. Compile el proyecto e inicie la depuración para probar la presentación del nuevo comando.

    En el menú TestMenu , haga clic en el nuevo submenú, Sub Menu, para mostrar el nuevo comando, marcador de posición mrU. Después de implementar una lista dinámica de comandos de MRU en el siguiente procedimiento, esta etiqueta de comando se reemplazará por esa lista cada vez que se abra el submenú.

Rellenar la lista de MRU

  1. En TestCommandPackageGuids.cs, agregue las siguientes líneas después de los identificadores de comando existentes en la definición de clase TestCommandPackageGuids .

    public const string guidTestCommandPackageCmdSet = "00000000-0000-0000-0000-00000000"; // get the GUID from the .vsct file
    public const uint cmdidMRUList = 0x200;
    
  2. En TestCommand.cs , agregue la siguiente instrucción using.

    using System.Collections;
    
  3. Agregue el código siguiente en el constructor TestCommand después de la última llamada AddCommand. Se InitMRUMenu definirá más adelante.

    this.InitMRUMenu(commandService);
    
  4. Agregue el código siguiente en la clase TestCommand. Este código inicializa la lista de cadenas que representan los elementos que se van a mostrar en la 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. Después del InitializeMRUList método , agregue el InitMRUMenu método . Esto inicializa los comandos de menú de lista de 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);
        }
    }
    

    Debe crear un objeto de comando de menú para cada elemento posible en la lista mrU. El IDE llama al OnMRUQueryStatus método para cada elemento de la lista MRU hasta que no haya más elementos. En el código administrado, la única manera de que el IDE sepa que no hay más elementos es crear primero todos los elementos posibles. Si lo desea, puede marcar elementos adicionales como no visibles al principio mediante el uso mc.Visible = false; de después de crear el comando de menú. Estos elementos se pueden hacer visibles más adelante mediante mc.Visible = true; en el OnMRUQueryStatus método .

  6. Después del InitMRUMenu método , agregue el método siguiente OnMRUQueryStatus . Este es el controlador que establece el texto de cada elemento 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. Después del OnMRUQueryStatus método , agregue el método siguiente OnMRUExec . Este es el controlador para seleccionar un elemento MRU. Este método mueve el elemento seleccionado a la parte superior de la lista y, a continuación, muestra el elemento seleccionado en un cuadro de mensaje.

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

Prueba de la lista de MRU

  1. Compile la solución y comience la depuración.

  2. En el menú TestMenu , haga clic en Invocar testCommand. Al hacerlo, se muestra un cuadro de mensaje que indica que se seleccionó el comando.

    Nota:

    Este paso es necesario para forzar que VSPackage se cargue y muestre correctamente la lista de MRU. Si omite este paso, no se muestra la lista mrU.

  3. En el menú Probar , haga clic en Sub Menú. Se muestra una lista de cuatro elementos al final del submenú, debajo de un separador. Al hacer clic en Elemento 3, debería aparecer un cuadro de mensaje y mostrar el texto, Elemento seleccionado 3. (Si no se muestra la lista de cuatro elementos, asegúrese de que ha seguido las instrucciones del paso anterior).

  4. Vuelva a abrir el submenú. Observe que el elemento 3 está ahora en la parte superior de la lista y los demás elementos se han insertado en una posición. Vuelva a hacer clic en Elemento 3 y observe que el cuadro de mensaje sigue mostrando el elemento seleccionado 3, lo que indica que el texto se ha movido correctamente a la nueva posición junto con la etiqueta de comando.