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

14

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

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;
}

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

4个回答

14
以下链接可能会为您提供一些见解: http://msdn.microsoft.com/en-us/library/ff863278.aspx 控件的“上下文”给出了您正在自定义的对应 Outlook 对象(例如,一个检查器对象)。从那里,您需要引用上下文对象的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;
}

希望这能有所帮助。


2
这在阅读窗格中不起作用,因为上下文是Selection的一个实例。但你让我找对了方向,谢谢! - Keith

11

您可以在选择邮件项目后,从上下文菜单中点击事件触发后检索邮件项目 -

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;
                }
        }
}

更多细节请访问此处


4

当我无法弄清动态Com对象是什么时,我使用这个。

添加对 Microsoft.VisualBasic 的引用。

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

我需要它来处理与你几乎相同的事情,我的IRibbonControl.Context实际上也是一个Selection,尽管只选择了一个项目。


0
如果您想在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;

在我的情况下,“全局变量”对我很有用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接