UI Composition :: Una “region” dentro un Popup
Il motivo è abbastanza semplice, esiste uno ed un solo “Region Service”, per ciclo di vita dell’applicazione, che è il main entry point per accedere al mondo delle region, dato un Region Service e una View è possibile ottenere un Region Manager che è colui che gestisce le region per una data View; come minimo quindi esiste un Region Manager per ogni View che ospita delle region.
La procedura di registrazione delle region è abbastanza semplice e viene fatta dalla MarkupExtension che lo sviluppatore utilizza nello xaml:
Quando, a runtime, viene fatto il parsing dello xaml, del baml in realtà ma è un dettaglio irrilevante, viene istanziata anche la vostra MarckupExtension e viene chiamato il metodo ProvideValue( IServiceProvider ) che ha il compito di ritornare un’istanza di “qualcosa” di sensato per il contesto in cui viene usato, in questo caso quindi come minimo di una IRegion. Quello che succede è che la registrazione di una nuova IRegion è operazione deputata ad un Region Manager che necessita anche di un riferimento alla View che contiene la region.<StackPanel rg:RegionService.Region="{rg:PanelRegion Names=”MyRegion”}}" />
L’inghippo è che se il tutto sta in un Popup il giochetto non funziona perchè il Logical Tree e il Visual Tree all’interno di un controllo Popup hanno un comportamento diverso essendo il Popup a tutti gli effetti una Window diversa.
Andando a spulciare scopro che Prism v2 in realtà questa cosa la fa… buffaldino :-) ma anche sacripante perchè la fa in maniera un po’ poco standard, aggiungendo cioè un attached behavior al controllo che volete “decorare” con il Popup, in questo modo il Popup nello xaml non esiste e tutto il motore di generazione delle region funziona come ci aspettiamo.
Ho quindi iniziato a lavorare per aggiungere questa chicca anche al mio toolkit perchè la necessità è quella di avere una ricerca contestuale, in un Popup simile a quello di un ComboBox, ma con la possibilità di inettare la UI di ricerca a runtime.
A breve qualche screen-shot o il dettaglio del fallimento :-)
.m