Outlook VSTO:如何让自定义任务窗格适配多邮件撰写窗口?
解决Outlook VSTO多撰写窗口下任务窗格按钮仅操作对应邮件的问题
问题根源
Globals.ThisAddIn.CurrentMailItem始终指向当前激活的邮件撰写窗口,而非任务窗格所属的窗口;遍历所有Inspector会修改全部窗口的邮件,都无法满足“仅操作任务窗格对应窗口邮件”的需求。核心是要让每个自定义任务窗格与它所属的Inspector窗口建立绑定关系。
解决方案步骤
1. 给任务窗格控件添加关联Inspector的属性
在你的自定义任务窗格用户控件(例如MyTaskPaneControl)中,添加一个属性来存储对应的Inspector实例:
using Outlook = Microsoft.Office.Interop.Outlook; public partial class MyTaskPaneControl : UserControl { // 存储与当前任务窗格绑定的Inspector public Outlook.Inspector AssociatedInspector { get; set; } public MyTaskPaneControl() { InitializeComponent(); } }
2. 创建任务窗格时绑定Inspector
在ThisAddIn.cs的Inspectors_NewInspector事件处理方法中,创建任务窗格时将当前Inspector赋值给控件的AssociatedInspector属性:
using Outlook = Microsoft.Office.Interop.Outlook; private void ThisAddIn_Startup(object sender, System.EventArgs e) { this.Inspectors.NewInspector += Inspectors_NewInspector; } private void Inspectors_NewInspector(Outlook.Inspector Inspector) { Outlook.MailItem mailItem = Inspector.CurrentItem as Outlook.MailItem; // 仅针对新邮件撰写窗口创建任务窗格 if (mailItem != null && mailItem.MessageClass == "IPM.Note") { MyTaskPaneControl taskPaneControl = new MyTaskPaneControl(); // 绑定当前Inspector到任务窗格控件 taskPaneControl.AssociatedInspector = Inspector; var customTaskPane = this.CustomTaskPanes.Add(taskPaneControl, "自定义BCC任务窗格", Inspector); customTaskPane.Visible = true; } }
3. 在按钮点击事件中操作绑定窗口的邮件
修改任务窗格按钮的点击事件,通过AssociatedInspector获取对应的MailItem并设置BCC:
private void btnAddBcc_Click(object sender, EventArgs e) { if (AssociatedInspector != null && AssociatedInspector.CurrentItem is Outlook.MailItem targetMailItem) { // 设置BCC字段 targetMailItem.BCC = "test@acb.com"; // 可选:保存邮件更改 targetMailItem.Save(); } }
原理说明
每个自定义任务窗格通过AssociatedInspector属性与创建它的邮件撰写窗口绑定,点击按钮时直接操作该Inspector对应的MailItem,确保仅修改任务窗格所属窗口的邮件,完美适配多窗口场景。
内容的提问来源于stack exchange,提问作者Barry Ralphs
相关产品推荐
相关产品推荐

