Technology Experience
.NET World

WPF: gestire un ContextMenu con una TextBox interna

Guardate questo screenshot:

E’ lo screenshot di FlickrBrowser, il software in WPF che mi sto divertendo a creare nel tempo libero. Nella figura qui sopra, c’è l’elenco di 4 set fotografici: Microsoft Security Workshop VII, Giornata Azzurra 2007, AvioExpo 2007 e Nove Colli (Fiat 500) – 2007 – Fabio Edition. Il secondo set fotografico è selezionato: se ci facciamo sopra doppio-click, otteniamo la figura qui sotto:

In pratica, una ListBox orizzontale che visualizza tutte le foto associate al set fotografico che abbiamo selezionato. Ho associato un ContextMenu ad ogni Image, che ovviamente appare cliccando col pulsante destro del mouse. Il ContextMenu è stato inserito fra le risorse della Window; vi riporto lo XAML qui sotto.

<Window.Resources> <ContextMenu Name="mnuPhotoContextMenu" x:Key="menu" Opened="ContextMenuOpened"> <ContextMenu.Background> <LinearGradientBrush StartPoint="0,0" EndPoint="1,1"> <GradientStop Color="Yellow" Offset="0.0" /> <GradientStop Color="White" Offset="1.0" /> </LinearGradientBrush> </ContextMenu.Background> <MenuItem Header="Tags" Click="TagsMenuClick" /> <MenuItem Header="Save As" Name="mnuSaveAs"> <StackPanel Orientation="Horizontal"> <TextBlock Text="Path :" /> <TextBox Width="100" Name="txtPath" Text="E:" HorizontalAlignment="Stretch" /> <Button Name="btnDownloadPhoto" Content="Ok" Click="btnDownloadPhotoClick" /> </StackPanel> </MenuItem> <MenuItem Header="EXIF Information" Click="ExifMenuClick" /> <Separator /> <MenuItem Header="Properties" /> </ContextMenu> </Window.Resources>

Al ContextMenu è stato associato un event-handler sull’evento Opened. Il Background del ContextMenu è un semplice gradiente, visibile nello screenshot. Ci sono diversi MenuItem: uno mostra i tag associati alla foto cliccata, un altro permette il Save As (ne parliamo adesso), un altro ancora mostra le informazioni EXIF della foto. L’ultimo, quello associato a Properties, non fa assolutamente un bel nulla.

Parliamo un po’ del Save As che è il più interessante.
Questo MenuItem contiene uno StackPanel con una TextBox ed un Button a fianco. L’utente può digitare un qualsiasi path nella casella di testo e poi cliccare sul Button per salvare l’immagine sul proprio disco locale. Ogni foto ha il proprio PhotoID, perciò ho voluto intercettare l’apertura del ContextMenu per dare un valore predefinito alla TextBox. Vediamo cosa fa l’event-handler dell’evento Opened del ContextMenu:

