Algoritmo de enrutamiento de comandos

En los comandos de Visual Studio se controlan mediante varios componentes diferentes. Los comandos se enrutan desde el contexto más interno, que se basa en la selección actual, al contexto más externo (también conocido como global). Para obtener más información, consulte Disponibilidad de comandos.

Orden de resolución de comandos

Los comandos se pasan a través de los siguientes niveles de contexto de comandos:

  1. Complementos: el entorno ofrece primero el comando a los complementos que están presentes.

  2. Comandos de prioridad: estos comandos se registran mediante IVsRegisterPriorityCommandTarget. Se llama a para cada comando de Visual Studio y se llama en el orden en que se registraron.

  3. Comandos de menú contextual: primero se ofrece un comando ubicado en un menú contextual al destino de comandos que se proporciona al menú contextual y después al enrutamiento típico.

  4. Destinos de comando del conjunto de barras de herramientas: estos destinos de comando se registran cuando se llama a SetupToolbar2. El pCmdTarget parámetro puede ser null. Si no nulles , este destino de comando se usa para actualizar los comandos ubicados en la barra de herramientas que está configurando. Si el shell está configurando la barra de herramientas, pasa el marco de la ventana como para pCmdTarget que todas las actualizaciones de los comandos de la barra de herramientas fluyan a través del marco de la ventana, incluso cuando no está en el foco.

  5. Ventana de herramientas: las ventanas de herramientas, que normalmente implementan la IVsWindowPane interfaz, también deben implementar la IOleCommandTarget interfaz para que Visual Studio pueda obtener el destino del comando cuando la ventana de herramientas sea la ventana activa. Sin embargo, si la ventana de herramientas que tiene el foco es la ventana Proyecto , el comando se enruta a la IVsUIHierarchy interfaz que es el elemento primario común de los elementos seleccionados. Si esta selección abarca varios proyectos, el comando se enruta a la IVsSolution jerarquía. La IVsUIHierarchy interfaz contiene los QueryStatusCommand métodos y ExecCommand que son análogos a los comandos correspondientes de la IOleCommandTarget interfaz.

  6. Ventana documento: si el comando tiene la RouteToDocs marca establecida en su archivo .vsct , Visual Studio busca un destino de comando en el objeto de vista de documento, que es una instancia de una IVsWindowPane interfaz o una instancia de un objeto de documento (normalmente una IVsTextLines interfaz o una IVsTextBuffer interfaz). Si el objeto de vista de documento no admite el comando, Visual Studio enruta el comando a la IOleCommandTarget interfaz que se devuelve. (Se trata de una interfaz opcional para objetos de datos de documentos).

  7. Jerarquía actual: la jerarquía actual puede ser el proyecto que posee la ventana del documento activo o la jerarquía seleccionada en Explorador de soluciones. Visual Studio busca la IOleCommandTarget interfaz que se implementa en la jerarquía actual o activa. La jerarquía debe admitir comandos que sean válidos siempre que la jerarquía esté activa, incluso si una ventana de documento de un elemento de proyecto tiene el foco. Sin embargo, los comandos que solo se aplican cuando Explorador de soluciones tiene el foco deben admitirse mediante la IVsUIHierarchy interfaz y sus QueryStatusCommand métodos y ExecCommand .

    Los comandos Cut, Copy, Paste, Delete, Rename, Enter y DoubleClick requieren un control especial. Para obtener información sobre cómo controlar los comandos Delete y Remove en jerarquías, consulte la IVsHierarchyDeleteHandler interfaz .

  8. Global: si un comando no se ha controlado por los contextos mencionados anteriormente, Visual Studio intenta enrutarlo al VSPackage que posee un comando que implementa la IOleCommandTarget interfaz. Si el VSPackage aún no se ha cargado, no se carga cuando Visual Studio llama al QueryStatus método . VsPackage solo se carga cuando se llama al Exec método .