当项目移动到特定文件夹时附加事件侦听器 Outlook VSTO
attach an event listener when an item is moved to a particular folder Outlook VSTO
我想要实现的是当用户将项目从 Outlook 中的任何文件夹(收件箱、垃圾邮件、草稿等)移动到特定用户创建的文件夹("abc" for例如)。
在这个阶段我只想显示 "Hello World" 项目被移动到文件夹 "abc"。
我知道我可能可以利用 Folder.BeforeItemMove
事件,但该事件用于将项目从特定文件夹中移出时的事件,我希望在将项目移入特定文件夹。
我也尝试了 FolderChange
event,这很有意义,因为它会在文件夹中发生事情时触发。但是它的事件处理程序只带有一个 Folder
参数,而不是 EventArgs
这样的东西,所以我无法区分用户操作(是否添加、移动、删除等)
我的解决方法是使用 ThisAddIn_Startup
.
中的循环将 Folder.BeforeItemMove
事件添加到除 "abc" 之外的每个文件夹
foreach(Folder f in folders)
{
f.BeforeItemMove += new Microsoft.Office.Interop.Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler(BeforeItemMove);
}
但它只工作一次,而不是贯穿整个生命周期。我知道这可能是因为我没有在收集到的 class 级别中声明所有文件夹属性,但我该怎么做呢?如果我只需要监视说 "inbox" 我可以做到
Folder Inbox
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
Folderroot = (Folder)this.Application.Session.DefaultStore.GetRootFolder();
inbox = root.Folders["Inbox"];
inbox.BeforeItemMove += new Microsoft.Office.Interop.Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler(BeforeItemMove);
}
这样 "Inbox" 文件夹将不会被 GC 收集。 但是我不知道如何处理需要监控多个文件夹的情况。
我是在正确的轨道上还是有更好的解决方案?
您似乎对项目 class 的 ItemAdd 事件感兴趣。当一个或多个项目被添加到指定的集合时,它被触发。当大量项目一次添加到文件夹(超过 16 个)时,此事件不会 运行。
您必须在代码中分别订阅每个 folder/items 才能获取所有文件夹的事件。
创建一个包含 Items
对象并存储为 class 成员的包装器 class。为该对象设置一个 Items.ItemAdd
事件处理程序作为该包装器 class 中的一个方法。在您的插件中,使用包装器列表(List<MyWrapper>)
来存储您要监视的每个文件夹的 Items 集合的包装器。这样可以防止 Items 对象被垃圾收集。
我想要实现的是当用户将项目从 Outlook 中的任何文件夹(收件箱、垃圾邮件、草稿等)移动到特定用户创建的文件夹("abc" for例如)。
在这个阶段我只想显示 "Hello World" 项目被移动到文件夹 "abc"。
我知道我可能可以利用 Folder.BeforeItemMove
事件,但该事件用于将项目从特定文件夹中移出时的事件,我希望在将项目移入特定文件夹。
我也尝试了 FolderChange
event,这很有意义,因为它会在文件夹中发生事情时触发。但是它的事件处理程序只带有一个 Folder
参数,而不是 EventArgs
这样的东西,所以我无法区分用户操作(是否添加、移动、删除等)
我的解决方法是使用 ThisAddIn_Startup
.
Folder.BeforeItemMove
事件添加到除 "abc" 之外的每个文件夹
foreach(Folder f in folders)
{
f.BeforeItemMove += new Microsoft.Office.Interop.Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler(BeforeItemMove);
}
但它只工作一次,而不是贯穿整个生命周期。我知道这可能是因为我没有在收集到的 class 级别中声明所有文件夹属性,但我该怎么做呢?如果我只需要监视说 "inbox" 我可以做到
Folder Inbox
private void ThisAddIn_Startup(object sender, System.EventArgs e)
{
Folderroot = (Folder)this.Application.Session.DefaultStore.GetRootFolder();
inbox = root.Folders["Inbox"];
inbox.BeforeItemMove += new Microsoft.Office.Interop.Outlook.MAPIFolderEvents_12_BeforeItemMoveEventHandler(BeforeItemMove);
}
这样 "Inbox" 文件夹将不会被 GC 收集。 但是我不知道如何处理需要监控多个文件夹的情况。
我是在正确的轨道上还是有更好的解决方案?
您似乎对项目 class 的 ItemAdd 事件感兴趣。当一个或多个项目被添加到指定的集合时,它被触发。当大量项目一次添加到文件夹(超过 16 个)时,此事件不会 运行。
您必须在代码中分别订阅每个 folder/items 才能获取所有文件夹的事件。
创建一个包含 Items
对象并存储为 class 成员的包装器 class。为该对象设置一个 Items.ItemAdd
事件处理程序作为该包装器 class 中的一个方法。在您的插件中,使用包装器列表(List<MyWrapper>)
来存储您要监视的每个文件夹的 Items 集合的包装器。这样可以防止 Items 对象被垃圾收集。