Technology Experience

.NET World

Programmazione, libri, snippet di codice, articoli tecnici

.NET World

Se il Binding di WPF non funziona…

Le forze vitali mi stanno abbandonando. Detto più terra terra: ho sonno.

Ma ho trovato questo post che potrebbe darmi qualche spunto per debuggare le applicazioni WPF – semplici o meno semplici – che sto scrivendo. Prendiamo un semplice blocco XAML come questo:

<TextBlock FontSize=”12″ Margin=”4″ Text=”{Binding ElementName=tagsListBox, Path=SelectedItems.Count}” />

Lo XAML inserisce una TextBlock che visualizza il numero di elementi selezionati nella ListBox tagsListBox. La proprietà Path che ho specificato esprime la proprietà di cui voglio mostrare il valore; ricordo nel frattempo che WPF supporta le proprietà come dire…annidate…cioè posso separare con il punto fino a navigare le proprietà, esattemente come faremmo nel codice.

Se il binding non funziona – se per esempio specificate una proprietà che non esiste, oppure che non può essere bindata, non avete alcune eccezione. Semplicemente il binding non funziona, e quindi vedreste la TextBlock sopra completamente vuota.

Questo post spiega e mostra come debuggare il binding di WPF. In particolare, dice che se per qualsivoglia motivo avete da qualche parte un binding che non funziona, Visual Studio ve lo segnala nella Output Window, tra l’altro con un bel messaggio che vi spiega il perchè. Non me ne ero mai accorto, giuro. Non che sia una cosa che faccia tutti i giorni – purtroppo WPF non è certamente il mio lavoro quotidiano, però ci sono stati giorni in cui studiavo a tempo pieno WPF, per cui…

Un altro metodo passa attraverso l’uso dei Converter, ma qui la cosa è più intuitiva. Alla fin fine è una classe, per cui basta mettere un breakpoint per capire come un determinato valore in input viene convertito e mandato in output per far funzionare il binding.

Ci sono altri metodi per debuggare i binding in WPF, descritti molto bene nel post a cui darò sicuramente un’occhiata più approfondita.

Technorati Tags:    

Send to Kindle
.NET World

Da Febbraio rivoluzione negli MSDN Subscriber Download

Come riporta l’home-page di MSDN:

In late February we will launch the biggest update to the MSDN Subscriber Downloads experience. We are making it a lot easier and faster to find your downloads and access your Product Keys, and we’re adding new features to help with exploring available content.

Sarà per questo che in questi giorni ho un po’ di difficoltà a loggarmi alla mia MSDN Subscription. A dir la verità, ho anche diversi problemi semplicemente a navigare, da casa mia, chissà perchè.

Tra l’altro, oggi 1° Febbraio scade l’MSDN Premium che un anno fa UGIdotNET volle regalarmi come premio per aver contribuito attivamente alla community con tutti i miei post che, lo voglio ricordare, hanno permesso a tanti di prendere le certificazioni. Sarà stata pure una banalità rispetto ad altre cose più complesse, ma la soddisfazione è stata davvero tanta.

Grazie ancora di tutto cuore, ragazzi!!!

Technorati Tags:   

Send to Kindle
.NET World

WPF con Expression Blend: ragionamenti e qualche link

E’ da un po’ che avevo installato sul mio Vista l’ultima release di Microsoft Expression Blend 2 – December Preview (EB2), ma non gli avevo mai dato un’occhiata seria. Vorrei provarci, anche se un certo Corrado mi ha detto che a lui non piace molto lo XAML generato da questo tool che però, volente o nolente, serve per essere un po’ più produttivi con Windows Presentation Foundation.

Ho letto l’elenco delle features. Alcune di queste sono quasi ovvie (Synchronized File Changes, Keyboard Shortcuts, Search Text Boxes), mentre altre sono decisamente più interessanti.

Per esempio, con EB2 le soluzioni ed i progetto che create sono a tutti gli effetti soluzioni Visual Studio 2008. Prima di storcere il naso, fermatevi: non è vero che dovete comprare per forza una licenza di Visual Studio 2008: potete usare anche la versione Express, completamente gratuita.

