我正在写一个Outlook插件。我需要在任何文件夹中的任何电子邮件更改其标签时(即添加或删除类别时)通知插件。我想过使用ItemChange事件(link),但无论我对电子邮件做什么(添加类别,标记,移动等等)都没有被触发。
我知道你需要创建一个成员变量并将其设置为MapiFolder.Items,以防止垃圾收集,因为垃圾收集项不会调用事件。但即使这样,事件也没有被召唤。
我的问题是:
1)为什么没有在下面的代码中调用ItemChange,在Outlook中我尝试以任何方式更改电子邮件(例如添加类别)?
2)究竟什么时候应该为给定的电子邮件调用ItemChange事件?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;
using Outlook = Microsoft.Office.Interop.Outlook;
using Office = Microsoft.Office.Core;
namespace TestOutlookAddIn1
{
public partial class ThisAddIn
{
List<Outlook.Items> mItems = new List<Outlook.Items>();
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
var fo = Application.Session.Folders;
foreach (Outlook.Folder f in fo)
{
var items = f.Items;
mItems.Add(items); // prevent garbage collection
items.ItemChange += Items_ItemChange;
items.ItemAdd += items_ItemAdd;
items.ItemRemove += items_ItemRemove;
}
}
void items_ItemRemove()
{
throw new NotImplementedException();
}
void items_ItemAdd(object Item)
{
throw new NotImplementedException();
}
void Items_ItemChange(object Item) // NOT BEING CALLED <<<<<
{
throw new NotImplementedException();
}
}
}
答案 0 :(得分:0)
抱歉,我发现了问题:我没有在子文件夹上重复出现。
var fo = Application.Session.Folders;
foreach (Outlook.Folder f in fo)
{
foreach (Outlook.Folder f2 in f.Folders)
{
var items = f2.Items;
mItems.Add(items);
items.ItemChange += Items_ItemChange;
items.ItemAdd += items_ItemAdd;
items.ItemRemove += items_ItemRemove;
}
或完全递归:
var frontier = new Queue<Folder>();
foreach (Folder f in lSession.Folders)
{
frontier.Enqueue(f);
}
while (frontier.Any())
{
var curFolder = frontier.Dequeue();
curFolder.Items.ItemChange += Items_ItemChange;
foreach (Folder ch in curFolder.Folders)
{
frontier.Enqueue(ch);
}
}
}