2017-07-04 3 views
5

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.

+2

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. –

Antwort

0

Diese thread und diese Social MSDN thread beide zeigen onAction hat ein zweites Argument im Parameter; isPressed.

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

public void cbViewAction(Office.IRibbonControl control, bool pressed) 
{ 

Es ist auch die Art und Weise 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."); 
    } 
} 

definieren Callback Methoden

  1. Es muss als public deklariert werden.
  2. Ihr Name muss mit dem Namen einer Callback-Methode übereinstimmen, die Sie einem Steuerelement in der Ribbon-XML-Datei zugewiesen haben.
  3. Die Signatur muss mit der Signatur eines Callback-Typs übereinstimmen, der für das zugeordnete Ribbon-Steuerelement verfügbar ist.

Hend von diesem Artikel zu lesen I Customizing the 2007 Office Fluent Ribbon for Developers (Part 3 of 3)

Kann ich zwei Rückrufe mit dem gleichen Namen, aber unterschiedlichen Signaturen?

Obwohl Sie dies tun können, empfehlen wir Ihnen, für jeden Steuer verschiedene Rückrufe (und zählen nicht auf integrierte in eine Überlastung der Unterschied zwischen den beiden Rückrufe zu handhaben). Angenommen, Sie schreiben ein Fluent UI-Add-In mit zwei Callbacks mit demselben Namen wie im folgenden Code.

public void doSomething(IRibbonControl control, bool pressState); 
public void doSomething(IRibbonControl control); 

übernehmen Sie auch, dass Ihr XML-Markup ein Umschaltfeld-Steuerelement und ein Button-Steuerelement definiert, und dass jeder von ihnen eine onAction = „doSomething“ Rückruf hat. In dieser Instanz wird nur das ToggleButton-Steuerelement aufgrund der Visual Basic und Visual C# automatisch generierten IDispatch-Implementierung funktionieren. Wenn Sie ein C++ - Add-In schreiben und IDispatch selbst implementieren, funktioniert dieser Fall. (Mit anderen Worten, es ist das Beste, dies nicht zu tun.)

+1

Ich dachte, dass ich das versucht habe, aber wie es scheint, habe ich es falsch gemacht. Ich werde das Kopfgeld in den nächsten Tagen vergeben (jetzt ist die Funktion noch blockiert). –

Verwandte Themen