Hacer que los comandos estén disponibles
Cuando se agregan varios VSPackages a Visual Studio, la interfaz de usuario (UI) puede quedar superpuesta con comandos. Puede programar el paquete para ayudar a reducir este problema, como se indica a continuación:
Programe el paquete para que se cargue solo cuando un usuario lo requiera.
Programe el paquete para que sus comandos se muestren solo cuando puedan ser necesarios en el contexto del estado actual del entorno de desarrollo integrado (IDE).
Carga retrasada
La manera habitual de habilitar la carga retrasada es diseñar VSPackage para que sus comandos se muestren en la interfaz de usuario, pero el propio paquete no se carga hasta que un usuario haga clic en uno de los comandos. Para ello, en el archivo .vsct, cree comandos que no tengan marcas de comandos.
En el ejemplo siguiente se muestra la definición de un comando de menú de un archivo .vsct. Este es el comando generado por la plantilla de paquete de Visual Studio cuando se selecciona la opción Comando de menú de la plantilla.
<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>
En el ejemplo, si el grupo primario, MyMenuGroup
, es un elemento secundario de un menú de nivel superior, como el menú Herramientas , el comando estará visible en ese menú, pero el paquete que ejecuta el comando no se cargará hasta que un usuario haga clic en el comando. Sin embargo, mediante la programación del comando para implementar la IOleCommandTarget interfaz, puede permitir que el paquete se cargue cuando el menú que contiene el comando se expanda por primera vez.
Tenga en cuenta que la carga retrasada también puede mejorar el rendimiento de inicio.
Contexto actual y visibilidad de los comandos
Puede programar comandos VSPackage para que sean visibles o ocultos, en función del estado actual de los datos de VSPackage o de las acciones que son pertinentes actualmente. Puede habilitar VSPackage para establecer el estado de sus comandos, normalmente mediante una implementación del QueryStatus método desde la IOleCommandTarget interfaz, pero esto requiere que el VSPackage se cargue antes de poder ejecutar el código. En su lugar, se recomienda habilitar el IDE para administrar la visibilidad de los comandos sin cargar el paquete. Para ello, en el archivo .vsct, asocie comandos a uno o varios contextos de interfaz de usuario especiales. Estos contextos de interfaz de usuario se identifican mediante un GUID conocido como GUID de contexto de comando.
Visual Studio supervisa los cambios resultantes de acciones del usuario, como cargar un proyecto o pasar de editar a compilar. A medida que se producen cambios, la apariencia del IDE se modifica automáticamente. En la tabla siguiente se muestran cuatro contextos principales del cambio del IDE que Visual Studio supervisa.
Tipo de contexto | Descripción |
---|---|
Tipo de proyecto activo | Para la mayoría de los tipos de proyecto, este GUID valor es el mismo que el GUID del VSPackage que implementa el proyecto. Sin embargo, los proyectos de Visual C++ usan el tipo GUID de proyecto como valor. |
Ventana activa | Normalmente, esta es la última ventana de documento activa que establece el contexto actual de la interfaz de usuario para los enlaces de clave. Sin embargo, también podría ser una ventana de herramientas que tenga una tabla de enlace de claves similar al explorador web interno. Para ventanas de documentos con varias pestañas, como el editor HTML, cada pestaña tiene un contexto GUID de comando diferente. |
Servicio de idioma activo | Servicio de idioma asociado al archivo que se muestra actualmente en un editor de texto. |
Ventana de herramientas activa | Ventana de herramientas que está abierta y tiene el foco. |
Una quinta área de contexto principal es el estado de la interfaz de usuario del IDE. Los contextos de la interfaz de usuario se identifican mediante el contexto GUID
de comando activo, como se indica a continuación:
Estos GUID se marcan como activos o inactivos, en función del estado actual del IDE. Varios contextos de interfaz de usuario pueden estar activos al mismo tiempo.
Ocultar y mostrar comandos en función del contexto
Puede mostrar u ocultar un comando de paquete en el IDE sin cargar el propio paquete. Para ello, defina el comando en el archivo .vsct del paquete mediante las DefaultDisabled
marcas de comandos , DefaultInvisible
y y DynamicVisibility
agregue uno o varios elementos VisibilityItem a la sección VisibilityConstraints . Cuando un contexto GUID
de comando especificado se activa, el comando se muestra sin cargar el paquete.
GUID de contexto personalizados
Si aún no se ha definido un GUID de contexto de comando adecuado, puede definir uno en vsPackage y, a continuación, programarlo para que esté activo o inactivo según sea necesario para controlar la visibilidad de los comandos. Use el SVsShellMonitorSelection servicio para:
Registre GUID de contexto (llamando al GetCmdUIContextCookie método ).
Obtenga el estado de un contexto
GUID
(llamando al IsCmdUIContextActive método ).Active y desactive el contexto
GUID
(llamando al SetCmdUIContext método ).Precaución
Asegúrese de que VSPackage no afecta al estado de ningún GUID de contexto existente porque otros VSPackages pueden depender de ellos.
Ejemplo
En el ejemplo siguiente de un comando VSPackage se muestra la visibilidad dinámica de un comando administrado por contextos de comandos sin cargar el VSPackage.
El comando se establece para habilitarse y mostrarse siempre que exista una solución; es decir, cada vez que uno de los SIGUIENTES GUID de contexto de comando está activo:
En el ejemplo, observe que cada marca de comando es un elemento De marca de comando independiente.
<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 también que todos los contextos de la interfaz de usuario deben proporcionarse en un elemento independiente VisibilityItem
, como se indica a continuación.
<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>