如何访问Outlook中的“检查器”窗口功能区?

时间:2012-07-02 22:00:21

标签: vsto outlook-addin outlook-2010

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

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

Explorer部分很容易上手,但我在为新的检查员做上述事情时遇到了问题

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

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

  • 我已经尝试在NewInspector中订阅Activate事件并从那里开始,但在那里Application.ActiveInspector()为null,如果我从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);
    }

2 个答案:

答案 0 :(得分:0)

在“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;}}}

答案 1 :(得分:0)

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

为了解决这个问题,我已经在MailItem中的每个色带上循环(不使用检查器索引器,因为它会为您提供空引用)。对于每个Globals.Ribbons对象,我检查它的类型为Ribbon的上下文。然后,我可以对Inspector进行相等检查,以确定它们的引用是否相等。如果它们相等,我知道要使用Inspector.CurrentItem

这是一个片段

Ribbon