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

时间:2011-07-28 20:28:40

标签: c# vsto outlook-addin

我正在创建一个Outlook 2010加载项,并为我的功能区添加了一个上下文菜单,用于idMso =“contextMenuMailItem”。点击后,我想删除一个类别但是在click事件处理程序中,当我将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 个答案:

答案 0 :(得分:13)

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

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

希望这有帮助。

答案 1 :(得分:8)

您可以从所选邮件项目 -

的上下文菜单中点击事件后检索邮件项目
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

答案 2 :(得分:4)

当我无法弄清楚动态ComObject是什么时,我会使用它。

添加对Microsoft.VisualBasic的引用

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

只需要与你几乎相同的东西,我的IRibbonControl.Context实际上也是一个选择,尽管它只是选择了一个项目。

答案 3 :(得分:0)

如果您要在Ribbon.cs中引用TheAddin,也许您也可以考虑使用“全局”。

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

Outlook

 - ThisAddin.cs

Ribbon1.cs

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

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

然后在Ribbon1.cs中使用“全局”对其进行访问

MailItem item=Globals.ThisAddin.myMail;

就我而言,“全球专家”为我工作。