Yet Another Useless Geek Place


RibbonX Office 12… come complicare una cosa semplice… atto I

Pubblicato su .net, Microsoft, Office, c#, ribbon, sviluppo di ciko sul 2.Ottobre.2007

da un paio di giorni vago in rete alla ricerca di info su come effettuare il porting di un plugin di Outlook 2003 verso la versione 2007…
Senza scendere nel dettaglio dei vari componenti che ho scaricato, mi scontro ripetutamente con la differente logica di programmazione della barra “Fluent UI” rispetto alle tradizionali barre degli strumenti…

La ribbon a quanto pare non si instanzia direttamente come un comune oggetto (ButtonBar miabarra = new CommandBars.Add(..etc), per intenderci) ma usa un file xml che descrive i pulsanti e la loro disposizione. Mentre questo puo’ essere letto come un fattore positivo, di contro ha che i metodi richiamati dai bottoni (impostati anch’essi nel file xml) sono estremamente scarni (la combobox ha solo il metodo onChange) e vengono in automatico associati a runtime ai metodi della istanza della classe Ribbon!! questo vuol dire che non abbiamo modo di eseguire i metodi degli oggetti direttamente dal plugin, ma dobbiamo mettere il codice all’interno dell’istanza del ribbon, recuperando il contesto dal parametro che ci viene passato.

Consapevole di essere stato poco chiaro:

diciamo che mi creo la mia classe “barra”:

public class MyRibbon : Office.IRibbonExtensibility

e ne implemento i metodi:

public string GetCustomUI(string ribbonID)
{
string ui = "";
ui = GetResourceText("TestRibbon.xml");

return ui;
}

se voglio associare un evento OnClick non posso, come di consueto, creare la funzione delegata in ThisAddin, ma dovro’ creare all’interno della classe MyRibbon un metodo “OnClick”:

public void Button_Click(Office.IRibbonControl control)

Non ne riesco a capire i motivi… questo obbliga a separare il codice della barra da quello del restante plugin, ma sono due cose logicamente connesse… non ha senso se pararle.

L’unico modo che mi salta in mentre per riportare la situazione a quella “pre-ribbon” e’ reimplementare tutti gli eventi e i delegati, ma anche cosi’ non avrei che un metodo per ogni bottone.
Altra cosa allucinante e’ non potersi riferire direttamente all’istanza del pulsante, se voglio, per fare un esempio, disattivarlo dovro’ creare un metodo

public bool Button_getEnabled(Office.IRibbonControl control)

che mi restituisce un booleano con lo stato corrente del pulsante… tremendamente macchinoso secondo me…

In conclusione spero vivamente che questo mio modo di utilizzare la ribbon sia sbagliato e non conforme alla modalita’ “standard” di usare questo strumento, perche’ a dirla tutta ho sprecato un sacco di tempo per scrivere un codice difficilmente manutenibile e a valore aggiunto pressoche’ nullo… (rispetto alle normali barre degli strumenti, si intende…)

Lascia un commento