2013-04-17 9 views
6

Sto sviluppando un componente aggiuntivo di Word con la sua scheda Ribbon. La maggior parte del mio codice attuale è contenuta in alcune classi di servizi che vengono inizializzate in ThisAddIn_Startup e assegnate alle proprietà dell'oggetto Singleton di ThisAddIn. Ho anche un listener di eventi che ascolta gli eventi degli appunti che vorrei esporre al resto del codice come una proprietà dello stesso oggetto.La barra multifunzione personalizzata viene caricata prima di ThisAddIn_Startup, ma mi piacerebbe inizializzarne alcune - la migliore soluzione?

Il problema che sto eseguendo è che l'evento Load della mia barra si attiva prima dell'evento Startup di ThisAddIn (anche se l'oggetto singleton è già stato inizializzato e assegnato a Globals.ThisAddIn). Nel gestore di eventi Load della mia barra multifunzione vorrei installare un gestore su quel listener e utilizzare anche uno di questi servizi. Non posso, però, perché a questo punto dell'esecuzione del programma sono nulli.

Qual è la migliore soluzione a questo problema? Potrei semplicemente rendere tutte queste cose statiche membri di ThisAddIn e inizializzarle in un costruttore statico, ma ciò sembra sbagliato e distrugge anche l'intero punto di avere un evento Startup (o un oggetto Singleton).

Stranamente, originariamente non avevo questo problema quando il mio Ribbon aggiungeva solo i suoi componenti alla scheda Add-In incorporata, quindi l'evento Load attivato dopo l'avvio.

(Nota: sto facendo tutto questo in Visual Studio 2012 e con il progettista del nastro.)

risposta

5

A questo scopo sto ignorando BeginInit metodo. Dai miei eventi esperienza occure in ordine (nastro/inizializzazione correlati):

  1. CreateRibbonExtensibilityObject
  2. BeginInit
  3. GetCustomUI
  4. Ribbon_Load
  5. ThisAddIn_Startup
1

Ho testato la soluzione di tinamou, non funziona più. Ribbon_load si è effettivamente verificato dopo BeginInit ma in questa fase la barra multifunzione è fissa e di sola lettura. Non c'è modo di aggiungere pulsanti di gruppo .. (è comunque possibile modificare i menu dinamici).

Penso che il modo migliore (stabile) è precaricare diversi gruppi ecc. E utilizzare la proprietà di controlli visibility per ottenere un tipo di nastro dinamico.

Vedere anche questo post localize VSTO addin according to the language of the office product, sembra che lo CreateRibbonExtensibilityObject venga attivato a caso.

+2

In realtà non uso più la risposta accettata sopra. (Qual è la risposta SO appropriata a questo? Dovrei aggiungerne una nuova e spostare l'accettazione?) Quello che faccio è modificare il costruttore in Ribbon.Designer.cs per chiamare un metodo "ManualInitialize". Questo codice include tutto ciò che non dipende da ThisAddIn_Startup. Quindi aggiungo un altro metodo in Ribbon.cs "FinalStartup" chiamato da ThisAddIn_Startup che contiene tutto ciò che * fa * dipende da ThisAddIn_Startup. –

+0

Penso che dovresti rimuovere la risposta accettata e lasciare la tua domanda come senza risposta. Forse quel qualcuno troverà un modo migliore. – Malick

Problemi correlati