2010-10-25 5 views
4

J'ai développé une extension Visual Studio en tant que complément pour VS2008/2010. La nouvelle version doit maintenant être faite comme un paquet VSIX pour VS2010 seulement (comme il doit être .NET 4 de toute façon), et j'ai quelques problèmes avec (plutôt simple, je pense) la manipulation de l'interface utilisateur.VSPackage: Modifier le texte/l'info-bulle du bouton de la barre d'outils au moment de l'exécution

L'extension se compose principalement d'une barre d'outils avec des boutons qui lancent diverses actions, formulaires, etc., et quelques-uns qui servent uniquement d'étiquettes pour afficher certaines informations d'état. Les boutons "label" eux-mêmes montrent juste des informations très courtes et concises, tandis que les info-bulles fournissent plus de détails.

Bien que je ne pensais pas que tout le complément était très élégant, faire ce genre de choses était assez simple (même si mon approche était peut-être un peu amateur). Lorsque j'ajoutais les commandes à la barre d'outils, je "sauvegardais" les boutons "label" dans des variables locales spécifiques, ce qui me permettait de définir ultérieurement la légende et le texte de l'info-bulle à volonté.

Dans un VSPackage, l'équivalent de Microsoft.VisualStudio.CommandBars.CommandBarButton semble être OleMenuCommand. Trouver la commande "label" à travers le MenuCommandService ne pose aucun problème, mais le modifier au besoin.

Dans le but de trouver comment faire cela, j'ai juste une barre d'outils avec deux boutons dans un groupe. btnAction est très simple; juste une icône et un gestionnaire d'exécution pour changer le texte sur l'autre bouton, pas de CommandFlags. btnLabel ressemble à ceci dans le .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> 

Le premier problème est que lorsque j'utilise TextChanges, la chaîne ToolTipText est ignorée et est d'abord utilisé le ButtonText pour la info-bulle aussi.

Le code de gestionnaire pour le bouton d'action est la suivante:

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

Cela change la légende de btnLabel comme prévu, mais comme il n'y a aucun moyen de spécifier explicitement l'info-bulle (l'objet OleMenuCommand juste a un texte propriété, à la différence CommandBarButton, qui a à la fois Légende et toolTipText), l'info-bulle est toujours s et à la même chaîne que la légende. D'après ce que je comprends, c'est parce que avec FindCommand() je ne reçois pas le bouton de l'interface utilisateur, mais seulement la commande sous-jacente, qui ne se soucie pas des info-bulles.

Ce qui est encore plus déroutant est ce qui se passe quand j'utilise le TextChangesButton CommandFlag au lieu de TextChanges. Le bouton affichera désormais correctement le texte de l'info-bulle défini dans le fichier .vsct, mais ni la légende ni l'info-bulle ne changeront lorsque je clique sur l'autre bouton - mais lorsque je vérifie la propriété de la commande de la commande , elle est définie sur Je m'attends ("Cliqué x fois"). Est-ce que TextChangesButton sorte de "découpler" les propriétés de la commande et le bouton?Si oui, c'est à peu près ce que je veux (je ne me soucie pas de la commande, car il n'y a rien à exécuter, btnLabel sera toujours désactivé), mais comment puis-je accéder au bouton et à ses propriétés de chaîne particulières? J'ai regardé à travers les diverses interfaces IVs et services SVs mais n'ai pas trouvé quelque chose de approprié, et la documentation (et l'aide d'IntelliSense) ne semble pas être très étendue.

Répondre

1

Pour répondre moi-même - selon une personne de l'équipe VS, la nouvelle structure d'extensibilité n'offre pas de façons d'accéder à ces propriétés des contrôles de manière aussi détaillée. Pour ce que je veux réaliser il sera nécessaire d'aller à l'ancienne façon de s'emparer de l'objet DTE, de trouver ma barre d'outils et mes contrôles et de les manipuler simplement comme CommandBarButtons, comme je l'ai fait dans mon Add-in.

Questions connexes