简体   繁体   中英

How do I get the current mail item from Outlook ribbon context menu

I am creating an Outlook 2010 add-in and have added a context menu to my ribbon for idMso="contextMenuMailItem". On click, I would like to remove a category but in the click event handler, when I cast ctl.Context to MailItem, it's always 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;
}

Does anyone know what's going on here? Thanks!

The following link might provide you with some insight:

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

The "context" of the control gives you the corresponding Outlook object that you are customizing (for example an Inspector object). From there you'll need to reference the context object's CurrentItem property to get the MailItem.

For example,

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

Hopefully, this helps.

You can retrieve Mail Item after click event fired from context menu from selected mail item -

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

For more details visit here .

I use this when I can't work out what a dynamic ComObject is.

Add a reference to Microsoft.VisualBasic

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

Just needed it for almost the same thing as you, my IRibbonControl.Context was actually a Selection too despite it only being one item selected.

If you want to reference TheAddin in the Ribbon.cs, maybe you could also think to use "Globals".

For instance let say you have like following files in the solution explorer:

Outlook

 - ThisAddin.cs

Ribbon1.cs

Declare a public MailItem lin the 'ThisAddin.cs' and assign the mail item to it:

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

Then in the Ribbon1.cs access to it by using "Globals"

MailItem item=Globals.ThisAddin.myMail;

In my case, the "Globals" worked for me.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM