In attesa di un progetto da sviluppare, descrivo brevemente alcuni aspetti chiave di WPF.
XAML. Cos'è? E' un linguaggio per descrivere gli oggetti. La programmazione dell'interfaccia è simile a quella di una pagina web. Una finestra Window1 è composta dai file:
- Window1.xaml: descrive gli oggetti con codice xaml
- Window1.xaml.cs: codice della pagina
Tutto quanto è fatto con xaml può essere fatto anche esclusivamente da codice. Non vale il contrario ovviamente.
Un progetto nuovo si presenta così:
<Window x:Class="Progetto.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Progetto" Height="300" Width="300"
>
<Grid>
</Grid>
</Window>
Si tratta di una finestra contenente una griglia vuota: se siete abituati alla programmazione su Asp (A LIVELLO SINTATTICO) fin qui non è molto differente. Il compilatore tradurrebbe la pagina nel seguente codice:
Window Window1 = new Window(); //Costrutture standard
Window1.Width=300; Window1.Height=300;
Window1.Content = new Grid();
Risulta evidente da subito il vantaggio di poter definire l'interfaccia grafica da una parte (XAML) e poter inserire il codice in un altro luogo (CS): in teoria l'applicazione potrebbe essere portata avanti da due persone diverse (grafico, che non sa nulla del codice; sviluppatore, che non sa disegnare...). In pratica, come ho scritto in un post precedente, i miei tentativi di lavorare insieme a un grafico sono stati abbastanza ostici. Il grafico infatti deve inevitabilmente essere al corrente di come funziona il framework, di quali siano a grandi linee le possibilità, etc...quindi è necessaria una fase di "addestramento" preventiva del grafico.
In sostanza vedo il grafico come uno "sviluppatore specializzato", piuttosto che una persona che arriva da un ambito di design.
Proseguendo...ogni oggetto ha delle proprietà. Ad esempio lo sfondo della finestra potrebbe essere un "colore solido", impostabile in questo modo:
<Window x:Class="Progetto.Window1"
xmlns="
http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="
http://schemas.microsoft.com/winfx/2006/xaml"Title="Progetto" Height="300" Width="300"
Background="Blue"
>
E se volessimo assegnare un gradiente, come è possibile scrivere tale informazione sotto forma di codice xaml?
La sintassi è estramemnte flessibile: WPF riconosce la sintassi <Oggetto.Proprietà> ..XXX... </Oggetto.Proprietà> per qualsiasi proprietà. Nella maggior parte dei casi la proprietà prevede un solo oggetto (chiamato child) come valore.
E' tuttavia possibile inserire anche un elenco di valori (chiamati children), nel caso in cui la proprietà implementi una interfaccia ICollection.
Ad esempio per avere uno sfondo gradiente:
<Window x:Class="Progetto.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Progetto" Height="300" Width="300" >
<Window.Background>
<LinearGradientBrush>
<LinearGradientBrush.GradientStops>
<GradientStop Color="Red" Offset="0"></GradientStop>
<GradientStop Color="Blue" Offset="0"></GradientStop>
</LinearGradientBrush.GradientStops>
</LinearGradientBrush>
</Window.Background>
Si noti la forte gerarchia e struttura delle chiavi e dei valori.
Potete pensare di inserire oggetti dentro oggetti dentro oggetti all'infinito. Ad esempio, mi spingo in un volo pindarico:
Immaginate un calendario dentro una palla rimbalzante che nel monitor di un computer che è dentro una stanza 3D che è usata come sfondo del pulsante "Scegli Data". Tutto questo è possibile, e avrà la forma (in pseudocodice):
<Button Text="Scegli data">
<Button.Background>
<Viewport3D>
<GeometryModel3D>
<GeometryModel3D.VisualBackgroud>
<Ball>
<Ball.Trasformazioni>
..........
Dopo aver capito quali sono gli elementi base e i mattoncini che si possono usare vedrete che WPF apre allo sviluppatore le porte dell'immaginazione.
Una peculiarità del codice XAML è quindi la sua solida struttura e gerarchia di oggetti. Ciò da una parte rappresenta un vantaggio perchè evita errori o casi dubbi. Dall'altro appesantisce enormemente la pagina e alla lunga affatica la comprensione e la manutenzione di una pagina. Nel mio caso sono arrivato a 25000 righe di codice xaml per una singola window...(ovviamente quella pagina ora è stata rifattorizzata sfruttando il codice...)
Proprio per questo motivo sono necessari più che mai i commenti
<!-- -->
per separare le diverse parti della pagina. Nel prossimo post elencherò alcuni elementi base di WPF che certamente userete nelle vostre applicazioni.