我正在创建一个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;
}
有谁知道这里发生了什么?谢谢!
答案 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;
就我而言,“全球专家”为我工作。