VSPackage: Modificar botón de la barra de texto / información sobre herramientas en tiempo de ejecución

StackOverflow https://stackoverflow.com/questions/4014822

Pregunta

He estado desarrollando una extensión de Visual Studio como un complemento para VS2008 / 2010. La nueva versión ahora se va a hacer como un paquete VSIX para VS2010 única (ya que tiene que ser .NET 4 modos), y estoy teniendo con (bastante simple, yo creo) la manipulación de interfaz de usuario con algunas dificultades.

La extensión se compone principalmente de una barra de herramientas con algunos botones que inician varias acciones, formas, etc., y algunos que sólo se utilizan como etiquetas para mostrar cierta información de estado. Los botones de "etiqueta" a sí mismos simplemente muestran muy corto y breve información, mientras que la información sobre herramientas proporcionan más detalles.

Si bien no creía que el conjunto complemento cosa era muy elegante, haciendo este tipo de cosas era bastante sencillo (aunque mi enfoque puede haber sido un poco amateur). Al añadir los comandos de la barra de herramientas, me gustaría "Guardar" los botones de "etiqueta" en las variables locales específicos, lo que permite que fije más tarde, el texto del título y la información sobre herramientas a voluntad.

En un VSPackage, el equivalente a Microsoft.VisualStudio.CommandBars.CommandBarButton parece ser OleMenuCommand . Encontrar el comando "etiqueta" a través de la MenuCommandService no es ningún problema, modificándolo según sea necesario, sin embargo.

Con el fin de encontrar la manera de hacer esto, sólo tiene una barra de herramientas con dos botones en un grupo. btnAction es muy simple; simplemente un icono y un manejador de ejecutar para cambiar el texto en el otro botón, no hay CommandFlags. btnLabel es la siguiente con el .vsct:

<Button guid="guidVSPackageBuilderTutorialCommandSet" id="btnLabel" priority="0x0100">
    <CommandFlag>DefaultDisabled</CommandFlag>
    <CommandFlag>DontCache</CommandFlag>
    <CommandFlag>NoCustomize</CommandFlag>
    <CommandFlag>TextChanges</CommandFlag>
    <CommandFlag>TextOnly</CommandFlag>
    <Strings>
        <CommandName>cmdidbtnLabel</CommandName>
        <ButtonText>btnLabel</ButtonText>
        <MenuText>btnLabel</MenuText>
        <ToolTipText>Tooltip btnLabel</ToolTipText>
    </Strings>
</Button>

El primer problema con esto es que cuando uso TextChanges , ToolTipText string se ignora y el ButtonText se utiliza inicialmente para la información sobre herramientas también.

El código del controlador para el botón de acción es el siguiente:

private int iClickCount = 0;

protected override void btnActionExecuteHandler(object sender, EventArgs e)
{
    var svc = GetService(typeof(IMenuCommandService)) as OleMenuCommandService;

    CommandID idBtnLabel = new CommandID(GuidList.guidVSPackageBuilderTutorialCmdSet, (int)PkgCmdIDList.btnLabel);
    var cmd = svc.FindCommand(idBtnLabel) as OleMenuCommand;

    cmd.Text = "Clicked " + (++iClickCount) + " times";
}

Esto cambia el título de btnLabel como se esperaba, pero ya que no hay forma de especificar explícitamente la información sobre herramientas ( OleMenuCommand objeto, simplemente tiene un texto propiedad, a diferencia de CommandBarButton , que tiene tanto leyenda y ToolTipText ), la información de herramienta siempre está a la misma cadena que el título. Por lo que entiendo, esto se debe a que con FindCommand () No estoy realmente conseguir el botón de la interfaz de usuario, pero sólo el comando subyacente, que no se preocupa por la información de herramientas.

Lo que es aún más confuso es lo que sucede cuando se utiliza la TextChangesButton CommandFlag en lugar de TextChanges . El botón mostrará ahora correctamente el texto de sugerencia se define en la .vsct, pero ni el título ni la descripción cambiará cuando haga clic en el otro botón - aunque cuando puedo comprobar el btnLabel del comando texto propiedad, que se ajusta a lo que espero ( "Seguido por x"). ¿El TextChangesButton tipo de "desacoplarse" de las propiedades del comando y el botón? Si es así, esto es más o menos lo que yo quiero (no me importa acerca del comando, como no hay nada para ejecutar todos modos; btnLabel Siempre habrá personas con discapacidad), pero ¿cómo puedo acceder al botón y sus propiedades particulares cuerda?

Me miraba a través de los diferentes interfaces de IVs y servicios SVs pero no pudo encontrar algo apropiado, y la documentación (y la ayuda de IntelliSense) no parece ser muy extensa.

¿Fue útil?

Solución

Para responder a esto mismo - de acuerdo con alguien del equipo de VS, la nueva estructura de la extensibilidad no ofrece maneras de acceder a estas propiedades de los controles en tal detalle. Por lo que yo quiero lograr que será necesario ir a la antigua usanza de apoderarse del objeto DTE, la búsqueda de mi barra de herramientas y mis controles y simplemente manejarlos como CommandBarButtons, tal como lo hice en mi complemento.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top