C# VSTO Outlook插件如何将Ribbon onAction的MailItem传给ThisAddIn方法
问题修复方案
1. 修正Ribbon.xml语法错误
你现有XML中重复嵌套了<contextMenus>节点,属于无效格式,修正后代码如下:
<?xml version="1.0" encoding="UTF-8"?> <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load"> <ribbon> </ribbon> <contextMenus> <contextMenu idMso="ContextMenuMailItem"> <button id="AddSubject" label="Add a Subject" onAction="AddSubject" /> </contextMenu> </contextMenus> </customUI>
2. 修正MyRibbon.cs中MailItem获取逻辑
你之前的错误在于:右键邮件场景下control.Context是Outlook.Selection集合类型,不能直接强转为MailItem,且Outlook的选中集合索引从1开始,修正后的代码如下:
public void AddSubject(Office.IRibbonControl control) { if (control.Context is Outlook.Selection selection && selection.Count > 0) { // 取第一个选中的邮件项 if (selection[1] is Outlook.MailItem mi) { // 直接调用ThisAddIn的公开方法即可 Globals.ThisAddIn.func(mi); } } }
3. 修正Ribbon实例创建逻辑
你当前CreateRibbonExtensibilityObject返回的是Ribbon1实例,如果你的右键回调定义在MyRibbon类中,需要修改返回值为MyRibbon的实例,否则回调不会触发:
protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject() { return new MyRibbon(); }
4. 跨类调用func方法说明
只需确保ThisAddIn.cs中的func方法定义为public,即可直接通过Globals.ThisAddIn.func(获取到的MailItem实例)调用。
内容的提问来源于stack exchange,提问作者Akanksha_p
相关产品推荐
相关产品推荐

