Prima di proseguire oltre occorre sviscerare lo scopo e gli utilizzi della tipologia dei controlli WPF che permettono di sistemare il layout di una pagina.

Nativamente una pagina realizzata con la tecnologia WPF può contenere un solo elemento grafico: se si vogliono disporre più elementi (e noi lo vogliamo: una maschera con solo un bottone servirebbe a poco, non trovate ??) occorre usare un qualsiasi controllo di tipo layout.

Tramite questo tipo di controllo sarà possibile disporre gli altri controlli sulla maschera.

Esistono in WPF svariati tipi di tipi di controlli layout, ognuno dotato delle sue peculiarità: qui esporrò solo quelli che ritengo i più importanti.

StackPanel

Lo StackPanel è un controllo layout che semplicemente dispone gli elementi da lui contenuti uno dopo l’altro: la cosa interessante è che l’orientamento può essere sia verticale che orizzontale.

Per ragioni professionali recentemente ho fatto docenza per alcuni corsi che avevano come oggetto l'insegnamento di Windows Presentation Foundation (WPF): questa serie di post prende spunto proprio dagli appunti che ho approntato allo scopo.

WPF è la nuova tecnologia che permette di costruire le maschere UI e che può essere considerata come un’evoluzione delle Windows Forms: oramai è da cosiderarsi de facto IL metodo da usare per creare maschere per applicativi moderni.

Oggettivamente ci vuole parecchio coraggio nel definire WPF una “nuova” tecnologia: infatti questa è largamente adottata da anni ed è tanto diffusa che ritengo assurdo e controproducente disegnare maschere per nuovi software scritti in .Net usando tecnologie differenti.

Purtroppo per parlare in modo efficace e sensato di WPF penso che non si possa prescindere dall’utilizzare il pattern Model-View-ViewModel MVVM, che rappresenta il reale completamente della tecnologia.

Inoltre l’adozione del pattern MVVM è efficace solo se utilizzato in tandem con un sistema di Object-relational mapping (ORM), per permetterne l’interazione con la base dati.

Per tale motivo in questa serie troveranno posto diverse parti in cui tenterò di esporVi non solo le idee fondanti del pattern MVVM, ma anche i rudimenti principali di Entity Framework, che è l’ORM proposto da M$.

Se questi termini Vi sembrano astrusi non preoccupatevi: se mi seguirete in questa serie Vi assicuro che farò del mio meglio per schiarirVi un po' le idee.

Se invece siete confidenti con loro…. bè….. allora questa serie non fa per Voi.

Avviso iniziale: il livello degli argomenti è molto basic, ma per ognuno di questi ho cercato di dargli un taglio assolutamente pratico e applicativo. Detto in altri termini l'intento è quello da fornire gli strumenti per costruire da subito alcune semplici maschere usando questa tecnologia, ma per affrontare degli sviluppo serio va da sè che occorre approfondire diverse parti rispetto a quanto presentato.

Altro avviso: il primo impatto con WPF è molto forte….. ma è un come andare in bici la prima volta: sembra impossibile ma dopo un poco ci si accorge che si può fare facilmente.

E quindi….. facciamoci insieme stò giretto in bici… con le rotelle per ora…..

So perfettamente che i contenuti di questo post sono un pò "fuori tempo massimo", ma sono altrettanto consapevole che quanto esporrò servirà a qualcun'altro che, come me, non sempre ha tutte le sue app compilate e testate con le ultime versioni di Android.

Premessa

Una delle app di cui curo lo sviluppo ha un funzionalità grazie alla quale alla pressione di un tasto viene eseguita un'elaborazione che al termine crea una mail bell'è pronta da spedire corredata di un allegato pdf che rappresenta i risultati.

Nulla di particolarmente strano: su come generare questo pdf ho già scritto su questa blog, e per creare la mail nonchè associargli il file ho usato lo straconosciuto e utilizzato Messaging di Xamarin.Plugins.

Tutto ha sempre funzionato in modo egregio e senza grossi problemi.... in modo sano.... per usare un gergo da ciovane......

Ora occorre dire che la app di cui sto parlando permette di inserire degli ordini di merce da parte degli agenti della rete vendita, che quindi vengono elaborati e riversati nel software gestionale del commettente: per tale motivo l'ambito di utilizzo è molto professionale e in tale contesto si è più interessati al fatto che la logica di funzionamento sia corretta e affidabile, un pò meno all'aspetto grafico e alle funzionalità supplettive.

Per questo motivo pur avendo lavorato molto su questo progetto per la  preparazione dei pacchetti di installazione per Android colpevolmente non avevo mai prestato eccessiva attenzione alle versioni da utilizzare dell'sdk per la compilazione e il target, e quindi in generale al valore assunto dai campi minSdkVersion, targetSdkVersion, compileSdkVersion in visual studio. La parte piu importante erano gli esiti degli unit test a corredo !

In questa terzaparte si continua ad esporre l’utilizzo del Lazy in ambiti multithread.

Quanto visto nella parte precedente cioè l'utilizzo della classe Lazy senza usare costrutti particolariespone come anche a fronte di più thread tutto funziona correttamente e senza intoppi.

Possono però esistere casi reali in cui si rende necessario avere maggiore possibilità di configurarne il comportamento.

Per esempio l’inizializzatore della classe T, o anche il codice a contorno, può avere al suo interno dei lock o altro, che possono non andare d’accordo con i lock presenti all’interno della classe Lazy, e questa coesistenza può provocare deadlock.

In altre parole come detto l’oggetto Lazy è thread-safe, e quindi per esempio affinché il codice dell’inizializzatore della classe T sia tale vengono usati giocoforza all’interno del framework qualche sorta di lock: questo non solo introduce penalità di perfomance ma può portare (anche se in rari casi) a deadlock che possono occorrere sopratutto a fronte della presenza di altri lock posti nel codice utilizzatore scritto da noi.

Un altro caso può essere legato al fatto che pur essendo in ambiente multithread non siamo interessati al fatto che la classe Lazy sia thread-safe poiché si desidera gestire questo aspetto nel codice consumatore.

In altri termini si desidera delegare la gestione dell’accesso concorrente all’inizializzatore nonché alle proprietà Value e IsValueCreated a codice scritto esternamente da noi, questo con l’ovvio intento di spremere al massimo le perfomance.