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…..

 

Xaml: Un primo sguardo

 L’ho già detto ma meglio ripetere: WPF rappresenta una tecnologia che permette di realizzare GUI, cioè le maschere atte a interagire con l’utilizzatore.

 Si può in pratica pensare WPF come un’evoluzione delle Windows Form, che pure sono presenti in .Net.

 Per creare una maschera GUI occorre descrivere quali controlli porre su di essa, e come questi sono collocati: la posizione dei controlli, il loro aspetto, etc etc.

 Per raggiungere questo scopo la tecnologia WPF usa il linguaggio XAML (= Extensible Application Markup Language).

 In altri termini per creare una maschera di tipo WPF sarà necessario scrivere una porzione di codice in XAML, e che in pratica descriverà l’aspetto della form: questo codice sarà poi in grado di interagire con altro codice C#, che sarà delegato a fornire le funzionalità supplettive (disabilitare i campi, salvare dati, fornire logiche di funzionamento ed elaborazione dei dati, etc etc).

Ecco un primo pezzo di codice che permette di creare un form che ospita all’interno un bottone: una specie di hello word in salsa WPF. osservare da subito com XAML sia molto simile a XML, da cui in effetti eredita moltissime parti.

<Window x:Class="WPFXAMLOutlook.MainWindow" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Title="MainWindow" Height="350" Width="604"> 
<StackPanel> 
<Button x:Name="button" Content="Primo giretto in bici !!!" HorizontalAlignment="Left" Margin="150" 
VerticalAlignment="Top" 
Width="75"/> 
</StackPanel> 
</Window>

Nel seguito la descrizione degli elementi principali coinvolti nel codice.

<Window

 E’ la parte iniziale nonché il nodo root di quanto specificato nel seguito.

x:Class="WPFXAMLOutlook.MainWindow"

Ad ogni form creata in WPF corrisponde una classe C# di ausilio, chiamata amichevolmente classe di code behind.

In Windows Forms accade una cosa analoga: per ogni form vengono create due classi C# partial e poste in file distinti: una è delegata a contenere la disposizione dei controlli, e l’altra contiene il codice consumatore degli eventi.

Qui accade la stessa cosa: la classe che descrive come i controlli sono posti sulla maschera è scritta in WPF, la classe code behind in C# come prima. Occorre connettere però i due elementi, e questa definizione serve a questo scopo.

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

Nulla di interessante: questo attributo identifica il namespace di default di Xaml. In pratica significa che tutto quanto scriverò nel seguito è da riferirsi alle istruzioni di base di XAML.

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Per fare riferimento a elementi NON Xaml occorre far precedere l’istruzione da un identificativo del namespace di riferimento. Qui si dice che quando nel listato XAML nel seguito scriverò una cosa del genere x:<elemento>, allora <elemento> non è qualcosa che afferisce direttamente a XAML ma è da ricercarsi nel namespace definito qui.

 Per esempio l’elemento Class (che indica la classe da usare come behind, è da riferirsi al namespace qui definito.

 <StackPanel> </StackPanel>

Lo stack panel è un metodo che permette di disporre degli oggetti in una maschera: già dal prossimo post daremo un significato a questa parte. Per ora basti sapere che nel mondo WPF una maschera può ospitare al massimo un solo controllo: nel caso si voglia dotare la form di più controlli (bottoni, caselle di testo, etc etc) occorrerà come elemento principale un controllo di tipo laylout, che a sua volta è in grado di ospitare un numero arbitrario di altri controlli.

Ora una nota pedante ma interessante: è possibile creare la stessa maschera vista sopra con il solo ausilio del linguaggio C# utilizzando sempre gli stessi elementi, ma senza in alcun modo coinvolgere Xaml.

Detta in modo semplice al posto di avere il listato XAML è possibile descrivere la stessa maschera usando, però, solo del codice C#, ottenendo lo stesso uguale identico risultato.

Risulta abbastanza chiaro, però, che usare il codice C# per creare una maschera risulti molto più oneroso: inoltre il codice XAML è molto più descrittivo nel proporre la struttura della GUI.

Infine occorre anche osservare che usando XAML per la realizzazione delle maschere si ottiene l’ausilio grafico di Visual Studio che permette di interagire in modo visuale con gli elementi posizionati nonché avere il riscontro dell’aspetto finale della maschera.

Altra nota pedante, ma meno interessante: anche se lo scopo principale di XAML è quello di creare maschere WPF, ma occorre osservare che lo stesso linguaggio è utilizzato anche per altre cose, comunque sempre inerenti alla realizzazione di grafica per interazione con l’utilizzatore.

Per cui se fate un nuovo progetto con il template WPF troverete per esempio un file App.Xaml, che è lo startup del progetto ed è delegato a contenere le informazioni della prima maschera da lanciare, il tutto in XAML.