【问题标题】:How to access the Inspector window Ribbon in Outlook?如何访问 Outlook 中的检查器窗口功能区?
【发布时间】:2012-07-03 08:17:05
【问题描述】:

我是 Outlook 编程的新手,所以第一步(稍后会更高级)是以下任务:

  • 创建一个新的功能区 (Ribbon1) 选项卡(应在资源管理器和新检查器中显示)
  • 选择(探索)或打开(检查器)邮件时,功能区选项卡应显示邮件主题(如测试所述)

Explorer 部分很容易上手,但我在为新检查员执行上述操作时遇到问题

我尝试了各种方法,但似乎都没有效果:

  • 我已尝试在 NewInspector 中引用 Globals.Ribbons[inspector].Ribbon1 但始终为空

  • 我已尝试在 NewInspector 中订阅 Activate 事件并从那里执行,但在那里 Application.ActiveInspector() 为空,如果我存储来自 NewInspector 事件的检查器的全局副本,它不适用于第一个新检查员(仅在第二个检查员之后和阅读邮件上。不适用于撰写邮件)

  • 我尝试过使用 Ribbon Load 事件,但这只是第一次发生

  • 我曾尝试使用 Globals.Ribbons.Ribbon1 成员,但只适用于第一次

(我发现了很多 NewInspector 的示例,但似乎没有人想修改这个功能区以外的 https://stackoverflow.com/questions/7852017/outlook-2007-ribbon-object-reference-not-set-to-an-instance-of-an-object 并且没有答案)

这快把我逼疯了……真的没有办法做这么简单的任务吗!?

示例代码供参考

    void InspectorsNewInspector(Outlook.Inspector inspector)
    {
        AddInspectorEventHandlers(inspector);
    }

    private void AddInspectorEventHandlers(Outlook.Inspector inspector)
    {
        if (inspector == null)
        {
            return;
        }

        Ribbon1 ribbon1 = Globals.Ribbons[inspector].Ribbon1; //This always return null!!!

        ((Outlook.InspectorEvents_10_Event)inspector).Activate += InspectorActivate;
        ((Outlook.InspectorEvents_10_Event)inspector).Close += InspectorClose;

        _openInspectors.Add(inspector);
    }

【问题讨论】:

  • 分享您的来源,了解您如何连接InspectorsNewInspector。整个 AddIn 类将有利于上下文。

标签: vsto outlook-addin outlook-2010


【解决方案1】:

在“NewInspector”事件期间,您的自定义功能区未加载。如果您调试代码,您将看到它仅在“NewInspector”事件之后才进入自定义功能区设计器。您可以做的是在自定义功能区加载事件期间实现您需要的内容。那就是

private void MyRibbon_Load(object sender, RibbonUIEventArgs e){}

在这里,您可以获得当前活跃的检查员。从中您可以获得所需的物品。

例如:

        Inspector inspector = Globals.WPTAddIn.Application.ActiveInspector();
        if (inspector != null)
        {
            if (inspector.CurrentItem != null)
            {
                if (inspector.CurrentItem is MeetingItem)
                {
                    MeetingItem meetingItem = (MeetingItem)inspector.CurrentItem;}}}

【讨论】:

    【解决方案2】:

    我今天遇到了同样的问题并想出了一个解决方法。我基本上一直在尝试访问我刚刚创建的MailItemRibbon

    为了解决这个问题,我遍历了Globals.Ribbons 中的每个功能区(不使用检查器索引器,因为它会给你一个空引用)。对于每个Ribbon 对象,我检查它的上下文类型为Inspector。然后我可以对Inspector.CurrentItem 进行相等性检查,以确定它们的引用是否相等。如果它们相等,我知道使用 Ribbon

    这是一个sn-p

    Outlook.MailItem mail = (Outlook.MailItem)this.Application.CreateItem(Outlook.OlItemType.olMailItem);
    Outlook.Inspector currentInspector = (Outlook.Inspector)mail.GetInspector;
    
    Ribbon2 currentRibbon = null;
    foreach (Ribbon2 ribbon in Globals.Ribbons)
    {
        var ribbonInspector = (Outlook.Inspector)ribbon.Context;
        if (ribbonInspector.CurrentItem.Equals(currentInspector.CurrentItem))
        {
            currentRibbon = (Ribbon2)ribbon;
            break;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-14
      • 1970-01-01
      相关资源
      最近更新 更多