Inhaltsverzeichnis

Contributions

Contributions sind die deklarativen Beiträge, die ein Add-in zur Benutzeroberfläche der Shell leistet. Sie werden im contributes-Block des Manifests beschrieben und vom Host ausgewertet, bevor die DLL des Add-ins geladen wird. Dadurch steht die Oberfläche vollständig, noch bevor eine einzige Zeile Add-in-Code ausgeführt wird.

Das Contribution-System löst ein grundsätzliches Problem nativer Erweiterungssysteme: Wenn die Oberfläche erst nach dem Laden aller DLLs aufgebaut wird, startet die Anwendung langsam und verbraucht unnötig Speicher. Indem der Host stattdessen die Metadaten aus den Manifesten liest und daraus Menüs, Toolbars und Seitenleisten aufbaut, bleibt der Start schnell. Die DLL wird erst geladen, wenn der Benutzer tatsächlich eine Funktion des Add-ins aufruft.

Zurück zur Übersicht.

Contribution-Typen

Der Host unterstützt folgende Contribution-Typen:

Typ Beschreibung Seite
Commands Benannte Aktionen, die von Menüs, Toolbar und Tastenkürzel ausgelöst werden Commands
Menüs Menüpunkte in der Menüleiste, in Kontextmenüs und in View-Titelleisten Menü-Merge
Toolbar Buttons in der Haupt-Toolbar, der QuickBar und der ActionBar Toolbar, QuickBar & ActionBar
Sidebar-Views Panels in der Seitenleiste, gruppierbar als Accordion Sidebar-Views
Document-Sidebar-Affinity Sidebar-Views an Dokumenttypen binden Document-Sidebar-Affinity
StatusBar Informationsfelder in der Statusleiste StatusBar
Keybindings Tastenkürzel für Commands Keybindings
Configuration Einstellungen, die im Settings-Editor erscheinen Manifest
Themes Farbschemata nach dem Skin-Vertrag Skin-Vertrag
Welcome-Page Sektionen auf der zentralen Willkommensseite (Titel + Links) Welcome-Page Sections
ViewsWelcome Begrüßungsinhalte für leere Views Manifest

Merge-Verfahren

Wenn mehrere Add-ins Beiträge zum selben Ort liefern — etwa beide einen Menüpunkt im Tools-Menü registrieren —, muss der Host diese Beiträge zusammenführen (mergen). Das Merge-Verfahren folgt zwei Regeln:

Sortierung nach Gruppe und Priorität

Jeder Menüpunkt, Toolbar-Button und jedes Tastenkürzel kann eine group und eine order angeben. Der Host sortiert die Einträge zuerst nach Gruppe (alphabetisch), dann innerhalb der Gruppe nach Priorität (numerisch aufsteigend). Zwischen Gruppen fügt der Host einen Trennstrich ein. Dadurch ergibt sich eine vorhersagbare Reihenfolge, die von der Installationsreihenfolge der Add-ins unabhängig ist.

Bedingte Sichtbarkeit über When-Ausdrücke

Jeder Beitrag kann einen when-Ausdruck enthalten, der gegen die Context Keys des Hosts ausgewertet wird. Ein Menüpunkt mit when: „hasActiveDocument && !readOnly“ ist nur sichtbar, wenn ein Dokument geöffnet und nicht schreibgeschützt ist. Der Host wertet diese Ausdrücke dynamisch aus — ändert sich ein Kontextwert, aktualisiert der Host die Sichtbarkeit aller betroffenen UI-Elemente sofort.

Statisch vs. dynamisch

Die meisten Contributions werden statisch im Manifest deklariert. Das ist der bevorzugte Weg, weil der Host sie sofort verarbeiten kann, ohne die DLL zu laden.

Für Szenarien, in denen Contributions von Laufzeitdaten abhängen, bieten die Services programmatische Methoden: IMenuService.AddMenuItem, IToolbarService.AddToolbarItem und so weiter. Diese dynamischen Registrierungen werden genauso gemergt wie statische. Der Host unterscheidet intern zwischen beiden (IsStatic-Flag), behandelt sie aber in der Oberfläche identisch.

Weiter zu den einzelnen Contribution-Typen: