XML Ribbon in Outlook - make it appear on a specific window

这一生的挚爱 提交于 2019-12-05 02:54:27

问题


I'm making my first attempt at creating a Ribbon in Outlook using XML and am having trouble locating specifically how to tell my add-in that I only want the ribbon to appear on Explorer windows.

Advice?

Thanks.

my Ribbon1.XML file:

    <?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
  <ribbon>
    <tabs>
      <tab idMso="TabAddIns">
        <group id="MyGroup"
               label="My Group">
          <button idMso="Delete"/>
        </group>
      </tab>
      <tab idMso="TabMail">
        <group idMso="GroupMoveActions"
               visible="false">
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>

The magical error box that pops up says:

CustomUI Runtime Error in testingOLaddin2

Error found in CustomUI XML of "testingOLaddin2"

Line: 3
Column: 10
Error Code 0x80004005
Failed to find Office control by ID
ID: TabMail

Per request, my ribbon generation code:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using Office = Microsoft.Office.Core;

using System.Diagnostics;

namespace testingOLaddin2
{
    [ComVisible(true)]
    public class Ribbon1 : Office.IRibbonExtensibility
    {
        private Office.IRibbonUI ribbon;

        public Ribbon1()
        {
        }

        #region IRibbonExtensibility Members

        public string GetCustomUI(string ribbonID)
        {
            return GetResourceText("testingOLaddin2.Ribbon1.xml");
        }

        #endregion

        #region Ribbon Callbacks
        //Create callback methods here. For more information about adding callback methods, select the Ribbon XML item in Solution Explorer and then press F1

        public void Ribbon_Load(Office.IRibbonUI ribbonUI)
        {
            this.ribbon = ribbonUI;
        }


        #endregion

        #region Helpers

        private static string GetResourceText(string resourceName)
        {
            Assembly asm = Assembly.GetExecutingAssembly();
            string[] resourceNames = asm.GetManifestResourceNames();
            for (int i = 0; i < resourceNames.Length; ++i)
            {
                if (string.Compare(resourceName, resourceNames[i], StringComparison.OrdinalIgnoreCase) == 0)
                {
                    using (StreamReader resourceReader = new StreamReader(asm.GetManifestResourceStream(resourceNames[i])))
                    {
                        if (resourceReader != null)
                        {
                            return resourceReader.ReadToEnd();
                        }
                    }
                }
            }
            return null;
        }

        #endregion
    }
}

回答1:


This depends on the method you use to create the addin and ribbon. If you are using the

IRibbonExtensibility.GetCustomUI(string RibbonId)

method you could accomplish this by only returning the ribbon xml if the RibbonId parameter has the value

"Microsoft.Outlook.Explorer"

Edit

Following change in your code might work:

public string GetCustomUI(string ribbonID)
{
  if (ribbonID == "Microsoft.Outlook.Explorer")
    return GetResourceText("testingOLaddin2.Ribbon1.xml");

  return null; // if problems here, try return string.Empty
}



回答2:


Your GetCustomUI(string RibbonId) Is called by Outlook once you implemenent CreateRibbonExtensibilityObject() in the ThisAddIn class to return a new instance of your ribbon class. The ribbon class is where you reference the XML (in GetCustomUI).

For the XML itself, you will need to reference each Outlook explorer type individually. Unfortunately, there isn't an overarching way to specify "all explorers" in the Ribbon XML syntax, as far as I know.

Here are some examples referencing the Mail and Calendar explorers:

<?xml version="1.0" encoding="UTF-8"?>
<customUI  xmlns="http://schemas.microsoft.com/office/2006/01/customui">
  <ribbon>
    <tabs>
      <tab idMso="TabCalendar">
      <!-- Calendar tab controls go here -->
      </tab>
      <tab idMso="TabMail">
      <!-- mail tab controls go here -->
      </tab>
    </tabs>
  </ribbon>
</customUI>

Microsoft does give some hint about idMso attributes for built-in tabs, but unfortunately it's buried in this Excel spreadsheet: link



来源:https://stackoverflow.com/questions/5983381/xml-ribbon-in-outlook-make-it-appear-on-a-specific-window

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!