Alessandro Del Sole's Blog

{ A programming space about Microsoft® .NET® }

  Home :: Contact :: Syndication  :: Login
  1125 Posts :: 64 Stories :: 1443 Comments :: 236 Trackbacks

News

Your host

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

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

Microsoft MVP

My MVP Profile

My MVP Corner Page

Il mio libro su LINQ!

Il mio nuovo libro su Microsoft LINQ E' uscito il mio libro "Microsoft LINQ in Visual Basic 2008". Clicca sulla copertina per informazioni!

Visual Basic Tips & Tricks Team Member

Le vostre visite

I'm a VB!

Guarda la mia intervista a Seattle

Windows Live Alerts

Vsi Builder 2008

Il mio tool per VS 2005/2008 Scarica Vsi Builder, il mio tool per Visual Studio 2005/2008!

Aggiungimi al Social MSDN!

Dove vivo

Contattami su Messenger


Grab this badge here!

OmniaDoc by AB Sistemi

CyberInstaller Beta Tester

Scarica il nuovo CIS 2009!!

Altri spazi

CodePlex download Scarica i miei progetti open-source su CodePlex!

Cerca nel blog



Article Categories

Archives

Post Categories

Image Galleries

.NET Framework

Back to basics

Blogroll

Help 1.x e 2.0

Microsoft & MSDN

Setup & Deployment

Visual Basic .NET e 2005

Thursday, February 04, 2010 #

Pietro Brambati, Developer Evangelist di Microsoft Italia, ha riepilogato nel suo ultimo post le interviste da lui registrate per Channel 9 fatte ad alcuni Microsoft MVP.

L'ultima in ordine di tempo è quella al grande Raffaele Rialdi, che mostra un dispositivo da lui creato e in grado di interagire con Windows 7 attraverso la Sensor and Location Platform.

C'è un'altra intervista a un altro grande, Simone Chiaretta, che fa un'overview di ASP.NET MVC e infine la mia, già menzionata un po' di tempo fa, durante la quale abbiamo parlato delle novità di Visual Basic 2010.

Il post originale di Pietro, dal quale potrete accedere ai video, è qui.

Alessandro

posted @ 10:21 PM | Feedback (0)

Monday, February 01, 2010 #

Se ve li siete persi :-), vi segnalo i miei video/webcast realizzati per il portale Be-IT di Microsoft Italia, dedicato ai contenuti multimediali per la formazione sia in ambito MSDN che TechNet. Grazie alla tecnologia Silverlight, potete rivederli attraverso il lettore multimediale qui sotto (se non riuscite a vederlo, premete CTRL+F5):
 
 
 
Ovviamente vi consiglio di visitare Be-IT dove troverete tanti percorsi formativi sulle più importanti e recenti tecnologie Microsoft, anche perchè in futuro ci saranno altri video interessanti :-)
 
Alessandro
posted @ 7:32 PM | Feedback (0)

Tuesday, January 26, 2010 #

Prendo spunto da un thread apparso oggi sul forum MSDN dedicato a Visual Basic, in cui si richiedeva come sia possibile interrogare il registro degli eventi di log di Windows, filtrando il risultato in base all'ID evento specificato.

Innanzitutto si ottiene un riferimento al registro degli eventi di Windows con un'istanza della classe System.Diagnostics.EventLog, al cui costruttore si passa, come argomento, il nome del log da interrogare (come Application, Security, Setup ecc.). Una volta ottenuta l'istanza, si scrive una query LINQ che selezioni solo gli entry (rappresentati da oggetti EventLogEntry) contraddistinti dall'ID desiderato. Il seguente codice esegue tutte queste operazioni:

        Dim eLog As New EventLog("Application")

 

 

        Dim specificEntries = From logEntry In eLog.Entries.Cast(Of EventLogEntry)()

                              Where logEntry.InstanceId = 9010

                              Select logEntry

Notate l'utilizzo dell'operatore Cast(Of T), che spesso è necessario in scenari LINQ to Objects, laddove il compilatore non sia in grado di inferire il tipo corretto. La proprietà EventLogEntry.InstanceId ci consente di confrontare l'ID evento desiderato (sulla mia macchina l'ID 9010 riguarda gli eventi generati da TFS 2010 Beta 2). Possiamo poi elaborare l'insieme così ottenuto (per esempio con un For..Each) per ottenere informazioni sull'evento, ad esempio l'applicazione che l'ha generato (proprietà EventLogEntry.Source) o il messaggio dell'evento (proprietà EventLogEntry.Message).

Alessandro

posted @ 11:38 PM | Feedback (0)

Il mondo della tecnologia corre molto veloce e spesso rimanere aggiornati non è facile. In particolare, conoscere le novità sulle tecnologie Microsoft diventa fondamentale nel momento in cui le utilizzate per il vostro lavoro di sviluppatori. Niente di più semplice, quindi, che iscrivervi alla Newsletter MSDN Flash, una risorsa gratuita che porterà direttamente nella vostra e-mail tutte le ultime novità sui prodotti Microsoft per sviluppatori, inclusi download utili (Beta, Trial, SDK, patch e molto altro), capitoli gratuiti estratti da libri tecnici, video formativi e notizie inerenti eventi tecnici tenuti da Microsoft Italia e dalle Community italiane. Tutto questo in un semplice click:

Alessandro

posted @ 6:25 PM | Feedback (0)

Saturday, January 23, 2010 #

Probabilmente coloro di voi che mi seguono con più assiduità avranno notato un calo dei post su questo blog negli ultimi mesi. In realtà sono stato impegnato su quello che è sicuramente il più grande lavoro informatico che ritengo di aver fatto nella mia vita, ossia la produzione del mio nuovo libro (e primo in lingua inglese) intitolato Visual Basic 2010 Unleashed edito da SAMS.

Anche se non è ancora uscito, è già possibile ordinarlo su Amazon, la importante libreria on-line. Per motivi contrattuali non posso ancora svelare nei dettagli il contenuto del libro, vi anticipo comunque che:

  • è in inglese :-)
  • circa 1000 pagine!
  • il target è lo sviluppatore di esperienza intermedia/avanzata

Il libro tratta approfonditamente il linguaggio Visual Basic 2010 e mostra come utilizzarlo nei confronti delle più recenti tecnologie client e Web di Microsoft. Se volete curiosare, a questo indirizzo ci sono i (pochi) dettagli per ora resi disponibili.

A tra qualche tempo, per l'uscita ufficiale!

Alessandro

posted @ 9:27 PM | Feedback (8)

Thursday, January 21, 2010 #

Vi ricordate di Microsoft Small Basic, il linguaggio per imparare a programmare, comprensivo della nota Turtle? Ne parlammo più di un anno fa in questo post e nel frattempo l'ambiente, sempre basto su WPF e .NET 3.5, si è evoluto fino ad arrivare alla versione 0.7 che ora supporta diverse localizzazioni tra cui quella italiana.

L'installer è unico, poi tra i collegamenti del menu Start di Windows troverete anche quello per avviare la localizzazione italiana. Le varie localizzazioni sono frutto di un lavoro di community, per cui complimenti per l'impegno!

Per cui, come già detto la scorsa volta, se volete introdurre i vostri ragazzi al mondo della programmazione o se siete insegnanti delle scuole elementari, potreste trovare Small Basic ideale. Lo trovate, gratuitamente, qui.

Alessandro

posted @ 5:44 PM | Feedback (4)

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

posted @ 1:56 PM | Feedback (0)

Tuesday, January 19, 2010 #

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

posted @ 5:31 PM | Feedback (0)