Il recente rilascio del service pack 1 di Visual Studio 2008 e del .NET Framework 3.5 introduce parecchie novità per lo sviluppatore WPF, ecco le principali partendo da quelle più evidenti, ovvero quelle inerenti il WPF designer integrato in VS 2008 (a.k.a Cider).

Gestione degli eventi
image

Le novità più evidenti sono visibili nella finestra delle proprietà (fig.1) dove finalmente è stata introdotta la possibilità di gestire gli eventi dei controlli secondo la stessa modalità delle applicazioni Winform (fig.2)

La vecchia modalità che fa uso di "Navigate to event Handler" è comunque ancora attiva.
Oltre alla migliore gestione degli eventi in fig.1 potete notare la presenza dei pulsanti di ordinamento per categoria e alfabetico.
Purtroppo Cider SP1 continua ad utilizzare la brutta abitudine di associare automaticamente un nome al controllo anche quando non siamo interessati ad interagirci e lo fa utilizzando Name anziche x:Name ignorando completamente l' uniformità con il "cugino" Expression Blend. 

 

 

 

 fig.1

image

  

 

  

fig.2


In compenso è stato aggiunto il supporto del designer agli stili:

image fig.2a


Refactoring!
imageFinalmente è possibile rinominare i controlli e i gestori evento mantenendo sincronizzato codice e XAML cosi comè è possibile usare l'opzione "Go to definition" su una variabile legata a un controllo  per navigare direttamente alla parte di XAML che lo descrive.


Attualmente la preview del comando Rename chiede la conferma del field automaticamente generato nel file .g.cs (fig.3) ma presumo che nella versione finale questo verrà automaticamente escluso.

 

 
fig.3


Drag dei controlli nella XAML view
Se usate Silverlight questa feature la conoscete già: si tratta della possibilità di draggare i controlli dalla toolbox direttamente nella XAML View, in Silverlight questa possibilità è comoda perchè vengono automaticamente importati i namespaces necessari mentre in WPF, non solo tutt'ora eventuali UserControls interni o definiti in assembies esterne non vengono aggiunti automaticamente alla toolbox, ma trascinando nello XAML un nuovo usercontrol Cider SP1 non aggiunge in namespaces: Peccato smile_sad

Segnalazione del punto di errore direttamente nello XAML!
Quante volte a causa di un banale errore di battitura vi siete ritrovati con una bella XAMLParseException e il debugger fermo su InitializeComponent? (fig.4)

image fig.4

finalmente le cose sono cambiate e scoprire il problema diventa decisamente più facile. (fig.5) smile_teeth

image fig.5

Snaplines associate ai margini dei controlli

image Personalmente continuo a preferire quelle di Expression Blend e il designer dei Windows Forms... (fig.6)

 

 

 

fig.6

TabControl e Expander
imageCome già accade da sempre in Blend, anche in Cider SP1 il controllo TabControl mostra il contenuto di ogni singola Tab cliccando la relativa Tab a design time, prima del SP1 solo la Tab principale era visibile (fig.7).
In compenso selezionare l'intero controllo non è un operazione così banale... smile_regular

fig.7

 

imageAnche il controllo Expander è diventato più design-time friendly, in Fig.8 ecco come appare un Expander che ha la  proprietà IsExpanded=False, mentre in Fig.9 l'equivalente pre-SP1.

 

 

fig.8 
 image

fig.9

Client-only Framework subset
Questa non è una feature legata esclusivamente a WPF ma vale la pena citarla comunque: nelle proprietà del progetto alla voce Application appare una nuova voce Client-only Framework subset. (fig.10)

image

Tecnicamente la selezione modifica il file .config dell'applicazione aggiungendo un informazione relativa al tipo di pacchettizzazione del framework necessario al funzionamento.

<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v2.0.50727" sku="Client"/></startup></configuration>

fig.10
Il concetto di base è: Visto che il framework 3.5 ha ormai delle dimensioni notevoli smile_teeth perchè installare tutta la parte legata al mondo ASP.NET se la mia applicazione non ne farà uso? ecco quindi la nascita di un pacchetto ridotto che conterrà la sola parte client.
Le novità legate a questa particolare versione sono parecchie:

  • Possibilità di brandizzare l'installazione
  • Banners durante il setup
  • Dimensione circa 27 MB
  • Installazione dell'applicazione al termine dell'installazione del Client Framework

Le novità di WPF 3.5 SP1
Ci sono ulteriori novità anche per quanto riguarda direttamente  la parte WPF, partiamo da VirtualizingStackPanel.VirtualizationMode:
La listbox per ottimizzare le risorse associate utilizza utilizza come ItemsPanel un VirtualizingStackPanel il quale "crea" solo gli items effettivamente visibili, in era pre-sp1 gli items generati e non più visibili vengono disposti e ricreati quando necessario mentre ora, attraverso un attached property VirtualizingStackPanel.VirtualizationMode, è possibile "riciclare" gli items creati in precedenza ottimizzando ulteriormente le risorse utilizzate.
Il tutto si ottiene attivando come nello snippet che segue:

<Grid>
 <ListBox VirtualizingStackPanel.VirtualizationMode="Recycling" 
          ItemsSource="{Binding}" Margin="26,28,54,71" Name="listBox1">            
 </ListBox>
</Grid>

sebbene l'esempio faccia riferimento alla listbox va detto che VirtualizingStackPanel si applica in generale a tutti gli ItemsControls che hanno un VirtualizingStackPanel associato come ad esempio il controllo Treeview.

<Grid>
 <TreeView VirtualizingStackPanel.IsVirtualizing="True" 
           ScrollViewer.IsDeferredScrollingEnabled="True"                  
           Height="96" Margin="26,0,60,23" Name="treeView1" VerticalAlignment="Bottom" />
</Grid>

ScrollViewer.IsDeferredScrollingEnabled
Lo snippet precedente fa uso di un altra novità legata agli ItemsControl: La possibilità mediante ScrollViewer.IsDeferredScrollingEnabled di evitare lo scrolling continuo degli items ma di posizionarsi alla posizione corrente al rilascio degli items, utile quando si ha a che fare con liste che contengono notevoli quantità di elementi.

Nuovo parametro StringFormat applicabile alla markup extension Binding
Permette di evitare la creazione di un custom formatter per formattare l'output di dati provenienti via Databinding
Esempio:

<Grid>        
  <TextBlock Text="{Binding ElementName=slider1, Path=Value, StringFormat='Amount: {0:0.000}'}" 
             Height="21" Margin="44,37,65,0" VerticalAlignment="Top" />
  <Slider Value="58" Margin="53,77,50,0" Name="slider1" Height="24" VerticalAlignment="Top" Maximum="100" />
</Grid>

Risultato
image fig.11

Datagrid?
Non ancora, attendere prego...

Non non ho citato la lunga serie di piccole ottimizzazioni, ma a quanto pare questa release dovrebbe velocizzare in maniera apprezzabile tutte le applicazioni WPF semplicemente installando il service pack sulla macchina.

Questa è solo una overview, avremo modo di approfondire i dettagli in seguito...