How to have a VSTO Ribbon and Context Menu at the same time?

contextmenu, outlook-addin, ribbon, vsto

Solution

You need to combine the two ribbon XML files, then have a single callback file:

<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
<ribbon>
<tabs>
  <tab id="testTab" label="Test Label">
    <group id="testGroup" label="test">
      <button id="testButton" onAction="testAction" label="Test" size="large" 
          getImage ="GetCustomImage" screentip="Test Ribbon Functionality."/>         
    </group>      
  </tab>
 </tabs>
</ribbon>
<contextMenus>
  <contextMenu idMso="ContextMenuText">
   <button idMso="FontDialog" visible="false" />
   <toggleButton id="MyToggle" label="My Toggle Button" />
   <button id="MyButton" label="My Button" insertBeforeMso="HyperlinkInsert" onAction="GetButtonID" />
   <menuSeparator id="MySeparator" />
   <menu id="MySubMenu" label="My Submenu" >
    <button id="MyButton2" label="Button on submenu" />
   </menu>
   <gallery id="galleryOne" label="My Gallery">
    <item id="item1" imageMso="HappyFace" />
    <item id="item2" imageMso="HappyFace" />
    <item id="item3" imageMso="HappyFace" />
    <item id="item4" imageMso="HappyFace" />
   </gallery>
   <dynamicMenu id="MyDynamicMenu" label= "My Dynamic Menu" getContent="GetMyContent" />
  </contextMenu>
 </contextMenus>
</customUI>

Problem

EDIT: The posters answer is correct except for it should read xmlns="http://schemas.microsoft.com/office/2009/07/customui" for the include. As a side effect the ribbon and context menu defined in an XML file will not work in Office 2007. If you need to add a context menu in 2007, use the now deprecated, and a context menu within the Outlook 2007 message window is NOT POSSIBLE. ``` this.Application.ItemContextMenuDisplay += new Microsoft.Office.Interop.Outlook.ApplicationEvents_11_ItemContextMenuDisplayEventHandler(Application_ItemContextMenuDisplay); ``` I've created both a Ribbon and a Context menu, but I do not know how to deploy both of them at the same time. My Ribbon XML looks something like this: ``` <?xml version="1.0" encoding="UTF-8"?> <customUI onLoad="Ribbon_Load" xmlns="http://schemas.microsoft.com/office/2006/01/customui"> <ribbon> <tabs> <tab id="testTab" label="Test Label"> <group id="testGroup" label="test"> <button id="testButton" onAction="testAction" label="Test" size="large" getImage ="GetCustomImage" screentip="Test Ribbon Functionality."/> </group> </tab> </tabs> </ribbon> </customUI> ``` Ribbon.cs has ``` public string GetCustomUI(string ribbonID) { String ui = null; // Examine the ribbonID to see if the current item // is a Mail inspector. if (ribbonID == "Microsoft.Outlook.Mail.Read" || ribbonID == "Microsoft.Outlook.Mail.Compose") { // Retrieve the customized Ribbon XML. ui = GetResourceText("WDCrypt2.Ribbon.xml") ; } return ui; } ``` ContextMenu XML looks like (from a tutorial) ``` <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui"> <contextMenus> <contextMenu idMso="ContextMenuText"> <button idMso="FontDialog" visible="false" /> <toggleButton id="MyToggle" label="My Toggle Button" /> <button id="MyButton" label="My Button" insertBeforeMso="HyperlinkInsert" onAction="GetButtonID" /> <menuSeparator id="MySeparator" /> <menu id="MySubMenu" label="My Submenu" > <button id="MyButton2" label="Button on submenu" /> </menu> <gallery id="galleryOne" label="My Gallery"> <item id="item1" imageMso="HappyFace" /> <item id="item2" imageMso="HappyFace" /> <item id="item3" imageMso="HappyFace" /> <item id="item4" imageMso="HappyFace" /> </gallery> <dynamicMenu id="MyDynamicMenu" label= "My Dynamic Menu" getContent="GetMyContent" /> </contextMenu> </contextMenus> </customUI> ``` With its cs file which looks like: ``` private Office.IRibbonUI ribbon; public Ribbon2() { } #region IRibbonExtensibility Members public string GetCustomUI(string ribbonID) { return GetResourceText("WDCrypt2.Ribbon2.xml"); } ``` The problem is to use either in my Addin Class I must: ``` protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject() { return new Ribbon(); } ``` OR ``` protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject() { return new Ribbon2(); //The Context Menu } ``` But I cannot do both. How do I get both the context menu and the ribbon at the same time? Edit: I would also like to refrain from using Application.ItemContextMenuDisplay, as this is officially deprecated by the API.

Original source