Question

J'ai développé une extension Visual Studio comme Add-in pour VS2008 / 2010. La nouvelle version est maintenant à faire en tant que paquet VSIX pour VS2010 seulement (comme il doit être 4 .NET de toute façon), et j'ai quelques problèmes avec (assez simple, je pense) la gestion de l'interface utilisateur.

L'extension se compose principalement d'une barre d'outils avec des boutons permettant de lancer diverses actions, formes, etc., et quelques-uns qui ne sont utilisés comme étiquettes pour afficher des informations d'état. Les boutons se montrent tout simplement des informations très courte et concise « étiquette », tandis que les infobulles fournissent plus de détails.

Alors que je ne pensais pas que toute chose Add-in était très élégant, fait ce genre de choses était assez simple (bien que mon approche est peut-être un peu d'amateurisme). Lorsque vous ajoutez les commandes à la barre d'outils, je « sauver » les boutons « étiquette » dans les variables locales spécifiques, me permettant de définir plus tard, la légende et le texte infobulle à volonté.

Dans un VSPackage, l'équivalent de Microsoft.VisualStudio.CommandBars.CommandBarButton semble être OleMenuCommand . Trouver la commande « étiquette » par la MenuCommandService est pas un problème, la modifier au besoin est, cependant.

Aux fins de savoir comment faire, je viens d'une barre d'outils avec deux boutons dans un groupe. btnAction est très simple; juste une icône et un gestionnaire exécuter pour changer le texte sur l'autre bouton, pas 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 , ToolTipText chaîne est ignoré et le ButtonText est d'abord utilisé pour l'info-bulle ainsi.

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 ( OleMenuCommand objet a juste un Texte propriété, contrairement à CommandBarButton , qui a à la fois Légende et toolTipText ), l'info-bulle est toujours à la même chaîne que la légende. D'après ce que je comprends, c'est parce qu'avec findCommand () Je ne reçois pas réellement sur le bouton de l'interface utilisateur, mais seule la commande sous-jacente, qui ne se soucie pas de infobulles.

Ce qui est encore plus déroutant est ce qui se passe quand j'utilise le TextChangesButton CommandFlag au lieu de TextChanges . Le bouton affiche désormais correctement le texte d'info-bulle défini dans le .vsct, mais ni la légende ni l'info-bulle changera lorsque je clique sur l'autre bouton - mais quand je vérifie la btnLabel de commande Texte propriété, il est réglé sur ce que je pense ( « clicked x fois »). Est-ce que TextChangesButton type 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 de toute façon; btnLabel sera désactivé toujours), mais comment puis-je accéder au bouton et ses propriétés de chaîne particulière?

Je regardais à travers les différentes interfaces IVs et des services de SVS mais ne pouvait pas trouver quelque chose d'approprié, et la documentation (et aide IntelliSense) ne semble pas être très vaste.

Était-ce utile?

La solution

Pour répondre à moi-même - selon quelqu'un de l'équipe VS, la nouvelle structure ne propose pas l'extensibilité des moyens d'accéder à ces propriétés des contrôles dans ce détail. Pour ce que je veux atteindre, il sera nécessaire de suivre la voie ancienne de mettre la main sur l'objet DTE, trouver ma barre d'outils et mes contrôles et simplement les traiter comme CommandBarButtons, comme je l'ai fait dans mon Add-in.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top