You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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;
}

最终解决方案

  1. 在ThisAddin.cs中添加属性存储RibbonUI:
public IRibbonUI ribbonUI;
  1. 在Ribbon的Ribbon_Load方法中赋值:
public void Ribbon_Load(Office.IRibbonUI ribbonUI)
{
    this.ribbon = ribbonUI;

    Globals.ThisAddIn.ribbonUI = ribbonUI;
}
  1. 在TaskPane_VisibleChanged事件中触发功能区刷新:
void TaskPane_VisibleChanged(object sender, EventArgs e)
{
    Globals.ThisAddIn.ribbonUI.Invalidate();
}
  1. 修改功能区XML,为切换按钮添加getPressed回调方法:
<toggleButton id="toggleButton1" getPressed="toggleButton_GetPressed" onAction="toggleButton1_Click" label="Test" size="large" getImage="toggleButton_GetImage" />
  1. 实现toggleButton_GetPressed方法,返回对应任务窗格的可见状态:
public bool toggleButton_GetPressed(IRibbonControl control)
{
    return Globals.ThisAddIn.InspectorWrappers[(Inspector)control.Context].CustomTaskPane.Visible;
}

内容的提问来源于stack exchange,提问作者AnDan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 21:25:55