Ich habe ein eigenes Band mit mehreren Kontrollkästchen in einem Menü:Kästchen zum Ankreuzen der OnAction tut nichts
<?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>
Dies ist der jeweilige C# -Code:
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
}
}
ist jedoch OnCheckboxChanged
nie genannt. Es funktioniert gut, wenn ich diese Callback-Funktion mit Buttons verwende, aber nicht mit Checkboxen, weder im Menü noch direkt in der Ribbon-Gruppe. Es funktioniert auch mit getPressed
anstelle von onAction
.
In einigen Diskussionen über VSTO-Checkboxen mit getPressed anstelle von onAction wird empfohlen. Die MSDN-Dokumentation gibt jedoch eindeutig an, dass OnAction auch für Checkboxen vorhanden ist. Außerdem hat getPressed eine andere Bedeutung: getPressed wird aufgerufen, wenn das Ankreuzfeld erscheint - für Checkboxen direkt im Ribbon, wenn das Ribbon aktiviert ist, für Checkboxen im Menü, wenn das Menü geöffnet wird. Interessanterweise scheint es während der Laufzeit des Add-Ins nur einmal aufgerufen zu werden. –