Technology Experience
Community

Che fine ha fatto Igor Damiani ?

Uao. Uao perchè nelle ultime ventiquattro ore ho ricevuto 3 e-mail di 3 persone diverse che mi seguivano quando ero su UGIdotNET e che mi avevano perso di vista quando ho smesso di bloggare laggiù. Alla faccia di chi dice che ho bloggato tantissimo dicendo me ne vado per fare un po’ di protagonismo. A quanto sembra, non a tutti è arrivata la voce che Igor Damiani adesso è qua. E non solo mi hanno ritrovato sul mio nuovo blog, ma mi hanno scritto personalmente questo o quello e dandomi un po’ di conforto per le vicende.

A volte quando si dicono cose scomode, folli o assurde, si pensa di essere come la particella di sodio della famosa acqua della pubblicità, ma alla lunga qualcuno c’è sempre. Meglio così. Non mi interessa tanto il ‘tre persone’: ancora una volta, bloggherei anche se mi leggesse solo una persona (ehm, magari no). Fa molto molto piacere sapere che ci sono persone interessate a quello che scrivo, alla ricerca dei tip, a sapere che fine ha fatto la mia 500 e magari anche un po’ ansiose di leggere i miei vecchi racconti sui bytes.

Ragazzi, è un piacere avervi fra i miei lettori.

Technorati Tags:  

Send to Kindle
.NET World

Un equilibro tra risorse locali e risorse globali

La maggior parte delle volte ho visto gli stili dei controlli WPF definiti all’interno della Window nella quale poi lo stile stesso viene utilizzato. Lo stile in questo caso può essere utilizzato solo in quella particolare Window nel quale abbiamo creato lo stile. Se lo stile ci serve in altre Window, siamo obbligati a fare un copia & incolla dello XAML dove ci serve, il che non è proprio il massimo.

In WPF possiamo inserire una risorsa all’interno del file App.xaml, all’interno del tag <Application.Resources></Application.Resources>. In questo modo lo stile è globale per tutta l’applicazione. Se inserissimo una risorsa con x:Key=”myTemplate”, potrei far uso di questa risorsa ovunque ce ne sia bisogno. Esiste una via di mezzo? Ovvero: posso definire una risorsa in modo tale che non sia globale, ma che allo stesso tempo non viva solo all’interno di una Window particolare? Posso essere più selettivo, posso dire in qualche modo…qui mi serve e qui no?

Ovvio che sì. Il trucco sta nell’aggiungere un file di risorse in formato XAML, che non fa altro che definire un ResourceDictionary all’interno del quale possiamo inserire tutte le risorse che vogliamo, stili compresi.

Lo XAML può essere editato a mano in tutti i modi che conosciamo:

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:ctl="clr-namespace:FlickrBrowser.Controls"> <Style TargetType="ListBoxItem"></Style> <Style TargetType="ListBox" x:Key="PhotosetListBoxTemplate"></Style> <Style TargetType="{x:Type ctl:FlickrMenuItem}"></Style> </ResourceDictionary>

In questo caso, il primo stile è associato al tipo ListBoxItem, il secondo è associato al tipo ListBox (ma ha anche una Key) e l’ultimo è associato alla classe FlickrMenuItem. Questa classe eredita da MenuItem: ho seguito i consigli e le correzioni del buon Corrado.

Detto questo, ho avuto un po’ di difficoltà nell’utilizzare questi stili nelle Window della mia applicazione. Innanzitutto, va detta una cosa: la Build Action del file XAML che contiene le risorse (supponiamo…SomeResources.xaml come nell’immagine sopra) va impostato su Resource, che è la cosa più comoda. Vi riporto un blocco tratto direttamente da MSDN che parla proprio di questo argomento:

For resources that are compiled as part of the project, you can use a relative path that refers to the resource location. The relative path is evaluated during compilation. Your resource must be defined as part of the project as a Resource build action. If you include a resource .xaml file in the project as Resource, you do not need to copy the resource file to the output directory, the resource is already included within the compiled application. You can also use Content build action, but you must then copy the files to the output directory and also deploy the resource files in the same path relationship to the executable.

I valori plausibili per la Build Action sono Resource e Content. E non bisogna usare Embedded Resource. Io ho utilizzato Resource.

