Dopo aver parlato di come utilizzare WPF 4 per interagire da codice con la Jump List di Windows 7, è la volta di vedere in azione un'altra delle caratteristiche di questo sistema operativo che è possibile programmare con WPF 4 e VB/C# 2010, ossia la sovrapposizione di icone, scenario noto anche come "overlay icons".
Avrete sicuramente notato come la Task Bar di Windows 7 non sia un semplice luogo dove troviamo semplicemente le icone delle applicazioni, ma è anche il posto ideale per notificare all'utente cosa l'applicazione sta facendo. C'è il discorso della barra di progresso (che vedremo in altro post) ma anche la possibilità di sovrapporre, con tanto di trasparenza, un'icona a quella standard dell'applicazione proprio a voler comunicare una notifica o uno stato senza dover modificare l'icona originaria, anzi con la possibilità di togliere l'icona sovrapposta e di sostituirla, eventualmente, con un'altra ancora a seconda di ciò che vogliamo rappresentare. Dopo tante parole, codice e immagini :-)
Si parte sempre con un progetto WPF 4 in Visual Studio 2010 e il presupposto è sempre l'aggiunta del seguente codice XAML, in modo che possiamo interagire da codice con la Task Bar:
<Window.TaskbarItemInfo>
<TaskbarItemInfo/>
</Window.TaskbarItemInfo>
Nelle risorse della Window aggiungiamo le immagini che vogliamo utilizzare come overlay. Si preferiscono, ovviamente, le immagini in formato PNG poichè supportano la trasparenza che, come vedremo al termine, viene automaticamente riconosciuta e applicata da Windows 7. Le immagini da utilizzare sono rappresentate da oggetti DrawingImage, come dimostrato dal seguente codice:
<Window.Resources>
<!-- Definisco una risorsa di tipo DrawingImage
e assegno un identificatore-->
<DrawingImage x:Key="OverlayImage">
<!-- Popolo la sua proprietà Drawing...-->
<DrawingImage.Drawing>
<!--... con un oggetto ImageDrawing
che rappresenta un'immagine/icona-->
<ImageDrawing Rect="0,0,16,16"
ImageSource="/adsWpf4OverlayIcons;component/Images/EditTask.png" />
</DrawingImage.Drawing>
</DrawingImage>
</Window.Resources>
E' importante evidenziare la necessità di valorizzare la proprietà Rect dell'oggetto ImageDrawing con le dimensioni del rettangolo che l'icona sovrapposta andrà ad occupare. Per fini puramente dimostrativi, implementiamo ora una ComboBox dalla quale selezionare la modalità di visualizzazione, con o senza icona sovrapposta:
<Grid>
<ComboBox Width="100" Height="30" Name="Combo1">
<ComboBoxItem Content="Normal" />
<ComboBoxItem Content="With overlay" />
</ComboBox>
</Grid>
Fatto questo si passa al codice managed. Sostanzialmente bisogna assegnare la proprietà TaskBarItemInfo.Overlay con un oggetto di tipo ImageSource, che rappresenta l'icona da sovrapporre oppure con Nothing se vogliamo ripristinare la situazione originaria. All'avvio dell'applicazione ovviamente la proprietà è nulla. Questo il codice dimostrativo:
Private Sub Combo1_SelectionChanged(ByVal sender As System.Object,
ByVal e As System.Windows.Controls.
SelectionChangedEventArgs) Handles Combo1.SelectionChanged
'Esamina il contenuto della ComboBoxItem selezionata
Select Case CType(Combo1.SelectedItem, ComboBoxItem).Content.ToString
Case Is = "Normal"
'Ripristina lo stato iniziale
TaskbarItemInfo.Overlay = Nothing
Case Is = "With overlay"
'Sovrappone l'icona
TaskbarItemInfo.Overlay = CType(Resources("OverlayImage"), ImageSource)
End Select
End Sub
Quello che ci interessa capire è che in qualunque momento, a run-time, possiamo impostare un'icona sovrapposta diversa a seconda di ciò che vogliamo notificare/comunicare all'utente, senza dover sostituire l'icona dell'applicazione. La conversione tramite CType in ImageSource è necessaria perchè la proprietà Resources è di tipo Object. Infine, il risultato in immagini. Dapprima l'icona allo stato normale, come siamo abituati a vedere:

Quindi l'icona con sovrapposizione, dove possiamo apprezzare l'applicazione della trasparenza automatica:

In questo modo potremo comunicare all'utente lo stato dell'applicazione semplicemente facendo l'overlay dell'icona, sfruttando un'altra caratteristica di Windows 7, la cui programmazione è resa molto semplice da WPF 4.
Il codice a corredo del post è disponibile in area Download di Visual Basic Tips & Tricks a questo indirizzo.
Alessandro