2010-11-03 6 views
0

J'ai un Addin mot VSTO3 qui utilise des rubans personnalisés et taskbars, etc.intercepter le rappel GetCustomUI dans un VSTO3 Addin

Maintenant, Office 2010 arrive et il y a ce nifty nouveau concept BACKSTAGE, que je J'aimerais m'y accrocher. Cependant, d'après ce que je peux dire, le faire avec VSTO nécessite Vsto 4, qui nécessite VS2010, ce qui n'est pas une option.

Soooo. J'ai commencé à chercher en ligne et j'ai trouvé toutes sortes d'exemples, essentiellement, de greffer le backstage XML sur n'importe quel XML que je définis et de le renvoyer comme valeur de GetCustomUI. Tout va bien, sauf si vous utilisez VSTO3, il ne semble y avoir aucun moyen de "se connecter" à la chaîne d'appel pour GetCustomUI. Tout est "automagiquement" géré pour vous par les classes OfficeRibbon et RibbonManage.

Je sais que I + PUIS + convertir l'addin en addin partagé et implémenter directement les interfaces IDTExtensibility. Je perdrais tout le vsto bonté (oui, c'est discutable) mais j'aurais accès à l'appel GetCustomUI.

Quelqu'un a-t-il essayé d'accéder à GetCustomUI + WHILE + en utilisant VSTO? Est-ce même possible? J'ai pensé que je pourrais créer une classe wrapper pour RibbonManager, mais voici, MS est allé et fait ce qui semble être une violation suprême de l'encapsulation. Le RibbonManager implémente l'interface IRibbonExtensibility sympa et facile, et pourtant, quand cette interface est transmise, ils vérifient réellement l'objet passé pour s'assurer qu'il est du type RibbonManager! Ugh, tellement pour tout type de wrapper.

Répondre

0

Il s'avère que c'est possible, mais pas facile. Vous devez remplacer la méthode CreateRibbonExtensibilityObject sur connect, ainsi que les méthodes CreateRibbonObjects et RequestService.

Ensuite, vous devez créer un objet qui enveloppe l'objet VSTO RibbonManager intégré et implémente iReflect pour intercepter les appels INVOKE de réflexion et les transmettre au RibbonManager sous-jacent. Enfin, sur l'objet intercepteur, vous devez également implémenter IRibbonExtensibility, puis coder la méthode GetCustomUI de cette interface. Une fois que vous faites tout cela, votre GetCustomUI sera appelé et passé dans le XML complet des rubans que vous avez définis via VSTO, que vous pouvez ensuite modifier directement (dans mon cas, j'avais besoin d'ajouter le support backstage), et puis renvoyez ce fichier XML depuis la fonction.

certainement pas simple, mais cela fonctionne.