Nelle Window dove ci interessa utilizzare le risorse occorre importare lo XAML che contiene le risorse che ci servono. Questo si traduce nel prendere una Window qualsiasi all’interno del progetto ed inserire fra le risorse:

<Window x:Class="FlickrBrowser.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="Flickr Browser - Search Photoset" Height="600" Width="700" WindowStartupLocation="CenterScreen"> <Window.Resources> <ResourceDictionary> <ResourceDictionary.MergedDictionaries> <ResourceDictionary Source="SomeResources.xaml" /> </ResourceDictionary.MergedDictionaries> </Windows.Resources> </Window>

In pratica, si fa un merge tra il ResourceDictionary definito nella Window ed il ResourceDictionary definito nel file di risorse specificato nella proprietà Source. A questo punto tutto comincia a funzionare come al solito: se uno stile è associato ad un tipo, allora quello stile verrà utilizzato, come nel caso di ListBox. Se uno stile ha una Key, è sufficiente referenziarla con StaticResource, e così via.

E’ trovato molto utile tutto questo. Ci saranno n motivi per farlo: quello che mi piace di più è il poter effettivamente definire uno stile e il poterlo riutilizzare ovunque vogliamo, pur mantenendo una sorta di selezione accurata, perchè basta importare dentro ogni Window quella che effettivamente ci serve. Un giusto punto di equilibrio tra risorse locali e risorse globali.

Technorati Tags:   

Send to Kindle
.NET World

Dettagli tecnici su un ContextMenu personalizzato

 Da quando Roberto tartassò il mio ContextMenu alla cena degli ultimi Community Days, ho dedicato la mia vita a creare e a sviluppare un ContextMenu degno di tal nome. Non che ci voglia tanto con WPF, sono io che sono imbastito con gli strumenti grafici. E comunque Roberto un pochino aveva ragione: il ContextMenu al quale faceva riferimento era veramente orribile, a partire dall’impaginazione dei vari controlli. Dicevo: ho cercato di impegnarmi. Facciamo un passo alla volta.

Ho una normalissima Window che contiene una Grid con una normalissima TextBox.

<Grid HorizontalAlignment="Stretch" VerticalAlignment="Top"> <TextBox Margin="6" VerticalAlignment="Stretch" Height="22" Name="txtUsername" Text="SERVERUsername" Background="Salmon"> </TextBox> </Grid>

Non ho associato alcun ContextMenu alla TextBox: ciò significa che se lanciassi il progetto e cliccassi con il destro all’interno della TextBox mi apparirebbe il solito menù con le voci Taglia/Copia/Incolla. Adesso inseriamo nelle risorse della Window il ContextMenu con le voci che ci interessa creare.

<Window.Resources> <ContextMenu x:Key="menuDX"> <MenuItem Header="Apri Browser" /> <MenuItem Header="Apri Microsoft Word" /> <MenuItem Header="Apri Microsoft Excel" /> <Separator /> <MenuItem Header="Taglia" /> <MenuItem Header="Copia" /> <MenuItem Header="Incolla" /> </ContextMenu> </Window.Resources>

A questo possiamo impostare la proprietà ContextMenu della TextBox alla risorsa statica con Key = “menuDX“.

<Grid HorizontalAlignment="Stretch" VerticalAlignment="Top"> <TextBox ContextMenu="{StaticResource menuDX}" Margin="6" VerticalAlignment="Stretch" Height="22" Name="txtUsername" Text="MARTEIgor" Background="Salmon"> </TextBox> </Grid>

Fino a questo punto il ContextMenu non ha un effetto grafico particolare, perchè non abbiamo dato stili o template particolare e quindi WPF lo disegna nel modo che conosce. Per fare cose più succulente occorre settare la proprietà Header a qualcosa di diverso dal solito banale e triste testo. Andiamo con calma: potremmo scrivere il ContextMenu di prima in questo modo:

<Window.Resources> <ContextMenu x:Key="menuDX"> <MenuItem> <MenuItem.Header> <StackPanel Orientation="Horizontal"> <Ellipse Margin="4" Fill="Red" Width="10" Height="10" Name="Cerchio" /> <TextBlock Margin="4" Text="Apri Browser" Name="txtTextBlock" /> </StackPanel> </MenuItem.Header> </MenuItem> ... ... </Window.Resources>

