Compartir a través de


Cómo: Agregar dinámicamente los elementos de menú

Un comando que se define en el archivo de configuración basado en la tabla de comandos (.vsct) y tiene el indicador de DynamicItemStart especifica una posición respecto a un menú donde incrustar los comandos creados dinámicamente. Crean cuando se inicia el paquete VSPackage asociado y pueden actualizarse a los comandos dinámicos normalmente cuando el Paquete está abierto.

Dos clases comunes de listas dinámicas son los siguientes:

  • Lista (MRU) de archivos usados recientemente, que muestra normalmente los nombres de los documentos que se han abierto recientemente.

  • Lista de Windows, que muestra normalmente los nombres de las ventanas que están abiertos.

El indicador de DynamicItemStart en una definición de comando especifica que el comando es marcador hasta que se abra el paquete VSPackage. Cuando se abre el Paquete, el marcador se reemplaza con 0 o más comandos creados en tiempo de ejecución por el paquete VSPackage y agregar a la lista dinámica. No puede ver la posición respecto al menú donde aparece la lista dinámica hasta que se abra el paquete VSPackage.

Para rellenar la lista dinámica, (IDE) el entorno de desarrollo integrado primero el paquete VSPackage para buscar un comando que tiene un identificador cuyos primeros caracteres son iguales que el identificador de marcador. Si el IDE encuentra un comando coincidente, agrega el nombre de comando a la lista dinámica. Después el IDE aumenta el identificador y busca otro comando coincidente de agregar a la lista dinámica. El IDE continuará aumentando el identificador y agregándolo a la lista dinámica hasta que no haya comandos dinámicos.

El primer procedimiento describe cómo crear una lista de archivos usados recientemente dinámica en un submenú.

El segundo procedimiento describe cómo rellenar una lista dinámica mediante el (MPF) managed package.

Para obtener más información sobre los archivos de .vsct, vea Tabla de comandos de Visual Studio (. archivos de Vsct).

Para obtener información sobre cómo crear una lista de archivos usados recientemente, vea tutorial: agregar una lista de archivos usados recientemente a un submenú.

crear una lista de comando dinámica

Para crear una lista de comando dinámica, debe agregar un elemento de Botn en el archivo de .vsct. Este elemento se convertirá en un marcador de posición de la lista en el IDE. A continuación implemente la propia lista en código.

para crear un marcador para una lista de comando dinámica

  1. En el archivo de .vsct, cree un submenú que contiene un grupo de comandos. Para obtener más información, vea Cómo: Crear menús, los submenús, y menús contextuales.

    este submenú contendrá la lista dinámica.

  2. En la sección de Symbols del archivo de .vsct, busque el elemento de GuidSymbol que contiene los otros comandos. agregue un elemento de IDSymbol para el grupo de MRUListGroup y el comando de cmdidMRUList para el marcador dinámico de la lista, como sigue.

  3. Defina un grupo, como sigue.

    <Group guid="guidTopLevelMenuCmdSet" id="MRUListGroup" priority="0x100">
      <Parent guid="guidTopLevelMenuCmdSet" id="SubMenu"/>
    </Group>
    
  4. defina el nuevo comando como elemento de Button en la sección de Buttons .

    1. establezca los campos de guid y de id a GUID: Par del identificador que representa el nuevo elemento. GUID: El par de identificador consta de los valores de name de los elementos de GuidSymbol y de IDSymbol del paso anterior.

      este GUID: El par de identificador es el primero en una lista de comandos dinámicos que se agregan en tiempo de ejecución por el paquete VSPackage. Cada comando dinámico subsiguiente tiene un identificador que es una unidad mayor que el identificador de comando dinámico anterior.

    2. establezca el atributo de type a Botn.

      Un comando dinámico tiene el botón de tipo como cualquier otro comando.

    3. no establezca un atributo de priority para el comando.

      Este submenú contiene sólo una lista dinámica. Por consiguiente, la prioridad del primer elemento no importa. los elementos dinámicos que se agregan más adelante tienen la misma prioridad; el orden en que se agrega cada dicta su posición relativa.

    4. Agregue un elemento de elemento primario que tiene guid y atributos de id que coinciden con los del grupo creado para el submenú.

    5. Agregue un elemento de Indicador de comando y establezca su valor en DynamicItemStart.

      Esto marca el comando como marcador de posición.

      Nota

      Se omiten todos los demás marcas.Si desea controlar la visibilidad de un elemento dinámico, debe hacerlo de Paquete en tiempo de ejecución.

    6. Agregue un elemento de Cadenas que contiene un elemento de ButtonText y un elemento de CommandName y establezca sus valores al nombre del marcador.

      Normalmente, este texto del botón no se considera si el paquete VSPackage puede inicializar la lista dinámica antes de que se muestre el menú que la contiene.

    7. no especifique un elemento de Icon .

      Un comando dinámico no puede tener un icono asociado.

    El ejemplo siguiente se muestra una definición de comando completa para un marcador de la lista de archivos usados recientemente.

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

implementar la lista dinámica

El (MPF) managed package utiliza controladores de eventos para ocultar los detalles de la interfaz de IOleCommandTarget y su método de QueryStatus . Para un VSPackage escrita con el MPF para admitir una lista dinámica de los comandos de menú, cree una lista de objetos de OleMenuCommand , que representa un elemento de la lista dinámica. Cada objeto de OleMenuCommand tiene el mismo controlador de eventos para ejecutar el comando y el mismo controlador de eventos para obtener el estado del comando.

Nota

el procedimiento siguiente utiliza código de tutorial: agregar una lista de archivos usados recientemente a un submenú para mostrar cómo implementar una lista dinámica.Sin embargo, el código no crea un Paquete completo.Para obtener un ejemplo completo, vea el tutorial.

para implementar una lista dinámica

  1. Agregue el identificador de la lista de los id. en PkgCmdID.cs.

    public const uint cmdidMRUList = 0x200;
    
  2. En TopLevelMenuPackage.cs agregue esto mediante la instrucción.

    using System.Collections;
    
  3. enlace el marcador a una instancia de OleMenuCommand y asignar a sus controladores de eventos. El método en el ejemplo siguiente se llama al método de Initialize() del paquete.

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

    Los ejemplos de este procedimiento se supone que las siguientes variables privadas se utilizan.

    private int numMRUItems = 4;
    private int baseMRUID = (int)PkgCmdIDList.cmdidMRUList;
    private ArrayList mruList;
    
  4. Utilice el controlador de eventos QueryStatus para rellenar la lista dinámica, como se muestra en el ejemplo siguiente.

    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;
            }
        }
    }
    
  5. Implemente el controlador Exec para responder cuando un elemento de la lista se haga clic en. El ejemplo siguiente actualiza la posición de los elementos de lista de modo que el más reciente aparece en la parte superior.

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

    También puede utilizar la propiedad de Text o la propiedad de CommandID para identificar qué elemento está seleccionado y responder según corresponda.

  6. Controlar la visibilidad de los elementos de menú del menú o individuales estableciendo la propiedad de Visible . el código siguiente hace un menú o un elemento de menú no visible.

    var menuCommand = sender as OleMenuCommand;
    menuCommand.Visible = false;
    

    Colocar el código anterior en el controlador QueryStatus aplicarla al menú completo porque proporciona el argumento de sender a ese controlador. Sin embargo, colocarlo en el controlador Exec afecta sólo al elemento de menú individual se ejecuta que.

Vea también

Conceptos

Cómo VSPackages agrega elementos de la interfaz de usuario al IDE

Otros recursos

comandos, menús, y barras de herramientas

Tareas comunes con los comandos, menús, barras de herramientas y