5

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

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

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

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

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

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

  • 我尝试使用功能区加载事件,但这只是第一次发生

  • 我尝试使用 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);
    }
4

2 回答 2

0

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

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

这是一个片段

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;
    }
}
于 2014-10-09T17:54:40.430 回答
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;}}}
于 2013-02-23T18:59:25.000 回答