【问题标题】:Outlook 2016 AttachmentRemove does not fireOutlook 2016 AttachmentRemove 不会触发
【发布时间】:2021-06-09 11:26:44
【问题描述】:

在我的 Outlook 插件中,我订阅了 AttachmentRemoveAttachmentAddMailItem

在 Outlook 2016 中未触发删除事件时触发添加事件。Outlook 2013 两者都有效。 两个事件都以相同的时间和相同的方式订阅和取消订阅。 我很确定没有收集到会阻止引发事件的对象。


编辑(版本信息)

办公版本:

  • Microsoft Outlook 2016 MSO (16.0.13801.20240) 32 位 2102(构建 13801.20294 即点即用)
  • Microsoft Outlook 2016 (16.0.5113.1000) MSO (13.0.5122.1000) 32 位

安装office的两个系统都是64位系统。


编辑(代码截断)

public CommonItemInternal(object item)
{
    if (item == null)
        return;
    this.UniqueId = GetUniqueId(item);
    commonItemLookup.Add(this.UniqueId, this);
    this.Item = item;

    if (this.Item is MailItem)
    {
        var mailItem = this.Item as MailItem;
        mailItem.PropertyChange += this.COM_CommonItemInternal_PropertyChange;
        mailItem.AttachmentRemove += this.COM_mailItem_AttachmentRemove; // <-- Does not get called

        mailItem.AttachmentAdd += this.COM_mailItem_AttachmentAdd; // <-- Get called
    }
}

【问题讨论】:

  • 您订阅事件的实际代码是什么?对象是如何在代码中声明的?
  • 指定 Outlook 内部版本号及其位数是有意义的。
  • @EugeneAstafiev 抱歉延迟回复。我添加了版本。
  • @EugeneAstafiev 我还添加了订阅事件的代码片段。

标签: c# outlook vsto outlook-addin


【解决方案1】:

首先,确保源对象是在全局范围内声明的,垃圾收集器不会将其从堆中清除。其次,尝试保存项目。在您将光标切换到另一个字段或保存项目之前,Outlook 对象模型可能不会对 UI 更改做出反应。第三,不清楚使用什么代码来处理AttachmentRemove 事件。我建议发布所有代码或仅发布最少的可重现示例代码。

【讨论】:

  • 我将 MailItem 包装在 Wrapper 中。在使用 mailitem 的整个时间内保持活动状态。我确定该对象没有被收集,因为 add 和 remove 都在同一个地方订阅。并且在我测试了 remove 之后 Add 有效。我尝试创建一个最小的样本。这可能需要一些时间。
  • 我在删除附件后尝试保存对象。这触发了您建议的事件。如果我使用上下文菜单删除附件(无需额外调用保存),它也会被触发。通过标记删除 attmchemt 并按 delete 键不会触发事件。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
  • 2015-04-18
相关资源
最近更新 更多