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