EB2 ha features avanzate che – così sembra – gli permettono di manipolare con più disinvoltura storyboard, animazioni, keyframes, path, oggetti 3D e via dicendo. Magari non è una cosa che utilizzerò tutti i giorni, però è bello saperlo.

Come dicevo all’inizio, mi piacerebbe dedicare un po’ di tempo a questo EB2. Tra l’altro, ho scoperto l’esistenza di Microsoft Expression Blend Bible, disponibile anche fisicamente presso la Hoepli qua a Milano (ad un cambio decisamente sfavorevole!). Ma qualcuno non me l’ha consigliato: effettivamente EB2 è talmente una novità, che scrivere un buon libro è un azzardo e sicuramente impegnativo. Questo Microsoft Expression Blend Unleashed, in uscita il 7 Luglio 2008, mi dicono essere un pochino migliore.

Per ingannare il tempo, sto anche dando un’occhiata a questo sito, che comprende tutorial, blogs e forum su Expression Blend. Aggiornato non molto spesso, vedremo in futuro.

Technorati Tags:     

Send to Kindle
.NET World

Fixed: Visual Studio Recent Items Eraser

Qualche giorno fa Alessandro Melchiori mi ha segnalato un bug nel tool Visual Studio Recent Items Eraser.

Prima dell’uscita di Visual Studio 2008, questo tool cancellava dal registro di Windows l’elenco dei progetti ed i files recenti. Ho dovuto (voluto?) aggiornare il tool quando è uscito VS2008, che chiaramente va a scrivere in punti diversi del registry.

Alessandro mi ha detto che l’ultima release del tool non funzionava bene con VS2008. Effettivamente, ha ragione. La release che era online fino a questa sera cancellava chiavi sbagliate all’interno del registry: non spaventatevi, le chiavi erano inesistenti, quindi dal punto di vista pratico non accadeva proprio nulla.

string[] registry_path_vs2008 = new string[] { @"SoftwareMicrosoftVisualStudio19.0FileMRUList", @"SoftwareMicrosoftVisualStudio19.0ProjectMRUList", };

Se date un’occhiata all’array di stringhe qui sopra, noterete il mio stupido errore di battitura. La versione corretta di Visual Studio è 9.0, e non 19.0. Mannaggia a me! Qualche minuto fa mi sono accorto che avevo già corretto da molto tempo questo bug, ma me lo ero tenuto in locale, senza uploadarlo sul mio sito Sharepoint. Da oggi potete tranquillamente scaricare il tool Visual Studio Recent Items Eraser ed essere sicuri che faccia quello che deve fare.

Grazie Alessandro, senza di te non me ne sarei mai accorto!

Link : VisualStudioRecentItemsEraser.zip

Technorati Tags:    

Send to Kindle
.NET World

Unit Test sulle applicazioni WPF

Le applicazioni WPF sono normalissime applicazioni che, se ben progettate, possono essere unittestate come si fa con tutte le altre applicazioni. E’ sufficiente mantenere una buona separazione tra oggetti business, strato di logica ed interfaccia grafica, e scrivere test adeguati automatizzati per misurare con efficacia la qualità della nostra applicazione. Non che la cosa sia semplice, è ovvio, altrimenti…cosa siamo qui a fare??

Se vi può interessare l’argomento, ecco un bell’articolo dal titolo Using MVC to Unit Test WPF Applications.
Il titolo non lascia spazio a dubbi. 14 pagine stampate. Buona lettura!

Link : http://www.codeproject.com/KB/WPF/MVCtoUnitTestinWPF.aspx

Technorati Tags:     

Send to Kindle
.NET World

La ComboBox è il controllo più intuitivo!

Per introdurvi bene a questo post è necessario una piccola introduzione.

Da Aprile 2007 ad oggi ho lavorato ad un progetto che prevede, fra le altre cose, lo sviluppo di un’applicazione per PPC2003/WM5. Tale applicazione viene attualmente utilizzata da persone assolutamente non esperte nel settore, operai che utilizzano il palmare per raccogliere tutta una serie di informazioni durante il lavoro vero e proprio, e per configurare un dispositivo elettronico che tutti voi avete installato nelle vostre case e nei vostri uffici, e senza il quale non ricevereste la fornitura dell’energia elettrica.

Non scendo in ulteriori dettagli.

Sta di fatto che mi sono ritrovato venerdì mattina (lo scorso venerdì) alle ore 8:00 del mattino in zona Piazzale Lotto, a Milano, per dare supporto a tre squadre di tecnici che quella mattina avrebbero dovuto lavorare con il palmare ed il nostro software. C’ero io, un mio collega ed il nostro capo-progetto.

Gli operai conoscono bene il loro lavoro, cioè hanno a che fare con trapani, cacciaviti, pinze, tester, cercafase, cavi di ogni tipo, tasselli, etc. etc. Quando si tratta di aver a che fare con il palmare, cominciano i guai: ma qui arriviamo noi. L’applicazione in realtà è molto semplice: per ogni ordine da evadere, vengono richieste una decina di domande, una sorta di workflow dove – se tutto va bene – si arriva alla programmazione del contatore elettronico di nuova generazione. Alcune domande sono semplici (un banale SI/NO), altre più complesse ed articolate (scelta da una ComboBox, per esempio).

Non so cosa possano dire gli esperti di usabilità, ma io racconto la mia esperienza.
La ComboBox è di gran lunga il controllo più intuitivo! Vi dico il perchè!

Di fronte a semplici form con due pulsanti Button uno per il SI, l’altro per il NO, l’operaio si perdeva, come “se non vedesse fisicamente” cosa bisognava cliccare per proseguire l’ordine.

Di fronte ad una form con due ComboBox per scegliere due valori diversi, l’operaio ha cliccato senza pensarci due volte la freccina della Combo, aprendola, e ha selezionato correttamente due elementi.

Ci ho ragionato su un pochino. Una cosa su cui riflettevo con mio fratello è che probabilmente le domande SI/NO sono state poste male, e quindi l’operaio fa fatica a capire cosa cliccare per rispondere in modo corretto. Da notare che se si risponde NO, il workflow si interrompe fallendo l’ordine, quindi l’operaio ha un po’ “paura” di cliccare. Viceversa invece, la form con le due ComboBox chiedeva in modo estremamente semplice due valori – uno il materiale di un cavo, l’altro la sezione – molto pertinenti il loro campo di conoscenza; una domanda, quindi, che “capiscono meglio” ed alla quale sanno rispondere meglio.

Sta di fatto, però, che alla fin fine l’operaio che seguivo si trovava molto più fuorviato dai Button che dalle ComboBox: chi l’avrebbe mai detto?

Technorati Tags:     

Send to Kindle
.NET World

[Flickr] Scaricare tutte le foto di un photoset, con un piccolo tip

Ogni tanto nel mio tempo libero la passione per la programmazione su Flickr sboccia. Ho scritto un piccolo metodo che scarica in locale tutte le fotografie appartenenti ad un certo photoset di Flickr. Il codice bene o male è questo:

