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?