如何从 Outlook 功能区上下文菜单中获取当前邮件项目

Posted

技术标签:

【中文标题】如何从 Outlook 功能区上下文菜单中获取当前邮件项目【英文标题】:How do I get the current mail item from Outlook ribbon context menu 【发布时间】:2011-10-15 11:13:59 【问题描述】:

我正在创建一个 Outlook 2010 加载项,并为 idMso="contextMenuMailItem" 添加了一个上下文菜单到我的功能区。单击时,我想删除一个类别,但在单击事件处理程序中,当我将 ctl.Context 转换为 MailItem 时,它始终为空。

public bool btnRemoveCategory_IsVisible(Office.IRibbonControl ctl)

    MailItem item = ctl.Context as MailItem; //Always null
    if (item != null)
        return (item != null && HasMyCategory(item));
    else
        return false;

有人知道这里发生了什么吗?谢谢!

【问题讨论】:

【参考方案1】:

以下链接可能会为您提供一些见解:

http://msdn.microsoft.com/en-us/library/ff863278.aspx

控件的“上下文”为您提供了您正在自定义的相应 Outlook 对象(例如 Inspector 对象)。从那里您需要引用上下文对象的 CurrentItem 属性来获取 MailItem。

例如,

public bool btnRemoveCategory_IsVisible(Office.IRibbonControl ctl)

    var item = ctl.Context as Inspector;
    var mailItem = item.CurrentItem as MailItem;
    if (item != null)
        return (item != null && HasMyCategory(item));
    else
        return false;

希望这会有所帮助。

【讨论】:

这在阅读窗格中不起作用 b/c 上下文是选择的一个实例。但你让我走上了正轨,谢谢!【参考方案2】:

当我不知道什么是动态 ComObject 时,我会使用它。

添加对 Microsoft.VisualBasic 的引用

private void whatType(object obj)
           
  System.Diagnostics.Debug.WriteLine(Microsoft.VisualBasic.Information.TypeName(obj));

几乎和你一样需要它,我的 IRibbonControl.Context 实际上也是一个选择,尽管它只被选中了一个项目。

【讨论】:

【参考方案3】:

您可以在从所选邮件项的上下文菜单中触发单击事件后检索邮件项-

public bool btnRemoveCategory_IsVisible(Office.IRibbonControl ctl)

        Explorer explorer = Globals.ThisAddIn.app.ActiveExplorer();
            if (explorer != null && explorer.Selection != null && explorer.Selection.Count > 0)
            
                object item = explorer.Selection[1];
                if (item is MailItem)
                
                    MailItem mailItem = item as MailItem;
                
        

更多详情请访问here。

【讨论】:

【参考方案4】:

如果你想在 Ribbon.cs 中引用 TheAddin,也许你也可以考虑使用“Globals”。

例如,假设您在解决方案资源管理器中有以下文件:

Outlook

 - ThisAddin.cs

Ribbon1.cs

在“ThisAddin.cs”中声明一个公共 MailItem 并将邮件项分配给它:

public MailItem myMail = null;
...
myMail=....

然后在 Ribbon1.cs 中使用“Globals”访问它

MailItem item=Globals.ThisAddin.myMail;

就我而言,“全局”对我有用。

【讨论】:

以上是关于如何从 Outlook 功能区上下文菜单中获取当前邮件项目的主要内容,如果未能解决你的问题,请参考以下文章

用于上下文菜单的 Outlook 2010 Fluent 用户界面控件标识符

从 QGraphicsItem 上的上下文菜单操作中获取事件

单击上下文菜单项后验证当前 URL

出现上下文菜单时如何获取鼠标位置?

如何从 VSTO 插件中找出当前版本的 Outlook?

在 Outlook 2007 中获取当前用户的电子邮件地址