1 public void DownloadPhotos(string photosetId) 2 { 3 Stream stream; 4 FileStream saveFileStream; 5 Uri uri; 6 string filename; 7 8 Photo[] ps = conn.PhotosetsGetPhotos(photosetId); 9 10 foreach (Photo p in ps) 11 { 12 uri = new Uri(p.ThumbnailUrl); 13 filename = string.Concat(@"D:\Download\", uri.Segments[uri.Segments.Length - 1]); 14 15 stream = conn.DownloadPicture(p.ThumbnailUrl); 16 byte[] download = new byte[stream.Length]; 17 stream.Read(download, 0, (int)stream.Length); 18 stream.Close(); 19 stream.Dispose(); 20 21 saveFileStream = new FileStream(filename, FileMode.Create); 22 saveFileStream.Write(download, 0, download.Length); 23 saveFileStream.Flush(); 24 saveFileStream.Close(); 25 } 26 }

Il codice così com’è è un pochino brutto, perchè non ha gestione di eccezioni, e soprattutto non gira in modo asincrono. Se in input a questo metodo date un photoset che contiene decine e decine di fotografie, la procedura di download può richiedere diverso tempo, e quindi sarebbe carino prevedere un funzionamento asincrono, in modo tale che il chiamante possa sottoscriversi ad un evento per essere notificato di tanto in tanto sul progresso dell’operazione stessa. Ma…come dicevo…ci sto lavorando su a tempo perso, e quindi non c’è alcuna fretta.

Alla riga 8 utilizzo la chiamata al metodo PhotosetsGetPhotos, al quale passo il photosetId. Questo metodo ritorna un array di Photo[], sul quale ciclo per scaricare, una alla volta, tutte le fotografie.

Domanda: come decido che nome dare al file scaricato?

Risposta: beh, utilizzo lo stesso nome che mi viene dato da Flickr!

Alla riga 12 creo un oggetto Uri, dato l’url dell’immagine che sto scaricando. Questo url per esempio assume la seguente forma:

http://static.flickr.com/2094/2121897417_0dab37d8c1_t.jpg

Ho pensato a diversi modi per estrarre da questa stringa solo il nome del file. Se fosse un path locale, potrei utilizzare la classe FileInfo, ma qui non posso, perchè non posso istanziare un FileInfo usando come path quello che in realtà è un Uri. E non mi piaceva pure troppo fare una semplice ricerca sulle stringhe: avrei dovuto invertire la stringa, trovare il primo backslash…lasciamo perdere.

Il modo che reputo migliore per prendersi solo il nome del file è quello appunto di passare attraverso un oggetto Uri, accedendo alla proprietà Segments, che “spezzetta” l’url nelle sue componenti – in pratica facendo uno split sul backslash (‘\’). Alla riga 13 costruisco il path locale dell’immagine prendendo sempre l’ultimo segmento dell’url, che è proprio – guarda caso – il nome del file stesso. Il path locale viene utilizzato più avanti (riga 21) per costruire il FileStream per salvare fisicamente su disco l’array di bytes.

Il ciclo for…each non fa altro che farsi passare una alla volta tutte le fotografie…ed il gioco è fatto.

Technorati Tags:  

Send to Kindle
.NET World

Debuggare i sorgenti del framework da VS2008

Ieri tutti quelli che hanno Visual Studio 2008 installato e funzionante – con la sola eccezione delle versioni Express – sono corsi a configurarlo per poter vedere come funziona il meccanismo che permette di vedere il codice sorgente del .NET Framework. Effettivamente, è la notizia del giorno.

Come era stato annunciato da un po’ di tempo, infatti, con VS2008 è possibile debuggare il framework e vedere il codice sorgente di tutte le classi comprese in determinati assembly e namespace. Vi rimando direttamente a questo post di un certo Shawn Burke che spiega nel dettaglio come e cosa impostare dentro l’IDE di Visual Studio per poter attivare questa fantastica funzionalità.

L’unica cosa che mi ha lasciato perplesso è il repository locale che Visual Studio utilizza per cacheare i sorgenti che decidiamo di scaricare. Io ho impostato semplicemente D:DocumentiSymbols, mentre Visual Studio ha aggiunto altre 17 directory tutte annidate una dentro l’altra e tutte vuote. Il path completo per il file DateTime.cs è nel mio caso il seguente:

D:DocumentiSymbolssrcsource.net8.0DEVDIVdepotDevDiv
eleaseswhidbeyREDBITS
dpclrsrcBCLSystemDateTime.cs1

Un motivo ci sarà anche, ma francamente…lo ignoro!

Technorati Tags:   

Send to Kindle
.NET World

MSDN Magazine…chi l’ha visto?

Le vacanze di Natale hanno fatto male al mio abbonamento di MSDN Magazine. L’abbonamento a questa rivista ha una caratteristica strana: quando arriva, è più che puntuale; quando non arriva, non è che arriva in ritardo: non arriva proprio.

Il numero di Gennaio 2008 me lo sono fumato. Peccato, mannaggia la miseria. Non penso che rinnoverò più l’abbonamento, non tanto per questi ritardi – anche perchè sono ultra-convinto del fatto che loro non c’entrano nulla – quanto perchè la posso leggere tranquillamente anche on-line. Inoltre, come ho avuto modo di dire in passato con tono polemico, alcuni articoli li ignoro tranquillamente perchè non sono nel mio campo visivo ed è inutile star lì a leggersi qualcosa che non si conosce del tutto e che non si userà mai.

Technorati Tags:

Send to Kindle