Ho riportato solo il primo MenuItem per brevità. Ho settato Header ad uno StackPanel, che contiene un Ellipse ed una TextBlock. La stessa cosa andrebbe fatta anche per gli altri MenuItem, variando opportunamente il colore dell’ellisse (proprietà Fill) ed il testo della TextBlock (proprietà Text). Lungo ed un po’ prolisso. Ho migliorato le cose creando uno UserControl chiamato con molta fantasia CustomMenuItem il cui XAML è:

<StackPanel x:Class="WindowsApplication1.CustomMenuItem" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Orientation="Horizontal"> <Ellipse Margin="4" Fill="Red" Width="10" Height="10" Name="Cerchio" /> <TextBlock Margin="4" Text="Apri Browser" Name="txtTextBlock" /> </StackPanel>

Nel code-behind di questo UserControl ho fatto in modo di estrarre le dependency-property del colore dell’ellisse ed il testo, in modo tale che siano visibili anche all’esterno della classe ed impostabili dallo XAML di chi fa uso dello UserControl stesso.

public string Testo { get { return txtTextBlock.Text; } set { txtTextBlock.Text = value; } } public Brush ColoreCerchio { get { return Cerchio.Fill; } set { Cerchio.Fill = value; } }

Ho messo i nomi delle proprietà in italiano perchè stavo sviluppando e ragionavo in lingua madre. In pratica, ho estratto quello che prima avevo inserito nell’Header del menù per inserirlo in un controllo a sè stante. A questo punto la definizione del ContextMenu può far uso di questo UserControl in questo modo:

<Window.Resources> <ContextMenu x:Key="menuDX"> <MenuItem> <MenuItem.Header> <ctl:CustomMenuItem Testo="Apri blocco note" ColoreCerchio="Red" /> </MenuItem.Header> </MenuItem> <MenuItem> <MenuItem.Header> <ctl:CustomMenuItem Testo="Apri Microsoft Word" ColoreCerchio="Blue" /> </MenuItem.Header> </MenuItem> <MenuItem> <MenuItem.Header> <ctl:CustomMenuItem Testo="Apri Microsoft Excel" ColoreCerchio="Green" /> </MenuItem.Header> </MenuItem> </ContextMenu> </Window.Resources>

In questo modo l’aspetto di ogni MenuItem è inserito all’interno dello UserControl, per cui se volessimo cambiarlo non dovremmo toccare le risorse della Window, ma modificare lo UserControl. Non che fosse una novità, ma l’ho detto lo stesso. Ho provato qualche elaborazione diversa usando template e TemplateBinding ed ho raggiunto praticamente gli stessi risultati, ma con qualche spunto in più su cui vorrei ragionare. Se ce la faccio, con questo caldo…

Ne parlerò fra un po’!

Technorati Tags:  

Send to Kindle
Community

Italia Vs Estero: lavoro, vita, mondo

Mi fanno un po’ sorridere tutti i discorsi che ho letto nei giorni scorsi che parlano del nostro Paese come del marciume che più marciume non si può. Sia chiaro: sono d’accordo con tutti. Ce l’ho a morte con la politica e con i politici, con l’economia che va a rotoli mentre noi ce ne stiamo qui a guardare come se nulla fosse e con tutti gli annessi e connessi, con il mercato dell’informatica che non è competitivo, che i nostri datori di lavoro nella maggior parte dei casi ci sfrutta e basta e così via. Perciò non mi sento di contraddire al 100% tutto quello che è stato detto da Roberto, Luca, Mauro e Simone, perchè fondamentalmente non dicono stupidaggini, anzi.

Dire però che se andassimo a vivere negli USA risolveremmo tutti i nostri problemi è talmente una banalità che non vale neanche la pena di commentare. Ogni Stato ha i suoi pro ed i suoi contro. E’ normale che noi developer vediamo in un eventuale lavoro negli USA la giusta coronazione del nostro lavoro: l’informatica come la conosciamo oggi è praticamente nata laggiù!