void ContextMenuOpened(object sender, RoutedEventArgs e) { if (lstPhotos.SelectedItem != null) { FlickrBrowserPhoto photo = lstPhotos.SelectedItem as FlickrBrowserPhoto; // Ottengo il riferimento alla TextBox che contiene il path ContextMenu menu = this.FindResource("menu") as ContextMenu; StackPanel p = ((MenuItem)menu.Items[1]).Items[0] as StackPanel; directoryTextBox = p.Children[1] as TextBox; directoryTextBox.Text = string.Format(@"E:{0}.jpg", photo.PhotoId); } }

Ottengo un riferimento al ContextMenu, poi “navigo” il visual-tree per raggiungere l’istanza prima dello StackPanel e poi della TextBox. Fatto questo, è sufficiente valorizzare la proprietà Text ed il gioco è fatto. Ovviamente il drive E: andrebbe messo a posto. Il click su Ok scarica la foto sfruttando la connessione attiva di Flickr.

La cosa brutta di questo sistema è che se cambiassi la struttura del ContextMenu, cambierebbe di conseguenza il visual-tree e quiandi bisognerebbe modificare la parte di codice che recuperare l’istanza. Lo StackPanel potrebbe non trovarsi più in menu.Items[1].Items[0]. E la TextBox un giorno potrebbe non essere più il Children[1]  dello StackPanel.

Technorati Tags:  

Send to Kindle
.NET World

Classi statiche & generics: un comportamento da tener presente!

Date un’occhiata alla seguente classica statica:

1 public static class DataProvider<T> where T : new() 2 { 3 private static bool init; 4 5 static void initialize() 6 { 7 init = true; 8 } 9 10 public static void MakeSomeOperation() 11 { 12 if (!init) initialize(); 13 } 14 }

Estratto da un data provider che ho sviluppato tempo fa.
E’ una classe statica DataProvider che fa uso di un generics <T>. Ha una proprietà statica booleana Init, che utilizza un field privato init. L’unico metodo presente è MakeSomeOperation(), statico anch’esso, che prima di fare qualcosa controlla se la classe è già stata inizializzata. Nulla di strano, giusto?

La morale però è questa: la prima volta che utilizzo questa classe chiamando il metodo pubblico MakeSomeOperation(), entro nel piccolo blocco if e quindi viene eseguita la initialize() privata. Poi init viene impostata a true, per cui pensavo stupidamente di non passare più dalla procedura di inizializzazione. Cosa che non è affatto vera. Per esempio, con il codice seguente…

DataProvider<ArrayList>.MakeSomeOperation(); DataProvider<ArrayList>.MakeSomeOperation(); DataProvider<StringBuilder>.MakeSomeOperation();

…utilizzo tre volte la classe DataProvider. Le prime due chiamate usano T come se fosse un ArrayList; la terza ed ultima chiamata usa T come se fosse uno StringBuilder. Ho dovuto usare due classi con il costruttore vuoto, dato il constraint applicato al generics.

Alla prima chiamata (ArrayList) avviene l’inizializzazione.
Alla seconda chiamata (ArrayList) l’inizializzazione non avviene più.
Alla terza chiamata (StringBuilder) l’inizializzazione viene eseguita ancora una volta.

Ogni volta che cambio il Type assunto da T, la classe statica DataProvider viene reistanziata per quel particolare tipo, e quindi viene nuovamente scatenata l’esecuzione di initialize(). Ci sarebbe un modo per evitarlo, cioè spostare la definizione del generics dal nome della classe al nome del metodo. Però, ovviamente, dipende da quello che dobbiamo fare, mica è detto che debba per forza sempre essere così!

Technorati Tags:  

Send to Kindle
My personal life

Milano seconda città turistica d’Italia!

Al primo posto ovviamente c’è Roma. Terzo posto per Venezia. Quarto per Firenze.

Sono particolarmente contento di questa classifica, perchè Milano secondo me merita molto, peccato che sia invivibile per le strade, il traffico ed il caldo afoso di questo periodo. Roma al primo posto non ha bisogno di commenti: sono assolutamente d’accordo sotto ogni punto di vista. Venezia è sempre Venezia. Firenze al quarto, giù dal podio.

Send to Kindle
.NET World

Progetti Flickr su CodePlex

CodePlex.com ha tre progetti taggati con il tag Flickr. Essi sono:

Vista Flickr Uploader

Flickr Metadata Synchr

MeiRou – A Flickr Photo Management Tool

Mi interessano di più il primo e l’ultimo. Il secondo è un po’ troppo macchinoso, perchè sincronizza un folder locale ad un set fotografico di Flickr. Non mi interessa, perchè secondo me fa più casini che altro. Non me ne voglia l’autore. Tutti e tre i progetti sono in WPF, perciò secondo me può essere interessante dargli un’occhiata.

Technorati Tags:   

Send to Kindle
My daily work

Oggi si può davvero essere solo ed esclusivamente programmatori?

Certo che si può, ma nella propria carriera, piccola o grande che sia, si arriva solo fino ad un certo punto. Nel mondo del programmatore odierno bisogna essere ovviamente un po’ programmatori, buoni comunicatori (o verbale o scritta), tenaci lettori, un pochino poliglotti, forse addirittura scrittori (!). Non tutto assieme, ovvio: dipende dalle nostre attitudini personali. Un programmatore con spiccate doti di comunicazione verbale probabilmente diventerà uno speaker, mentre un altro con la propensione per la comunicazione scritta avrà più successo come scrittore di libri o come blogger.

Mi vengono in mente i personaggi multiclasse di Dungeons & Dragons, nel senso che non esiste solo il guerriero, il mago o il ladro, ma anche il guerriero/mago o il ladro/mago. In altre parole, le professioni si combinano fra loro per formare un personaggio più complesso e con più abilità. Probabilmente un guerriero/mago non sarà mai un combattente forte tanto quanto un guerriero puro, però potrà lanciare incantesimi, cosa che l’altro non può fare, e via dicendo.

E quindi? E quindi…voi come vi sentite? Se dovessi definire me stesso, credo che propenderei per un programmatore/scrittore. Il primo al 75%, il secondo al 25%. Buona parte del programmatore lo faccio perchè comunque certe logiche me le sento innate, in combinazione ad una serie di studi (scuola, tanti libri, blog, esperienza, etc.). Lo scrittore invece mi viene più…come dire…istintivo, nel senso che ogni tanto sento il bisogno di scrivere storie, e spero un giorno di farlo davvero perchè mi piace. Ho letto anche qualche libro su come scrivere sceneggiature, romanzi, come creare personaggi e come rendere avvincente un racconto.

E voi?
Voi come suddividereste la vostra fetta di torta?
Vi sentite più programmatori o più comunicatori?

Se siete comunicatori, prediligete la forma verbale o scritta?
Oppure vi sentite altre cose?
O siete solo programmatori al 100% e quindi preferite lavorare al buio, senza nessuno che vi disturbi?

Technorati Tags:  

Send to Kindle
Community

Due mesi (quasi) del mio nuovo blog

Grazie a SC, per avermi supportato ed aiutato non solo tecnicamente, ma anche umanamente.
Grazie a TL, per le belle parole rivolte pochi giorni dopo il mitico post sul newsgroup di UGI.
Grazie a RM, perchè mi parla sempre con estrema schiettezza e se mi deve mandare a quel paese, lo fa.
Grazie a CC: lui magari non si ricorda, ma tutte le volte che ci si becca on-line è molto “collaborativo”.
Grazie a SM, lui si ricorda di me ed io non mi ricordo di lui.
Grazie a LB, nessuna spiegazione.
Grazie a DC, per quella e-mail che sembrava “cattiva” e forse…lo era davvero.
Grazie a MS, perchè tutti i capi dovrebbero essere come te.
Grazie a SMC, perchè perdere tempo per rispondere ad una mia e-mail non è da tutti. 🙂
Grazie a SP, nessuna spiegazione.
Grazie a tutti gli altri!

E’ circa due mesi che ho abbandonato la dolce culla del blog di UGIdotNET. Due mesi in cui molti di voi, lettori di UGIdotNET ma non solo, mi avete seguito. E probabilmente ne ho guadagnato qualcuno ancora. Forse la cosa che manca di più sono i lettori occasionali, quelli che capitavano sul Muro di UGI per sbaglio o casualmente e si ritrovavano a leggere una Legge del Byte. Ma pensandoci bene, non me ne importa molto. Preferisco di gran lunga rivolgermi, parlare e dialogare con persone che conosco – anche solo virtualmente – perchè magari un giorno diventeranno amici reali, concreti e non astratti, come mi è già successo in passato. Una conoscenza esclusivamente on-line arriva fino ad un certo punto, mentre una reale va un po’ più in là.

La serie di “grazie” riportata sopra è un po’ che volevo farla. Non sono nomi sparati a caso, ognuno ha il proprio posticino. Nei giorni successivi al mio abbandono di UGIdotNET, molte persone mi hanno messo “in guardia”, perchè credevano che allontanandomi da UGI avrei fatto un grande errore. Sapete una cosa? Non lo escludo affatto. Chi lo sa come sarebbe andata avanti la mia vita professionale se fossi rimasto dentro UGIdotNET a tutti gli effetti? UGI mi ha dato tanto, l’ho già detto e non sto qui a ripeterlo. Ma preferisco una mia totale indipendenza sotto ogni punto di vista: da quello tecnologico a quello dei contenuti, ad altri aspetti che per adesso non voglio citare. E credo che comunque alla lunga renda e paghi di più. Se non si fosse capito, sono soddisfatto del mio blog, così come lo ero di quello di UGIdotNET.

Mi piace pensare che le persone di UGIdotNET mi ricordino soprattutto per il mio lato umano. Voglio che quando la gente pensi ad Igor Damiani, pensi a quel tipo che scriveva i racconti o le leggi sui bytes, o a quel tipo bizzarro che ce l’aveva a morte con ASP.Net o con le auto aziendali. Poco importa se poi voi tutti mi reputate in gamba se scrivo di WPF o qualche post per ottenere le certificazioni. Sia chiaro, fa sempre piacere, ma le tecnologie passano, mentre le persone restano.

E io voglio restare.
Viva VivendoByte!

Technorati Tags:  

Send to Kindle
.NET World

Perchè dovreste usare il mio plug-in per inserire i tag Technorati?

Ho appena uploadato sul mio sito Sharepoint il nuovo plug-in per Windows Live Writer per taggare i propri post con i tag Technorati. Ce ne sono già in giro, ma il mio è il migliore di tutti (sempre il solito arrogante!).

Ecco i perchè:

  1. potete inserire uno o più tag in una casella di testo, separandoli con un punto e virgola ‘;’ (fin qua nulla di nuovo)
  2. i tag che avete inserito finiscono in una cache, o history che dir si voglia, serializzata in XML qua:
    C:Documents and Settings<username>Dati applicazioniVivendoByte Technorati Tags
  3. potete inserire uno o più tags non solo nella casella di testo, ma prendendoli dalla history proposta attraverso un elenco che appare a sinistra della finestra
  4. in alto a destra c’è il logo VivendoByte che potete cliccare per aprire il mio blog! E questo non è da poco, no???? 🙂

Il punto (3) permette di non star lì tutte le volte a digitare daccapo i tags, con tutti i problemi annessi e connessi. Errori di battitura, per esempio, a causa dei quali potete avere due tag come “wpf” e “WPF“, oppure “Windows Live Writer” e “WindowsLiveWriter“, oppure “ie” e “ie7“: tutte questioni che affollano un po’ troppo la nostra Tag Cloud. Inoltre, potrebbero finirci tag scritti in malomodo e sgrammaticati.

Nello screenshot qui sopra, i tag wpf e software li ho presi dall’elenco a sinistra (infatti appaiono selezionati), mentre gli ultimi due (deploy e programming) li ho digitati a mano. Se clicco Ok e confermo questi tags, questi ultimi due finiranno anche loro nella history e dalla volta successiva mi appariranno nella history per velocizzarne l’inserimento.

In più ho aggiunto due pulsanti per ripulire la history e per aprire il folder nel quale la history è salvata. Semplice ed efficace.

Il plug-in per Windows Live Writer è scaricabile da qua. Lo zip contiene l’assembly VivendoByteTechnorati.dll che va copiato in C:ProgrammiWindows Live WriterPlugins. Se trovate qualsiasi bug, per favore segnalatemelo, perchè questo plug-in mi piace e lo voglio perfetto! E per rispondere a Simone…no, l’autocomplete del tagging plugin nativo di WLW non mi piace! 🙂

Technorati Tags:  

Send to Kindle
My daily work

Con quale probabilità posso…

…dare un logo ed un nome alla mia piccola azienda?

Mi spiego: la partita iva che ho aperto nel 2001 è una partita iva che fa riferimento ad una società di consulenza, il cui unico titolare sono io. L’intestatario è quindi Igor Damiani, che è – come dicevo – il titolare dell’azienda. Il mio commercialista mi dice (a dir la verità l’ha detto tempo fa a mio fratello) che indipendentemente da chi ha aperto la partita iva e da chi è l’effettivo intestatario, io posso inventarmi una sorta di marchio/logo, con un nome diverso da quello della mia persona, col quale farmi identificare, da utilizzare sulla carta intestatavendere i software, farmi le magliette ed altri gadget che mi vengono in mente.

Insomma, so che il posto più adatto per questo tipo di richieste è un forum o un newsgroup, ma confido nella vostra amicizia e nella vostra esperienza per avere qualche parere in merito. Per esempio, il mio sito da un po’ di tempo è diventato http://www.vivendobyte.net, il blog che state leggendo ha come url http://blog.vivendobyte.net, e il sito Sharepoint che utilizzo per lavoro è http://enjoy.vivendobyte.net. Non ci sarebbe nulla di male se, per esempio, mi inventassi un marchio come VivendoByte col quale farmi riconoscere. Che ne dite? Si può fare? Idee? Consigli? Pareri? Qualcuno a cui chiedere?

Send to Kindle
Software

Inserire i tag Technorati con un plugin decente

Sono stanco come un bue, perchè ho lavorato tutta sera al progetto RapportinoMaker che adesso posso considerare davvero finito. Adesso esporto la fattura in PDF e la allego automaticamente in e-mail. Stessa cosa per il rapportino di lavoro. Considerate il fatto che la fattura va ad una persona, con un certo oggetto e testo, mentre il rapportino va ad altre due persone con un testo leggermente diverso. Insomma, sono davvero stanco ma soddisfatto, perchè alla fine del mese gestirò la cosa in modo molto più celere.

Ma non posso andare a dormire senza almeno scrivere due righe ai miei amici di UGIdotNET ed in generale ai miei lettori.

Cerco un plug-in decente che mi permetta di taggare i post con i tag Technorati. Ne ho già uno, ma non mi piace molto, perchè tutto quello che fa è chiedere una serie di parole – divise fra loro con il “;”. C’è una questione – una sciocchezza, a dire il vero, però non mi piace comunque: vorrei vedere l’elenco dei tags che ho già utilizzato in passato. Se tutte le volte devo scrivere a mano i tags, rischio di inserirne troppi. Per esempio: WPF o wpf, .net e dotnet, programming e Programming, Windows Live Writer e WindowsLiveWriter e così via. Si rischia di avere una Tag Cloud troppo affollata. Vorrei che i tag che inserisco finiscano in una sorta di history da dove poi mi vengono riproposte, una specie di ListBox dalla quale selezionare i tag già usati per evitare ridondanze e duplicazioni, sia in termini grammaticali che logici. Se non esiste, ne devo fare uno per la community (non ditelo a nessuno, ma in realtà è già quasi pronto).

Adesso vado a nanna, però, domani si ricomincia daccapo.

Technorati Tags:

Send to Kindle