Checkbox的OnAction没有做任何事情

Mic*_*ort 5 c# excel vsto

我有一个自定义功能区,菜单中有几个复选框:

<?xml version="1.0" encoding="UTF-8"?>
<customUI xmlns="http://schemas.microsoft.com/office/2006/01/customui" onLoad="Ribbon_Load">
  <ribbon>
    <tabs>
      <tab id="ribbon" label="Ribbon">
        <group id="ribbonGroup" label="Group">
          <menu id="menu" label="Menu">
            <checkBox id="checkbox1" label="Checkbox 1" visible="true" onAction="OnCheckboxChanged"/>            
            <checkBox id="checkbox2" label="Checkbox 2" visible="true" onAction="OnCheckboxChanged"/>            
            <checkBox id="checkbox2" label="Checkbox 2" visible="true" onAction="OnCheckboxChanged"/>            
        </group>
      </tab>
    </tabs>
  </ribbon>
</customUI>
Run Code Online (Sandbox Code Playgroud)

这是相应的C#代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;
using System.Drawing;
using System.Windows.Forms;
using Office = Microsoft.Office.Core;
using Excel = Microsoft.Office.Interop.Excel;
using Microsoft.Office.Tools.Excel;

namespace ExcelAddIn1
{
    [ComVisible(true)]
    public class SSRRibbon : Office.IRibbonExtensibility
    {
        private Office.IRibbonUI ribbon;

        public SSRRibbon()
        {
        }

        #region IRibbonExtensibility-Member
        public string GetCustomUI(string ribbonID)
        {
            return GetResourceText("ExcelAddIn1.SSRRibbon.xml");
        }
        #endregion

        #region ribbon callback functions
        public void Ribbon_Load(Office.IRibbonUI ribbonUI)
        {
            this.ribbon = ribbonUI;
        }

        public void OnCheckboxChanged(Office.IRibbonControl control)
        {
            int i = 1;
        }
        #endregion

        #region auxiliary
        private static string GetResourceText(string resourceName)
        {
            Assembly asm = Assembly.GetExecutingAssembly();
            string[] resourceNames = asm.GetManifestResourceNames();
            for (int i = 0; i < resourceNames.Length; ++i)
            {
                if (string.Compare(resourceName, resourceNames[i], StringComparison.OrdinalIgnoreCase) == 0)
                {
                    using (StreamReader resourceReader = new StreamReader(asm.GetManifestResourceStream(resourceNames[i])))
                    {
                        if (resourceReader != null)
                        {
                            return resourceReader.ReadToEnd();
                        }
                    }
                }
            }
            return null;
        }
        #endregion
    }
}
Run Code Online (Sandbox Code Playgroud)

但是,OnCheckboxChanged永远不会被称为.当我使用带有按钮的回调函数时,它可以正常工作,但它既没有复选框,也没有在菜单中,也没有直接在功能区组中.它也适用于getPressed而不是onAction.

Jer*_*son 1

线程和该Social MSDN 线程都表明onAction参数中有第二个参数;isPressed

public void markAsRead_OnAction(Office.IRibbonControl control, bool isPressed)
{

public void cbViewAction(Office.IRibbonControl control, bool pressed)
{
Run Code Online (Sandbox Code Playgroud)

这也是官方文档声明的方式:

public void OnActionCallback(Office.IRibbonControl control, bool isPressed)
{
    if (control.Id == "checkBox1")
    {
        MessageBox.Show("You clicked " + control.Id);
    }
    else
    {
        MessageBox.Show("You clicked a different control.");
    }
}
Run Code Online (Sandbox Code Playgroud)

定义回调方法

  1. 它必须被声明为公开的。
  2. 其名称必须与您分配给功能区 XML 文件中的控件的回调方法的名称匹配。
  3. 其签名必须与可用于关联功能区控件的回调方法类型的签名匹配。

继该文章之后,我阅读了为开发人员自定义 2007 Office Fluent Ribbon(第 3 部分,共 3 部分)

我可以有两个具有相同名称但不同签名的回调吗?

尽管您可以这样做,但我们建议您为每个控件设置不同的回调(并且不要依靠内置重载来处理两个回调之间的区别)。例如,假设您编写一个具有两个同名回调的 Fluent UI 加载项,如以下代码所示。

public void doSomething(IRibbonControl control, bool pressState);
public void doSomething(IRibbonControl control);
Run Code Online (Sandbox Code Playgroud)

还假设您的 XML 标记定义了一个toggleButton 控件和一个按钮控件,并且每个控件都有一个 onAction="doSomething" 回调。在本例中,由于 Visual Basic 和 Visual C# 自动生成的 IDispatch 实现,因此只有切换按钮控件可以工作。如果您编写一个 C++ 插件并自己实现 IDispatch,则这种情况会起作用。(换句话说,最好不要这样做。)