C# Outlook中的XML功能区-使其显示在特定窗口上

C# Outlook中的XML功能区-使其显示在特定窗口上,c#,.net,outlook,ribbon,C#,.net,Outlook,Ribbon,我第一次尝试使用XML在Outlook中创建功能区,但在具体定位如何告诉我的加载项我只希望功能区显示在资源管理器窗口中时遇到了问题 建议 谢谢 my Ribbon1.XML文件: <?xml version="1.0" encoding="UTF-8"?> <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load"> <ribbon

我第一次尝试使用XML在Outlook中创建功能区,但在具体定位如何告诉我的加载项我只希望功能区显示在资源管理器窗口中时遇到了问题

建议

谢谢

my Ribbon1.XML文件:

    <?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>
根据请求,我的功能区生成代码:

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
    }
}
使用系统;
使用System.Collections.Generic;
使用System.IO;
使用System.Linq;
运用系统反思;
使用System.Runtime.InteropServices;
使用系统文本;
使用Office=Microsoft.Office.Core;
使用系统诊断;
命名空间testingOLaddin2
{
[ComVisible(true)]
公共类Ribbon1:Office.iribboneExtensibility
{
private Office.IRibbonUI ribbon;
公共Ribbon1()
{
}
#区域IRibbonExtensibility成员
公共字符串GetCustomUI(字符串ribbonID)
{
返回GetResourceText(“testingOLaddin2.Ribbon1.xml”);
}
#端区
#区域功能区回调
//在此处创建回调方法。有关添加回调方法的详细信息,请在解决方案资源管理器中选择功能区XML项,然后按F1
公共无效功能区加载(Office.IRibbonUI-ribbonUI)
{
this.ribbon=ribbonUI;
}
#端区
#地区助手
私有静态字符串GetResourceText(字符串resourceName)
{
Assembly asm=Assembly.getExecutionGassembly();
字符串[]resourceNames=asm.GetManifestResourceNames();
for(int i=0;i
这取决于创建加载项和功能区的方法。如果您正在使用

IRibbonExtensibility.GetCustomUI(string RibbonId)
方法,如果RibbonId参数具有该值,则只需返回ribbon xml即可完成此操作

"Microsoft.Outlook.Explorer"
编辑

代码中的以下更改可能会起作用:

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

  return null; // if problems here, try return string.Empty
}
ThisAddIn
类中实现
createRibboneExtensibilityObject()
后,Outlook将调用您的
GetCustomUI(字符串RibbonId)
,以返回ribbon类的新实例。ribbon类是引用XML的地方(在
GetCustomUI
中)

对于XML本身,您需要分别引用每个Outlook explorer类型。不幸的是,据我所知,在Ribbon XML语法中没有一种指定“所有探索者”的总体方法

以下是一些引用邮件和日历资源管理器的示例:

<?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确实给出了一些关于内置选项卡的
idMso
属性的提示,但不幸的是,它被隐藏在这个Excel电子表格中:

我在Ribbon1.cs文件中看到了该代码,但不知道如何调用它,也不知道在XML文件中的何处输入正确的代码。当Outlook需要您的帮助时,它将调用GetCustomUI。它会通过RibbonId参数告诉你在哪里使用它。您不必调用该方法。如果Outlook要求,您只需确保它返回正确的结果。@Jan-我如何获得这些信息?这就是我得到的lost@Jan-我正在将GetCustomUI信息传递给主应用程序中的公共静态字符串。它返回我在Ribbon1.XML中输入的所有XML。我需要能够将Inspector选项卡与Explorer选项卡分开,但在一个XML文件中我看不到如何做到这一点。@Larry-我根据您添加的信息更新了我的答案。我一直在使用电子表格,并列出了我的信息,但是当我打开一条TabMail不存在的新邮件消息时,我的测试代码给了我一个错误。“我的按钮/组”显示在主资源管理器(我想要它的位置)上,但没有问题。@Larry令人惊讶的是,Outlook在打开新邮件(在检查器中)时会尝试引用TabMail(资源管理器选项卡)。如果可能的话,请在几分钟内发布您的GetCustomUI()和CreateRibboneExtensibilityObject()。即将发布另一个与其他加载项相关的问题。@Larry现在我看到了错误,我记得遇到了这个问题。是否在Outlook中启用了“显示加载项用户界面错误”设置(此处的详细信息:)?正如您所发现的,Outlook对每个检查器/资源管理器应用相同的功能区定义,当idMso引用的选项卡不存在时会生成错误。我们刚刚关掉了那个设置。我还没有找到更好的解决方案。如果您使用Designer(而不是XML)构建外接程序,有人知道如何解决相同的错误吗?
<?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>