RibbonExtensibility: Vom Schreiben (von Markup) und Überschreiben (von Funktionalität)


Wenn Sie jetzt und heute mit dem Juni CTP von VSTO 3 und Office 2007 Beta 2 Ribbons erweitern wollen, brauchen Sie u.U. etwas Hilfe, was die Möglichkeiten überhaupt bzw. die Syntax anbetrifft. Um z.B. IntelliSense in Visual Studio für RibbonX XML Files zu bekommen, benötigen Sie derzeit noch das zugrunde liegende XML Schema (Schema Definition File), welches Sie einfach nur im aktuellen Projekt öffnen. Dann einfach ins Ribbon XML File wechseln und es geht los. Spitze Klammmer "<" eingeben und IntelliSense steht Ihnen zur Seite:


Wenn in Office eingebaute Tabs und Groups verwendet werden sollen, benötigen Sie die IDs und Namen derselben. Eine Liste der Control IDs der eingebauten Office-Elemente (Commands, Buttons, etc.) gibt es hier


Doch das Deklarieren des UI, also der Ribbon Tabs, Groups und Controls, ist nur die eine Seite. Irgendwann sollte über die eingebauten Controls auch Funktionalität erreichbar sein. Callback Handler wurden zwar im XML deklariert, müssen aber noch implementiert werden. Eine (vorläufige) Auflistung verfügbarer Callback Handler der Ribbon Controls für C#, VB.NET, C++ und VBA finden Sie hier.


Übrigens können mit RibbonX auch Befehle von Office überschrieben werden. dazu gibt es die <commands> Sektion:


Im Beispiel wird der Save bzw. Print Befehl überschrieben. Ein Callback Handler dafür könnte so aussehen:


Public Sub mySave(ByVal control As Office.IRibbonControl, ByRef CancelDefault As Boolean) 
   ' Do anything you like
   CancelDefault = True
End Sub


Über getEnabled wiederum kann gesteuert werden, ob das Element verfügbar sein soll:


Public Function getEnabled(ByVal control As Office.IRibbonControl) As Boolean
   Select Case control.Id
      Case "Save" : Return bSaveStatus
      Case "Print" : Return bPrintStatus
      ...
   End Select
End Function


bSaveStatus bzw. bPrintStatus sind hier entsprechende Flags, welche den gewünschten Zustand der eingebauten Funktion abbilden.


Über eine andere Routine (möglicherweise auch der Callback eines Buttons im Ribbon) wird dann Invalidate aufgerufen, welches das RibbonUI erneut setzt:


Public Sub EnableSave(ByVal control As Office.IRibbonControl)
   bSaveStatus =
True
   bPrintStatus = True

  
Me.ribbon.Invalidate()
End Sub







Public Sub DisableSave(ByVal control As Office.IRibbonControl)
   bSaveStatus = 
False
   bPrintStatus = False

  
Me.ribbon.Invalidate()
End Sub


Das Beste an der ganzen Geschichte ist, daß es nur an einer Stelle dem Host mitgeteilt werden muß und alle Vorkommen von Save oder Print sind automatisch überschrieben. Und noch besser: wird das zugrunde liegende Add-In entladen, verschwindet auch diese Beeinflussung der Standardfunktionalität - und zwar, ohne daß dafür "Clean Up" Code geschrieben werden muß. Das ist cool, oder?


 


 

Comments (1)

  1. In meinem RibbonX Artikel hatte ich beschrieben, woher man die das Ribbon Schema File, die Control IDs

Skip to main content