Negli USA c’è più violenza e negli USA non c’è il mangiar bene che c’è qui da noi. Negli USA l’informatica andrà alla grande, ma non è così in altri settori dove siamo noi quelli all’avanguardia. Non vorrei mai pagare le tasse in un Paese che poi butta via i soldi in una guerra fallimentare. Non vorrei vivere in un Paese dove il caffè è solo acqua sporca. Non vorrei vivere in un paese che non ha assistenza sanitaria: l’anno scorso sono rimasto in ballo mesi e mesi per un intervento chirurgico di un giorno soltanto: ho fatto esami e decine e decine di visite senza pagare un euro. Negli USA quanto avrei dovuto spendere? Non vorrei vivere in un Paese dove si vendono armi al pubblico. Non vorrei vivere in un Paese pieno di un sacco di cose belle ma devo metterci ore ed ore per raggiungerle. Non vorrei vivere in un Paese che non sottoscrive il trattato di Kyoto.

La vita non è solo lavoro, è anche un giro al lago o in spiaggia, è anche nostalgia dei posti dove eravamo da piccoli, la vita è la propria famiglia, è credere in quello che si fa e lottare per fare in modo che l’Italia sia il paese che contribuiamo a far crescere. La vita è anche il nostro italiano, la lingua più bella (ma difficile) del mondo. Ci sono un mucchio di cose per cui essere orgogliosi di essere italiani, solo che noi ci facciamo troppo l’abitudine e non ce ne accorgiamo più. Peccato.

Penso sostanzialmente che il fatto che negli USA si possa davvero vivere il sogno americano sia solo un luogo comune ed una semplificazione tale della realtà da farmi sorridere sul serio. Sono io il sognatore e siete voi? Oppure lo siamo un po’ tutti, ed è giusto che sia così? Che ognuno sia sognatore per le cose nelle quali crede.

Send to Kindle
My daily work

Vorrei che mi poteste vedere…

Questa mattina sono in versione Elegance: pantaloni eleganti, camicia rubata a mio padre che tanto è in vacanza, giacca con spilla con il delfino che salta sull’acqua. Avrei dovuto presenziare ad un mega-meeting con il mio capo-progetto e con vari “pezzi grossi” (mi han parlato di amministratori delegati e simili) della società nella quale sto lavorando. Ma siccome facevo parte dell’equipaggio secondario, alla fine sono qua tranquillo davanti al mio PC a seguire su un IP interno la videocamera di rete che mi sta trasmettendo in diretta l’evento: peccato che non c’è l’audio, altrimenti mi sembrava di stare lì con loro.

Volete sapere una cosuccia? Sono felice che il mio capo-progetto, che ha 2-3 anni più di me, abbia scelto in mezzo a tante persone che collaborano allo stesso progetto proprio me per dirigere con lui la riunione. Che poi per motivi logistici non ci sia potuto andare è cosa di poco conto. Ho cambiato lavoro, sono qui dai primi di Aprile, e devo dire che mi sono inserito molto molto bene nel team: ci sono i giorni in cui ci si scanna e ci sono i giorno in cui invece tutto procede a gonfie vele. E’ giusto che sia così. E sentirsi dire dal capo-progetto: “Cavolo, Igor, dai, domani andiamo insieme al meeting perchè mi sembri la persona giusta e perchè hai la giusta visione di tutto l’intero progetto…” è davvero una gran cosa e ripaga di tutto il caldo che ho patito questa mattina così conciato.

Adesso aspetto che la riunione finisca e poi mi faccio raccontare come è andata. Spero che sulla faccia degli amministratori delegati compaia un’espressione di soddisfazione per il nostro lavoro, che è la cosa più bella!

Send to Kindle
My personal life

Domani visita a Gardaland!

Devo essere pazzo: domani, dopo un’intera e pesante giornata di lavoro, alle 18:00 parto da Milano per raggiungere gli amici a Gardaland.

Mi aspetta un bel tour-de-force: i miei partono mercoledì mattina alla volta della Puglia. Li rivedrò a fine agosto e dallo stesso giorno diventerò l’amministratore totale ed assoluto di casa mia: nemmeno l’Imperatore di Guerre Stellari ha mai avuto tanto potere. ROFTL! Il tour-de-force prevede che domani sera (notte) tornerò tardissimo come la volta scorsa (tipo, alle 3 a casa a dormire) e mi dovrò svegliare alle 6:30 per andare al lavoro come al solito. Non posso nemmeno arrivare troppo tardi mercoledì mattina, perchè c’è una demo piuttosto importante con il cliente e con vari pezzi grossi. Non sono coinvolto personalmente, però mi dispiacerebbe non esserci (oppure esserci in forma stordita): l’unione fa la forza, anche e soprattutto all’interno di un team di sviluppo.

