2011-04-25 9 views
9

Sto lavorando a un componente aggiuntivo a livello di app Word 2007. Finora, non ho riscontrato ostacoli di rilievo tranne la conversione dell'interfaccia Ribbon del componente aggiuntivo in XML. Devo usare Ribbon XML perché la funzione su cui sto lavorando può essere eseguita in questo modo. Il problema è che passando a Ribbon XML non riesco più ad accedere all'interfaccia in fase di esecuzione tramite Globals.Ribbons. Questo collegamento http://msdn.microsoft.com/en-us/library/bb772088.aspx fa un buon lavoro che spiega come accedere a una barra di progettazione di Visual Designer ma ignora completamente il caso del nastro XML. Nello specifico, devo essere in grado di accedere ad alcuni controlli visivi come le etichette. Come posso raggiungere questo obiettivo?Esiste un modo per accedere a una barra multifunzione (XML) in fase di esecuzione?

risposta

8

Globals.Ribbons è una funzionalità di progettazione VSTO, se si utilizza RibbonXML, non si dispone di questa funzionalità. Ciò che il progettista fa effettivamente sotto le copertine creerà nastro xml per Office, quindi quando l'ufficio effettua una richiamata, VSTO solleverà il gestore di eventi appropriato per quel contesto (documento). Poiché stai usando RibbonXML, stai bypassando completamente il supporto del designer di Ribbon VSTO (lo preferisco in questo modo, è più veloce e hai un maggiore controllo).

Con ribbon XML è necessario registrare un callback onLoad per l'etichetta, Office quindi ti passerà un IRibbonControl, che sarà l'etichetta, e avrai cose limitate che puoi fare. Se si volesse cambiare il testo, allora in cima alla mia testa dovresti registrare un callback getText, quindi invalidare quel controllo della barra multifunzione, che farà sì che il callback getText venga rivalutato.

Avere più informazioni su ciò che si vuole ottenere sarebbe comodo =) Ho la sensazione che il mio progetto VSTO contrib renderà la tua vita molto più semplice, dato che ti offre molte delle funzioni di Ribbon Designer quando usi il ribbon xml . Ma fammi sapere cosa vuoi fare e posso darti maggiori informazioni al riguardo.

Cheers, Jake

+0

Ciao Jake. Grazie per la risposta. Ho fatto molte ricerche da quando ho postato questa domanda e sono arrivato alla stessa conclusione. Speravo ancora che qualcuno avesse trovato un modo per accedere all'interfaccia da Global.Ribbons. In ogni caso, in realtà ho convertito la mia soluzione e ora utilizzo RibbonXML e callback per modificare le etichette, visualizzare le informazioni e modificare la visibilità di determinati controlli. – AlgolDocks

+0

La tua risposta/risposta Jake è molto apprezzata. MSDN non sembra coprire questo ovunque. L'invalidazione del controllo ha funzionato perfettamente. – Daniel

1

Quando si sta tentando di accedere a Globals.ribbons?

Come ricordo, non verrà popolato fino alla fine della fase di avvio di Word.

se si tenta di accedervi troppo presto, non sarà ancora definito alcun nastro.

+0

Sto cercando di accedere alle Globals.Ribbons da Application_DocumentOpen che è la funzione che viene chiamata quando un nuovo documento viene aperto. Il fatto è che questo funzionava per la barra multifunzione di Visual Designer. Tuttavia, dopo il passaggio, Globals.Ribbons.Count è sempre 0 anche se viene visualizzata la barra multifunzione XML. – AlgolDocks

3

Quando si lavora con XML della barra multifunzione, ho provato questo, ma non ho potuto accedere alla proprietà Ribbon1 dalle Globals.Ribbons .. La semplice proprietà non era lì ..

Tuttavia, mi venne in mente un'altra soluzione che fondamentalmente aveva a che fare con un cast di tipo corretto.

In ThisAddIn.cs:

private Microsoft.Office.Core.IRibbonExtensibility ribbonObj; 
protected override Microsoft.Office.Core.IRibbonExtensibility CreateRibbonExtensibilityObject() 
{ 
ribbonObj = new Ribbon1(this); 
return ribbonObj; 
} 

private void ThisAddIn_Startup(object sender, System.EventArgs e) 
{ 
// Calling the public method TEST() in Ribbon1.cs 
//MyNameSpace is the namespace used in your project ie., your project name 
((MyNameSpace.Ribbon1)ribbonObj).TEST(); 
// Calling the public variable flag in Ribbon1.cs 
((MyNameSpace.Ribbon1)ribbonObj).flag; 
}