如何将Outlook Ribbon(XML)切换按钮与自定义任务窗格同步?
Outlook COM加载项:自定义任务窗格与功能区切换按钮同步问题
我正在开发Outlook COM加载项,因需要上下文功能区,采用XML而非设计器实现。当前遇到的问题是:无法实现多Inspector场景下,功能区切换按钮与自定义任务窗格的VisibleChanged事件同步——当关闭某Inspector中的CustomTaskPane时,对应功能区的切换按钮无法自动重置为未按下状态。已多方搜索相关问题,但均未找到有效解决方案。
现有代码
1. ThisAddin.cs 中的 InspectorWrapper 类
public class InspectorWrapper { private Inspector inspector; private CustomTaskPane taskPane; public InspectorWrapper(Inspector Inspector) { inspector = Inspector; ((InspectorEvents_Event)inspector).Close += new InspectorEvents_CloseEventHandler(InspectorWrapper_Close); taskPane = Globals.ThisAddIn.CustomTaskPanes.Add( new SignatureControl(Inspector), "Signatures", inspector); taskPane.VisibleChanged += new EventHandler(TaskPane_VisibleChanged); } void TaskPane_VisibleChanged(object sender, EventArgs e) { } void InspectorWrapper_Close() { if (taskPane != null) { Globals.ThisAddIn.CustomTaskPanes.Remove(taskPane); } taskPane = null; Globals.ThisAddIn.InspectorWrappers.Remove(inspector); ((InspectorEvents_Event)inspector).Close -= new InspectorEvents_CloseEventHandler(InspectorWrapper_Close); inspector = null; } public CustomTaskPane CustomTaskPane { get { return taskPane; } } }
2. Ribbon 代码
public Ribbon1() { } #region IRibbonExtensibility-Member public string GetCustomUI(string ribbonID) { if (ribbonID == "Microsoft.Outlook.Explorer") { return GetResourceText("Test.Ribbon1.xml"); } if (ribbonID == "Microsoft.Outlook.Mail.Compose") { return GetResourceText("Test.MailComposeRibbon.xml"); } return null; } #endregion #region Callbacks public void Ribbon_Load(Office.IRibbonUI ribbonUI) { this.ribbon = ribbonUI; } public void toggleButton1_Click(Office.IRibbonControl control, bool pressed) { Globals.ThisAddIn.InspectorWrappers[(Inspector)control.Context].CustomTaskPane.Visible = pressed; }
最终解决方案
- 在
ThisAddin.cs中添加属性存储RibbonUI:
public IRibbonUI ribbonUI;
- 在Ribbon的
Ribbon_Load方法中赋值:
public void Ribbon_Load(Office.IRibbonUI ribbonUI) { this.ribbon = ribbonUI; Globals.ThisAddIn.ribbonUI = ribbonUI; }
- 在
TaskPane_VisibleChanged事件中触发功能区刷新:
void TaskPane_VisibleChanged(object sender, EventArgs e) { Globals.ThisAddIn.ribbonUI.Invalidate(); }
- 修改功能区XML,为切换按钮添加
getPressed回调方法:
<toggleButton id="toggleButton1" getPressed="toggleButton_GetPressed" onAction="toggleButton1_Click" label="Test" size="large" getImage="toggleButton_GetImage" />
- 实现
toggleButton_GetPressed方法,返回对应任务窗格的可见状态:
public bool toggleButton_GetPressed(IRibbonControl control) { return Globals.ThisAddIn.InspectorWrappers[(Inspector)control.Context].CustomTaskPane.Visible; }
内容的提问来源于stack exchange,提问作者AnDan
相关产品推荐
相关产品推荐

