Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1909, comments - 2047, trackbacks - 352

My Links

News

Your host

This is me! Questo spazio è dedicato a Microsoft® .NET®, di cui sono molto appassionato :-)

Cookie e Privacy

Disabilita cookie ShinyStat

Microsoft MVP

My MVP Profile

Microsoft Certified Professional

Microsoft Specialist

Xamarin Certified Mobile Developer

Il mio libro su VB 2015!

Pre-ordina il mio libro su VB 2015 Pre-ordina il mio libro "Visual Basic 2015 Unleashed". Clicca sulla copertina per informazioni!

Il mio libro su WPF 4.5.1!

Clicca sulla copertina per informazioni! E' uscito il mio libro "Programmare con WPF 4.5.1". Clicca sulla copertina per informazioni!

These postings are provided 'AS IS' for entertainment purposes only with absolutely no warranty expressed or implied and confer no rights.
If you're not an Italian user, please visit my English blog

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Follow me on Twitter!

Altri spazi

GitHub
I miei progetti open-source su GitHub

Article Categories

Archives

Post Categories

Image Galleries

Privacy Policy

Windows 7 e WPF 4: sovrapposizione di icone nella Task Bar (Overlay)

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

Print | posted on martedì 19 gennaio 2010 20:13 | Filed Under [ Visual Basic Windows Presentation Foundation Windows 7 ]

Powered by:
Powered By Subtext Powered By ASP.NET