2

我正在尝试编写一个插件来通知约会何时保存并执行一些数据。为此,我需要检查当活动检查器关闭时,该项目是否已保存。

我的问题是:当尝试将WriteEvent-listener 绑定到FormRegionShowing-method 中的当前项目时,我需要ActiveInspectorto 事件获取当前项目。但是,当到达ActiveInspector那里时null,可能是因为在活动检查器实际活动之前调用了该方法。

但是,当尝试在 - 方法中绑定它时FormRegionClosed,write 事件永远不会触发。那么,我怎么知道AppointmentItem用户何时实际保存了一个?

编辑:我设法在FormRegionShowing-method 中绑定了 write 事件,但它仍然不会触发:

private void ADDIN_NAME_FormRegionShowing(object sender, System.EventArgs e){

    Outlook.AppointmentItem currentItem = (Outlook.AppointmentItem)this.OutlookItem;

    currentItem.Write += new Outlook.ItemEvents_10_WriteEventHandler(currentItem_Write);

    currentItem.AfterWrite += new Outlook.ItemEvents_10_AfterWriteEventHandler(currentItem_AfterWrite);

    MessageBox.Show("added handlers");

}

void currentItem_AfterWrite(){
    MessageBox.Show("item has been saved");
}

void currentItem_Write(ref bool Cancel){
    MessageBox.Show("item being saved");
}
4

1 回答 1

4

您需要移动Outlook.AppointmentItem到类级别变量。在 COM 中,当函数超出范围时,RCW 将被垃圾回收。如果您想在 Office 中使用事件,您需要确保查看事件模型。另请参阅相关的 SO 帖子

private Outlook.AppointmentItem currentItem; // keep events from getting GC'd

private void ADDIN_NAME_FormRegionShowing(object sender, System.EventArgs e){
    currentItem = (Outlook.AppointmentItem)this.OutlookItem;
    currentItem.Write += new Outlook.ItemEvents_10_WriteEventHandler(currentItem_Write);
    currentItem.AfterWrite += new Outlook.ItemEvents_10_AfterWriteEventHandler(currentItem_AfterWrite);
}
于 2012-06-07T13:04:37.930 回答