我发送的会议邀请中嵌入了一些文本。当用户从包含我指定的文本的日历中打开约会时,我想启动自定义任务窗格。
我正在使用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。
答案 0 :(得分:1)
请勿使用AppointmentItem.Open
事件显示任务窗格-请使用NewInspector
事件。
答案 1 :(得分:0)
在新检查员中,我要区分主要发生和发生项
$cachedData = Redis::hGet('myhash', 'myfield');
if ($cachedData) {
return $cachedData;
}
$dbData = $this->getDataFromDb();
if ($dbData) {
return $dbData;
}
然后在打开事件中,我正在打开自定义任务窗格。这样我就可以达到预期的效果。通过所有测试用例后,将更新为答案。