Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }
posts - 1908, 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: icone nella task bar come ProgressBar

Concludiamo oggi la serie di post dedicati alla programmazione della task bar di Windows 7 con WPF 4. In tutta onestà ci sono altre tematiche che andrebbero affrontate, come il multi-touch e il Windows API Code Pack ma vanno oltre il discorso della task bar e in alcuni casi richiedono risorse hardware non a tutti disponibili mentre in altri casi esulano dal focus specifico di WPF 4, per cui ne riparleremo in futuro :-)

Avete mai provato a scaricare un file con Windows 7? Se si, vi sarete sicuramente accorti che l'icona di Internet Explorer nella barra delle applicazioni mostra lo stato di avanzamento del download, proprio come una vera ProgressBar. Con WPF 4 e VB (o C#) 2010 è possibile programmare questa interessante funzionalità affinchè anche le nostre applicazioni siano in grado di mostare lo stato di avanzamento di una determinata operazione utilizzando l'icona dell'applicazione come ProgressBar. L'esempio di codice che vi propongo è abbastanza blando, nel senso che si limita a "perdere un po' di tempo" in modo asincrono in modo da alimentare sia una ProgressBar classica sia quella sull'icona dell'applicazione. D'altronde il focus non è l'esecuzione dell'operazione ma il mostrarne lo stato di avanzamento nella task bar di Windows.

Lato XAML ci vuole innanzitutto il consueto riferimento alla task bar, poi aggiungiamo una ProgressBar classica alla nostra Window:

    <Window.TaskbarItemInfo>

        <TaskbarItemInfo/>

    </Window.TaskbarItemInfo>

    <Grid>

        <ProgressBar Name="ProgressBar1" Height="40" Margin="5"/>

    </Grid>

Successivamente scriviamo un po' di codice VB, che fa utilizzo di un BackgroundWorker per eseguire delle operazioni asincrone, il cui progresso verrà riportato sia nella task bar che nella ProgressBar. Il seguente codice mostra un esempio di come "perdere tempo" e di come, al tempo stesso, riportarne lo stato di avanzamento in task bar:

Class MainWindow

    Private Sub MainWindow_Loaded(ByVal sender As Object,

                                  ByVal e As RoutedEventArgs) Handles Me.Loaded

 

        'Utilizza un BackgroundWorker per simulare operazioni asincrone

        Dim worker As New System.ComponentModel.BackgroundWorker

 

        AddHandler worker.DoWork, AddressOf WasteSomeTime

        AddHandler worker.ProgressChanged, AddressOf worker_ProgressChanged

        AddHandler worker.RunWorkerCompleted, AddressOf worker_RunWorkerCompleted

 

        worker.WorkerReportsProgress = True

 

        'Imposta lo stato di progresso come "normale"

        TaskbarItemInfo.ProgressState = Shell.TaskbarItemProgressState.Normal

 

        'Avvia il lavoro fittizio

        worker.RunWorkerAsync()

    End Sub

 

    'Simula un lavoro, perdendo un po' di tempo

    Private Sub WasteSomeTime(ByVal sender As Object,

    ByVal e As System.ComponentModel.DoWorkEventArgs)

        For i As Integer = 0 To 99 Step 10

            System.Threading.Thread.Sleep(1000)

 

            'Scatena l'evento ProgressChanged passando il valore

            CType(sender, System.ComponentModel.BackgroundWorker).ReportProgress(i)

        Next i

    End Sub

 

    'A fine lavoro, imposta i valori dei controlli di progresso

    Private Sub worker_RunWorkerCompleted(ByVal sender As Object,

                                          ByVal e As System.ComponentModel.RunWorkerCompletedEventArgs)

        ProgressBar1.Value = 100

        TaskbarItemInfo.ProgressValue = 1.0

    End Sub

 

    'Incrementa il progresso del controllo

    Private Sub worker_ProgressChanged(ByVal sender As Object,

                                       ByVal e As System.ComponentModel.ProgressChangedEventArgs)

        ProgressBar1.Value = e.ProgressPercentage

        TaskbarItemInfo.ProgressValue = CDbl(e.ProgressPercentage) / 100

    End Sub

End Class

Di tutto questo codice, quello più interessante è costituito da due righe. La prima:

        'Imposta lo stato di progresso come "normale"

        TaskbarItemInfo.ProgressState = Shell.TaskbarItemProgressState.Normal

Qui in sostanza stabiliamo che l'aspetto della barra di progresso sarà semplicemente normale, quindi in verde. Altre possibilità sono esposte dall'enumerazione Shell.TaskBarItemProgressState che permettono di personalizzare l'aspetto. Ad esempio, Error farà si chè lo stato di avanzamento sia evidenziato in rosso, Paused in giallo, mentre Indeterminate farà sì che l'avanzamento vada automaticamente in loop come a dimostrare che l'operazione è in idle o che l'applicazione è bloccata.

La seconda riga interessante è invece questa:

TaskbarItemInfo.ProgressValue = 1.0

Qui semplicemente assegnamo alla proprietà ProgressValue il valore che rappresenterà lo stato di avanzamento. A livello grafico, questo è il risultato che otteniamo in fase di avanzamento:

Una raccomandazione che ho trovato anche in blog post simili è quella di usare con parsimonia questa funzionalità che, per quanto interessante, richiede comunque risorse. Il codice sorgente a corredo del post è disponibile in area Download di VB T&T a questo indirizzo.

Alessandro

Print | posted on giovedì 21 gennaio 2010 16:43 | Filed Under [ Windows Presentation Foundation Windows 7 Visual Studio 2010 ]

Powered by:
Powered By Subtext Powered By ASP.NET