打开约会项目(会议发生和个人会议)时显示自定义任务窗格

时间:2019-08-06 14:56:48

标签: c# outlook vsto

我发送的会议邀请中嵌入了一些文本。当用户从包含我指定的文本的日历中打开约会时,我想启动自定义任务窗格。

我正在使用InspectorsEvents_NewInspectorEventHandler来获取打开事件并检查约会项是否已打开。如果需要约会,我会调用代码以显示自定义任务窗格。

private void ThisAddIn_Startup(object sender, System.EventArgs e)
    {
        inspectors = this.Application.Inspectors;
        inspectors.NewInspector += new Outlook.InspectorsEvents_NewInspectorEventHandler(Inspectors_NewInspector);
    }

void Inspectors_NewInspector(Microsoft.Office.Interop.Outlook.Inspector Inspector)
    {
        Outlook.AppointmentItem appointmentItem = Inspector.CurrentItem as Outlook.AppointmentItem;
        if (appointmentItem != null)
        {
            (appointmentItem as Microsoft.Office.Interop.Outlook.ItemEvents_10_Event).Open += _appointment_Open;
            (appointmentItem as Microsoft.Office.Interop.Outlook.ItemEvents_10_Event).Close += ThisAddIn_Close;

        }

    }

private void _appointment_Open(ref bool Cancel)
    {
        if ((Globals.ThisAddIn.ribbonObj as Ribbon) != null && (Globals.ThisAddIn.ribbonObj as Ribbon).IsLoggedOn)
        {
            Object selObject = this.Application.ActiveExplorer().Selection[1];
            if (selObject is Outlook.AppointmentItem)
            {
                Outlook.AppointmentItem apptItem = (selObject as Outlook.AppointmentItem);
//Without display() the taskpane is displayed on the calendar screen
                apptItem.Display();
                //Dispose already open task panes
                (Globals.ThisAddIn.ribbonObj as Ribbon).DisposeCustomTaskPanes();

                if (FindCustomId(apptItem.Body))
                {                        
                    (Globals.ThisAddIn.ribbonObj as Ribbon).edit_Cick(null);
                }
            }
            Marshal.ReleaseComObject(selObject);
        }
    }

edit_click()
{
CustomTaskPane myCustomTaskPane = 
Globals.ThisAddIn.CustomTaskPanes.Add(myUserControl, "edit pane");
}

通过使用apptItem.Display();约会被打开,然后任务窗格仅显示打开的项目。如果未使用display(),则会在Outlook的日历视图中打开任务窗格,而不是在打开的项目上。

当我打开重复项目时,会发生这种方法的问题。如果我打开“仅此一个”项目,则该方案工作正常。但是,如果我打开“打开整个系列”,则会触发两次open()事件,并打开两个窗口,一个窗口出现会议,另一个窗口出现会议系列。如果我删除display()方法调用,“开放系列”将仅打开一个窗口。

我的目标是避免在用户打开会议系列后打开自定义任务窗格。仅当用户打开会议或单个会议时,任务窗格才会显示。 此外,还有一种方法可以区分何时打开约会作为会议发生或会议系列。在open_event中,两种情况下我都将Appointment.RecurrenceState设置为olApptOccurrence。

2 个答案:

答案 0 :(得分:1)

请勿使用AppointmentItem.Open事件显示任务窗格-请使用NewInspector事件。

答案 1 :(得分:0)

在新检查员中,我要区分主要发生和发生项

$cachedData = Redis::hGet('myhash', 'myfield');
if ($cachedData) {
    return $cachedData;
}

$dbData = $this->getDataFromDb();
if ($dbData) {
    return $dbData;
}

然后在打开事件中,我正在打开自定义任务窗格。这样我就可以达到预期的效果。通过所有测试用例后,将更新为答案。