2011-07-28 4 views
13

Outlook 2010アドインを作成していて、idMso = "contextMenuMailItem"のリボンにコンテキストメニューを追加しました。クリックすると、カテゴリを削除したいのですが、Clickイベントハンドラで、ctl.ContextをMailItemにキャストすると、常にnullになります。Outlookリボンのコンテキストメニューから現在のメールアイテムを取得するには

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

ここで何が起こっているのか分かりますか?ありがとう!

答えて

13

次のリンクは、いくつかの洞察を提供可能性があります

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

3

私は動的なComObjectが何であるか分かりません。

Microsoft.VisualBasic

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

への参照を追加しますが、ちょうどあなたとほぼ同じもののためにそれを必要とし、私のIRibbonControl.Contextは、それが唯一の選択された一つの項目であるにもかかわらず、あまりにも、実際に選択しました。クリックイベントが選択されたメールアイテムからコンテキストメニューから発射した後

4

あなたは、メールアイテムを取得することができます - 詳細については

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をご覧ください。