我有一个自定义功能区,菜单中有几个复选框:
<?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>
这是相应的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
}
}
但是,永远不会调用OnCheckboxChanged
。当我使用带有按钮的回调函数时,它可以正常工作,但它既没有复选框,也没有在菜单中,也没有直接在功能区组中。它也适用于getPressed
而不是onAction
。
答案 0 :(得分:1)
此thread和此Social MSDN thread都表示onAction
在参数中有第二个参数; isPressed
。
public void markAsRead_OnAction(Office.IRibbonControl control, bool isPressed)
{
public void cbViewAction(Office.IRibbonControl control, bool pressed)
{
这也是official documentation states to do it:
的方式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.");
}
}
定义回调方法
继续那篇文章后,我读了Customizing the 2007 Office Fluent Ribbon for Developers (Part 3 of 3)
我可以使用相同名称但签名不同的两个回调吗?
虽然你可以这样做,但我们建议你为每个控件都有不同的回调(并且不要指望内置的重载来处理两个回调之间的区别)。例如,假设您编写了一个带有两个同名回调的Fluent UI加载项,如下面的代码所示。
public void doSomething(IRibbonControl control, bool pressState);
public void doSomething(IRibbonControl control);
还假设您的XML标记定义了一个toggleButton控件和一个按钮控件,并且每个控件都有一个onAction =“doSomething”回调函数。 在这种情况下,由于Visual Basic和Visual C#自动生成的IDispatch实现,只有toggleButton控件才有效。如果您自己编写C ++加载项并实现IDispatch,则此案例将起作用。 (换句话说,最好不要这样做。)