Ribbon, PRISM & RegionAdapterBase

Da qualche giorno ho iniziato ad utilizzare PRISM all’interno di un progetto universitario e visto che c’ero venerdi’ scorso ho partecipato al workshop tenuto da DotNetMarche su WPF, MVVM e UI Composition (a dir poco fantastico, soprattutto la cena :D ).

Per la UI ho scelto di utilizzare i WPF Ribbon Controls, visto che sono free, abbastanza documentati e anche se hanno qualche “magagna” in fondo funzionano bene.

Il mio intento e’ di fare in modo che ogni modulo dell’applicazione possa iniettare, oltre che alla view principale, anche un menu’, o meglio un RibbonTab, in quanto il menu’ di base della shell e’ un controllo Ribbon.

ribbon

ribbontab 

Mi sono cimentato in questa “impresa” prima di finir di leggere la Composite Application Guidance for WPF o meglio proprio una manciata di pagine prima della sezione sulle regions…

All’inizio, quindi, ho provato semplicemente ad aggiungere il menu’ alla MenuRegion (visto che ha funzionato con un TabControl per la main view perche’ non dovrebbe funzionare con il Ribbon? :D ) ed infatti non veniva visualizzato nulla.

Cosi’ ho chiesto a Paolo Possanzini alcune delucidazione e molto gentilmente mi ha spiegato a cosa servono i Region Adapters e quando utilizzarli!

Alla fine ho creato un RibbonRegionAdapter per la Ribbon

   1: public class RibbonRegionAdapter : RegionAdapterBase<Ribbon>
   2:     {
   3:         private Ribbon regionTarget;
   4:  
   5:         public RibbonRegionAdapter(IRegionBehaviorFactory factory)
   6:             : base(factory)
   7:         {
   8:         }
   9:  
  10:         protected override void Adapt(IRegion region, Ribbon regionTarget)
  11:         {
  12:             this.regionTarget = regionTarget;
  13:  
  14:             regionTarget.Tabs.Clear();
  15:             region.ActiveViews.CollectionChanged += new NotifyCollectionChangedEventHandler(OnActiveViewsChanged);
  16:         }
  17:  
  18:         protected override IRegion CreateRegion()
  19:         {
  20:             return new AllActiveRegion();
  21:         }
  22:  
  23:         private void OnActiveViewsChanged(object sender, NotifyCollectionChangedEventArgs e)
  24:         {
  25:             switch (e.Action)
  26:             {
  27:                 case NotifyCollectionChangedAction.Add:
  28:                     foreach (RibbonTab v in e.NewItems)
  29:                         regionTarget.Tabs.Add(v);
  30:                     break;
  31:                 case NotifyCollectionChangedAction.Remove:
  32:                     foreach (RibbonTab v in e.NewItems)
  33:                         regionTarget.Tabs.Remove(v);
  34:                     break;
  35:             }
  36:         }
  37:     }

ed ora tutto funziona correttamente (o quasi…ma questo e’ un altro discorso)…

posted @ martedì 2 febbraio 2010 11:42

Print
Comments have been closed on this topic.