BuiltIn RibbonControls in Office instanzieren

  • Allgemein

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von ftzdOp.

    BuiltIn RibbonControls in Office instanzieren

    Hallo Leute,
    ich komme eigentlich aus dem VBA Bereich als Hobbyprogrammierer; OOP ist mir trotzdem halbwegs geläufig, in der Praxis durch den bescheiden Umfang den VBA bietet, in der Theorie, weil ich mal etwas intensiver zum Thema allgemein gelesen habe. Aber diese ganze Thematik innerhalb von VS ist mir nicht wirklich vertraut Naja, bevor es jetzt eine lange Rede wird, komme ich mal zur eigentlichen Frage.

    Nun denn, irgendwie habe ich jetzt ein kleines (?) Projekt für das ich um VS wohl nicht herum komme. Ich würde gerne sämtliche BuiltIn-RibbonControls innerhalb einer Office-Application instanzieren und über die COM-Schnittstelle für VBA verfügbar machen.
    Die Implementierung der COM war kein Problem, der Zugriff auf die Word-Application auch nicht, aber ich kriege einfach nicht raus, wie ich diese blöden BuiltIn-Controls finde. Für Custom-Controls ist das ja überall gut beschrieben, aber eben nicht für die BuiltIn Teile...

    Wahrscheinlich geht das wohl gar nicht, wie ich meinen Schickalsfaden kenne, aber falls doch würde ich mich über zielführende Hinweise freuen.

    Ich habe mittlerweile herausgefunden, dass im WPF-Framework (sagt man das so ?) zwar entsprechend klingende Klassen (System.Windows.Controls) zur Verfügung stehen, aber ich weiß erstens nicht, ob man diese grundsätzlich innerhalb der VSTO nutzen kann, bzw. eventuell wie.

    Beste Grüße
    Hilfreiche Antworten als solche zu Kennzeichnen wäre klasse 8-)
    Hallo!

    Du möchtest die in Office integrierten Elemente ansprechen bzw. nutzen? Das müsste über die idMso/imageMso gehen. Ich kenne mich aber nur mit RibbonX und VBA aus, mit externen Programmierwerkzeugen habe ich keine Erfahrung.

    Gruß, René
    Erstmal Danke für Deine Antwort.

    VBA kenne ich mich ja auch ein wenig aus, wie Du im anderen Post ja sehen konntest. Über VBA, kriege ich die RibbonControllButtons nur als CommandControlButton; also ich gehe über Find Controls, gebe die Mso an und dann hab ich ihn. Allerdings ohne nutzbare Events. Die CommandButton werden dann über das Tab AddIn angesprochen. Also gibt es nur dort ein Event, wenn ich über den Tab AddIn auf den entsprechenden Button klicke. Welchen Sinn das auch immer haben soll...

    Eigentlich wollte ich eine Collection mit allen Controls erstellen wollen und die ClickEvents dann in den OfficeApps per COM verfügbar machen. Aber jetzt stecke ich da ziemlich fest, weil ich diese blöden Controls einfach nicht zu fassen bekomme. Hatte gedacht, bei der Ansammlung hier an Kompetenz gäbe es eine fixe Aussage, ob und eventuell eben wie das geht.
    Hilfreiche Antworten als solche zu Kennzeichnen wäre klasse 8-)
    Über die COM-Schnittstelle ist auch nur das greifbar was über VBA und/oder RibbonX genutzt werden kann. Per RibbonX kann ich ja auch die integrierten Elemente in eigenen Tabs nutzen (per idMso). Ein paar Beispiele.

    In VBA:

    Visual Basic-Quellcode

    1. Sub Test()
    2. Application.CommandBars.ExecuteMso "FileSaveAs"
    3. End Sub


    In RibbonX:

    HTML-Quellcode

    1. <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui">
    2. <ribbon>
    3. <tabs>
    4. <tab id="tab0" label="Test">
    5. <group id="grp0" label="Test">
    6. <button idMso="FileSaveAs" size="large" />
    7. </group>
    8. </tab>
    9. </tabs>
    10. </ribbon>
    11. </customUI>


    Normalerweise sollte es in VSTO so funktionieren wie in RibbonX. Zuerst eine XML-Datei mit dem RibbonX-Code anlegen, in diesem die gewünschten Elemente, und die XML-Datei einbinden mit Implements Office.IRibbonExtensibility.GetCustomUI. Je nach dem was Du alles implementieren möchtest könntest Du Dein COM-Add-In zum Überlaufen und somit die Anwendung zum Absturz bringen.


    (...) weil ich diese blöden Controls einfach nicht zu fassen bekomme (...)

    Maschinell bekommst Du die auch nicht ausgelesen, es sei denn Du hast drei bis vier Tage Zeit. Anders als in Office 2000-2003, bei denen man die Controls einfach per VBA auslesen konnte, kann man die idMso/imageMso nicht ohne Weiteres auslesen, da sich diese an einer Stelle bzw. in einer Datei befinden die Microsoft nicht bekanntgibt. Microsoft-Entwickler mussten einen Vertrag unterschreiben welcher bei Strafe verbietet öffentlich preiszugeben wo sich die idMso/imageMso befinden, und es darf auch nicht bekanntgegeben werden wie man die Icons in hoher Qualität extrahieren kann. Also bleibt nur alles manuell abzuschreiben, idMso/imageMso gibt es in den offiziellen Übersichten.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „mumpel“ ()

    Nein, ich meinte selber meine eigenen Collections über COM den OfficeApps/VBA zur Verfügung zu stellen.

    Sehe ich das richtig, dass ich die Standardcontrols also alle einmal in einen Custom-Tab aufführen muss und dann kann ich auf diese zugreifen ?

    EDIT: Ich lasse den Fred nochmal offen. Sobald ich ein BuiltIn-RibbonButton als ein instanziertes Objekt mit Zugriff auf sein OnClick-Event habe, poste ich den Code und markiere Fred als erledigt. (Ist ja wie beim 3D-Shooter 8-) )
    Hilfreiche Antworten als solche zu Kennzeichnen wäre klasse 8-)

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ftzdOp“ ()

    Kurze Zwischenfrage, weil dieser Thread meiner Meinung nach offensichtlich im falschen Bereich ist: Ist das eine Frage zu VBA, zu VB.NET oder zu Office?
    Besucht auch mein anderes Forum:
    Das Amateurfilm-Forum

    ftzdOp schrieb:


    (...) den OfficeApps (...)

    Meinst Du mit "Apps" die Apps auf Android und iOS? Wenn ja dann kannst Du Dir die Mühe sparen, denn auf Android und iOS gibt es kein Menüband. Wenn Du Microsoft Office (PC und Mac) meinst dann bitte nicht von Apps sprechen, denn MSO ist eine normale Anwendung (oder ein normales Programm), auch wenn es dafür eine Kachel zum Starten gibt und fälschlich als App bezeichnet wird.

    ftzdOp schrieb:


    (...) dass ich die Standardcontrols also alle einmal in einen Custom-Tab aufführen muss und dann kann ich auf diese zugreifen (...)

    Auch Deine eigenen Elemente musst Du in einer XML-Datei anlegen. Informationen darüber bekommst Du auf MSDN.
    OnMyTextButton geht, OnTest geht nicht. Beides wie erwartet.
    Wie kann ich denn jetzt ein Event und somit ja auch das Control selber von einem BuiltInControl erhalten ? Ich esse bald mein Keyboard auf.....

    Also mein Ziel ist es, die Events der Built-In-Controls abzufangen. Wie kann ich das machen ?

    XML-Quellcode

    1. <button idMso="MailMergeJapaneseGreetingInsert"
    2. onAction="OnTest"
    3. />
    4. <button id="textButton"
    5. onAction="OnMyTextButton"
    6. />

    VB.NET-Quellcode

    1. Public Sub OnTest(ByVal control As Office.IRibbonControl)
    2. Globals.ThisAddIn.Application.Selection.Range.Text ="OnTest Event"
    3. End Sub
    4. Public Sub OnMyTextButton(ByVal control As Office.IRibbonControl)
    5. Globals.ThisAddIn.Application.Selection.Range.Text ="OnMyTextButton Event"
    6. End Sub



    Hilfreiche Antworten als solche zu Kennzeichnen wäre klasse 8-)

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „ftzdOp“ ()

    Ich habs, zumindest den ersten Teil :) Also das Event abfangen. Fehlt dann noch das vorherige Auflisten aller Controls, um meine Collection zu bekommen.
    ... geht sogar direkt in VBA, aber eben auch in .NET

    Die Kurz-Lösung:
    1) Im CustomXML lediglich die Sektion (sagt man das so ? ) <COMMANDS> anlegen. Dann für die Elemente den entsprechenden Eintrag anlegen.

    XML-Quellcode

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <customUI xmlns="http://schemas.microsoft.com/office/2009/07/customui" onLoad="Ribbon_Load">
    3. <commands>
    4. <command idMso="FileSave"
    5. onAction="OnAction_Test"
    6. />
    7. </commands>
    8. </customUI>

    Und dann das Event anlegen. Der entscheidenende Unterschied zu dem obigem Versuch ist, dass das Event (Der korrekte Name müsste wohl Callback und nicht Event sein.) einen ByRef Cancel As Boolean Parameter benötigt. Eventuell kann bei einigen anderen Controls eine andere Parametrisierung nötig sein.

    VB.NET-Quellcode

    1. Public Sub OnAction_Test(ByVal control As Office.IRibbonControl, ByRef cancelReturn As Boolean)
    2. Globals.ThisAddIn.Application.Selection.Range.Text = "OnTest Event"
    3. cancelReturn = False ' Bei True würde die eigentliche Aktion NICHT ausgeführt.
    4. End Sub


    EDIT: Ich lasse Fred noch aktiv, bis ich die Collection habe

    Danke an rholtz-office: rholtz-office.de/ribbonx/command_ebene
    Hilfreiche Antworten als solche zu Kennzeichnen wäre klasse 8-)

    Dieser Beitrag wurde bereits 9 mal editiert, zuletzt von „ftzdOp“ ()

    Normalerweise über die Command-Ebene der Ribbon-Definition, wie Du schon erkannt hast. Beachte dass die Command-Ebene eine globale Aktion/Einstellung ist, Du also möglicherweise die Original-Aktionen überschreibst. Wenn Du nur die Icons möchtest dann nutze besser imageMso anstatt idMso.