Insomma, chi vivrà, vedrà!

Technorati Tags:

Send to Kindle
.NET World

Un ContextMenu un po’ più divertente

Ho lavoricchiato stasera ad un ContextMenu un pochino diverso da quello tradizionale, che visualizza un pallino colorato di fianco ad ogni voce e soprattutto contiene una StatusBar che cambia il suo contenuto in base alla voce del ContextMenu su cui ci troviamo con il mouse. Ho uploadato sul mio sito un piccolo zip che per adesso non rendo disponibile, così lo sistemo un po’: se ho tempo (ma non credo) ne parlerò velocemente domani.

Il succo sta nel fatto che la proprietà Header del MenuItem non è detto che debba contenere per forza solo del testo, anzi. Io ci ho infilato uno StackPanel con alcuni child al suo interno: un Ellipse ed una TextBlock per il testo vero e proprio. La cosa divertente è che ho creato uno UserControl per evitare di avere codice troppo prolisso nello XAML della Window. Ripeto: detto così in forma scritta non ha alcun senso, domani bloggo qualcosa perchè secondo me può essere utile.

Technorati Tags:  

Send to Kindle
Software

Una utility per ripulire i recent files e i recent project

Ho scritto in 3 minuti netti un piccolo tool a linea di comando che ripulisce le seguenti chiavi di registro:

HKEY_CURRENT_USERSoftwareMicrosoftVisualStudio8.0ProjectMRUList
HKEY_CURRENT_USERSoftwareMicrosoftVisualStudio8.0FileMRUList

che contengono rispettivamente i files recenti ed i progetti recenti gestiti da Visual Studio 2005. Odio avere quelle chiavi piene, perchè a volte faccio progetti di test dal nome assurdo o non significativo e non mi piace vederli nell’IDE di Visual Studio con il rischio di cliccarli per sbaglio. Il tool va semplicemente lanciato dalla linea di comando e gira per 2-3 secondi: spazza via il registro e vi formatta il disco fisso senza conferma, così siete più comodi. Ovviamente sto scherzando. Cancella la chiavi indicate sopra e vi dà un piccolo rapportino su quanti files e quanti progetti sono stati effettivamente cancellati dal registro. Non l’ho provato sotto Vista, ma credo che abbia bisogno dei diritti amministrativi: lo provo questa sera e vi faccio sapere.

Il download è disponibile qui (2,18Kb – una miseria).

P.S : ogni tanto il mio sito Sharepoint http://enjoy.vivendobyte.net è giù. Non ci posso fare nulla, è una delle pecche dell’hosting di WH4L.

Technorati Tags:  

Send to Kindle
Software

Un volo tra i fiordi norvegesi

Ieri per la prima volta ho fatto un volo serio con Flight Simulator X (FSX), da quando ho montato una GeForce 8600GT e da quando ho un joystick serio col quale volare.

Ora del tramonto, fiordi norvegesi, aeroporto a circa 60 miglia dal Mar di Norvegia. Come velivolo ho scelto il Mooney Bravo, un piccolo aereo ad elica come il classico e più famoso Cessna: l’ideale per voli turistici tranquilli e a corto raggio.

Con FSX impostato su dettagli medio/alto, ragazzi, è un autentico spettacolo. Cielo dipinto con diverse tonalità di azzurro/viola, il riflesso del sole sull’acqua del mare, le montagne verde costellate di boschi, ripide scogliere che si buttano a capofitto in acqua. Il cockpit virtuale è una meraviglia: immaginatevi il classico cruscotto di un’auto, ma completamente 3D, che risponde alle sollecitazioni fisiche che subisce l’aereo (virate, accelerate, vento, etc.) e che può essere esplorato in totale libertà girando lo sguardo. Sublime, non ci sono parole davvero.

Avreste dovuto essere lì con me, per rendervene conto.
Ci voglio tornare. Magari proprio stasera.

Technorati Tags:  

Send to Kindle