如何在移动Outlook MailItem后选中该邮件项?
在C# VSTO Outlook插件中移动MailItem后选中目标邮件的问题
我需要在C# VSTO Outlook插件中将MailItem移动到指定文件夹,已持有目标文件夹olFld的引用和有效的entryId字符串,尝试了以下代码:
olNS = olFld.Session as Outlook.NameSpace; //获取目标邮件项 olMailItem = olNS.GetItemFromID(entryId, olFld.StoreID) as Outlook.MailItem; //移动到目标文件夹 selMailItem = olMailItem.Move(olFld) as Outlook.MailItem; olApp = selMailItem.Application as Outlook.Application; olExp = olApp.ActiveExplorer() as Outlook.Explorer; olExp.ClearSelection(); if (olExp.IsItemSelectableInView(selMailItem)) olExp.AddToSelection(selMailItem);
但IsItemSelectableInView始终返回false,请问有没有方法在移动MailItem后选中它?
编辑更新
我认为这是时序问题,于是为Explorer添加SelectionChange事件并调用ClearSelection:
olNS = olFld.Session as Outlook.NameSpace; //获取目标邮件项 olMailItem = olNS.GetItemFromID(entryId, olFld.StoreID) as Outlook.MailItem; //移动到目标文件夹 selMailItem = olMailItem.Move(olFld) as Outlook.MailItem; olApp = selMailItem.Application as Outlook.Application; olExp = olApp.ActiveExplorer() as Outlook.Explorer; //新增代码******************* olExp.SelectionChange += OlExp_SelectionChange; //仅在此处清除选中状态 olExp.ClearSelection();
事件处理方法代码如下:
if (olExp.Selection.Count != 0) { olExp.SelectionChange -= OlExp_SelectionChange; olExp.ClearSelection(); if (olExp.IsItemSelectableInView(selMailItem)) olExp.AddToSelection(selMailItem); if (selMailItem != null) ReleaseComObject(selMailItem); if (olExp != null) ReleaseComObject(olExp); }
看起来ClearSelection会将选中计数设为0,但Outlook会因移动操作自动选中其他内容(而非被移动的邮件),之后上述代码会将选中项改为目标邮件。但这种方法像是临时 workaround,代码和UI表现都不够优雅。
基于回答评论的更新
以下方法似乎为Outlook提供了足够的UI更新时间,能够解决问题:
System.Windows.Threading.Dispatcher.CurrentDispatcher.InvokeAsync(new Action(() => { olExp.ClearSelection(); if (olExp.IsItemSelectableInView(selMailItem)) olExp.AddToSelection(selMailItem); }));
内容的提问来源于stack exchange,提问作者darbid
相关产品推荐
相关产品推荐

