Blend 2
06 Maggio 2008
SCE Starter Kit
17 Gennaio 2008
Invidiate il NY Times per il loro lettore offline? Volete creare una rivista elettronica aziendale? Aggiornata in modo automatico? Volete fare in modo che le stampe siano di ottima qualità e in stile giornalistico? Oppure semplicemente volete vedere come costruire una applicazione del genere usando WPF?
Allora il Syndicated Client Experiences Starter Kit è quello che ci vuole.
Come esempio forniscono MSDNReader, un lettore per gli articoli MSDN Magazine.
A volte ritornano (utili)
08 Gennaio 2008
Cosa hanno in comune con me il compasso, la squadra, i corsi di disegno tecnico, le proiezioni, la trigonometria, Geometria 1 e la mia calcolatrice programmabile preferita?
Hanno in comune il fatto che mi stanno tornando utili, nel bene e nel male, per due scopi: aiutare mia figlia in alcune attività scolastiche e disegnare controlli ed elementi WPF. Tralasciando l’attività più importante (cioè aiutare la figlia), devo dire che il conoscere questi strumenti aiuta molto nella creazione di controlli e componenti riutilizzabili in WPF. Ad esempio a tempo perso sto creando un menu che utilizza dei settori circolari traslati e ruotati: usare concetti di base di trigonometria è assai utile. La calcolatrice, che effettua calcolo matriciale e vettoriale anche simbolico, è molto apprezzabile durante la definizione di trasformazioni.
Serve tutto questo per sviluppare applicazioni WPF? La risposta è no! Utilizzare WPF è molto semplice ma aggiungere la matematica e il disegno tecnico aumenta le possibilità per il programmatore e il relativo divertimento.
E, se mi consentite la digressione, mi sta tornado utile anche la storia della letteratura inglese che ho studiato al liceo per apprezzare ancora di più il romanzo che sto leggendo in questi giorni: Il caso Jane Eyre di Jasper Fforde.
LINQ mi piace
31 Dicembre 2007
Devo dire che all’inizio LINQ in C# mi lasciava un po’ perplesso. L’idea di complicare il linguaggio di programmazione aggiungendo costrutti mi rende nervoso. Io la chiamo sindrome da PL/I ma l’ho sperimentata con il C++: il linguaggio diviene così complesso che per realizzare un progetto serve un esperto del linguaggio stesso.
LINQ in realtà si integra bene con C# e diviene presto naturale utilizzarlo. Per provarlo ho aggiunto delle funzioni di ricerca relativamente sofisticate ad un mio programma (in realtà è il mio Pet Project che uso per fare esperimenti) utilizzando il binding SQL.
Ho creato un piccolo parser utilizzando una serie di if con una serie di espressioni regolari. Ho cablato diverse query utilizzando i risultati di questo piccolo parser. In pratica prelevo il contenuto del TextBox di ricerca e quando soddisfa il match con una espressione regolare simile a questa (ho semplificato il codice)
Regex reAnnoMese = new Regex(@"^([0-9]){4}\s+[a-zA-Z]+$");
eseguo la query corrispondente simile a questa
if (reAnnoMese.Match(searchText).Success) { RicevutaDataContext dcRicevuta = new RicevutaDataContext(); int posSpazio = searchText.IndexOf(" "); string anno = searchText.Substring(0, posSpazio); string mese = searchText.Substring(posSpazio + 1); int numeroMese = GetMonthNumber(mese); var queryRicevuta = from ricevuta in dcRicevuta.Ricevutas orderby ricevuta.Anno descending, ricevuta.Numero descending where ricevuta.Anno.Equals(anno) && ricevuta.DataEmissione.Value.Month == numeroMese select ricevuta; DataContext = queryRicevuta; }
RicevutaDataContext è un DataContext creato con un semplice drag&drop della tabella Ricevuta dal mappatore del VS2008. GetMonthNumber è una funzione che restituisce il numero ordinale corrispondente al mese e utilizza al suo interno le funzioni .NET per la localizzazione e che restituiscono i nomi dei mesi. Nell’ultima istruzione effettuo il binding della query con un elemento WPF (una Page contenente una ListView in questo caso).
Se nel TextBox scrivete 2006 giugno (o June: dipende dalle impostazioni) questo codice estrae tutte le ricevute emesse nel giugno 2006. LINQ genere codice SQL del tipo:
SELECT [t0].[IdRicevuta], [t0].[Numero], [t0].[Anno], [t0].[DataEmissione], [t0].[Intestazione], .... FROM [dbo].[Ricevuta] AS [t0] WHERE ([t0].[Anno] = @p0) AND (DATEPART(Month, [t0].[DataEmissione]) = @p1) ORDER BY [t0].[Anno] DESC, [t0].[Numero] DESC
Il fatto che il risultato della query LINQ non sia altro che una collezione .NET (per la precisione un IEnumerable su cui è possibile navigare) ne rende l’utilizzo praticamente trasparente.
Il codice non è particolarmente furbo (e neanche elegante) ma è proprio questa la sua bellezza: l’ho scritto senza pensarci troppo e ho ottenuto un buon risultato. Altri meccanismi mi avrebbero costretto a ragionare troppo (Ehi, sono quasi in vacanza!), ad utilizzare classi più complesse, a passare per sofisticati ORM, a scrivere SQL.
Expression Blend
24 Dicembre 2007
In questi giorni sto cominciando a prendere veramente confidenza con Blend. Blend è lo strumento dedicato ai designer per la creazione di pagine e controlli WPF. L’idea originale di Microsoft era che VisualStudio (VS) fosse lo strumento pricipale del programmatoree e Blend fosse di uso esclusivo del designer. Io (e altri) invece riteniamo che possa anche essere lo lo strumento ponte tra il designer e il programmatore. Tempo fa durante una chat pubblica con le persone di Microsoft dedicate insieme ad altri proposi l’idea che Blend avrebbe dovuto essere inserito in MSDN proprio per il motivo sopra elencato. E in effetti Blend fu inserito in MSDN.
La particolarità di Blend è quella di essere (anche) un programma di grafica e animazioni vettoriali che utilizza XAML e WPF come il suo formato e il suo modello. Questo aspetto si evidenzia sicuramente nell’uso dei Path. In VS l’uso di questi elementi si estrinseca in attività di programmazione. In Blend invece si posizionano elementi grafici e si opera su di questi in modo molto più semplice e più visuale.
Questo strumento l’ho usato sempre molto poco, visto il mio retaggio di programmatore. E finora non avevo trovato il tempo di studiarlo nemmeno un po’. Ma ora lo trovo molto utile proprio anche quando mi diverto a fare il programmatore (molto raramente oramai). Attualmente lo utilizzo soprattutto per creare pezzi di codice XAML da inserire poi nei file sui cui sto lavorando in VS. E’ sicuramente un uso limitato dello strumento ma è efficace per la produzione di risultati immediati e a portata di mano anche di persone come me che, dal punto di vista del grafico, poco ne sanno.
Nei prossimi giorni voglio provare a giocare con le animazioni.
Icone Vettoriali in WPF
21 Dicembre 2007
WPF è un sistema per realizzare interfacce grafiche vettoriali. Basato su un modello dichiarativo prevede una separazione di ruoli tra designer della UI e programmatore così come avviene per i siti web. Purtroppo oggi il mercato nella maggioranza dei casi non è disposto a pagare la presenza di un designer. C’è da dire anche che molti designer si occupano più della presentazione che dell’usabilità di una applicazione e, in tal caso, non avere un designer è una buona cosa.
Comunque per dare un colpo alla botte e uno al cerchio, in casi di mancanza di fondi per il designer, si può ricorrere ad alcuni trucchi per avere una interfaccia utente abbastanza al passo con i tempi. Quelli che ho trovato più utili sono pochi: si cerca di mantenere l’interfaccia semplice, si utilizzano i colori aziendali (senza esagerare), ci si integra con il look&feel del S.O. (ovviamente Vista
), si usano pochissime animazioni e si usano elementi vettoriali al posto di elementi raster. Nell’ultimo caso mi riferisco soprattutto a quelle icone che stanno nei pulsanti o in altri elementi. Si devono però utilizzare icone altrettanto semplici senza troppi fronzoli e colori.
Il punto è: dove trovare icone (e altre immagini) vettoriali?
I Windows Meta File (WMF) sono una risposta. E’ possibile trovare parecchi file esistenti e programmi che generano immagini anche in formato WMF. Ad esempio molte clip arts presenti sul sito di Office sono disponibili in formato WMF. Anche PowerPoint può generare un file WMF. E, soprattutto, molti programmi inseriscono immagini vettoriali nella clipboard in formato WMF.
Una volta in possesso del file si può sfruttare Paste2Xaml, un tool di conversione da WMF a XAML. Con questo tool si può importare il file e generare l’equivalente XAML (di solito una serie di poligoni). Senza spendere denaro utilizzando poi XamlPad si possono effettuare dei semplici ritocchi (XamlPad è fornito con l’SDK di Windows). Infine si può inserire (parte di) questo XAML in un file contenente risorse come una risorsa appunto. La magia consiste nell’utilizzare un VisualBrush:
<VisualBrush x:Key="MyIcon"> <VisualBrush.Visual> <Canvas> <Polygon Points="10 10 10 90 90 90 10 10" Fill="LigthOrange"/> </Canvas> </VisualBrush.Visual> </VisualBrush>
Questo produce un triangolo arancio. Il fatto di definirla come risorsa permette di utilizzarla poi in altri oggetti. Creata la risorsa è possibile inserirla in un elemento grafico utilizzandola come Brush. Ad esempio un pulsante potrebbe essere così definito:
<Button Width="200" Height="50"> <StackPanel Orientation="Horizontal"> <Rectangle Fill="{StaticResource MyIcon}" Width="40" Height="40"/> <TextBlock>Triangle</TextBlock> </StackPanel> </Button>
Quello che compare è questo:
Paste2Xaml è solo uno dei tool disponibili su WPF-Graphics creati da Andrej Benedik. Sullo stesso sito potete trovare anche convertitori da SVG e 3DS. Se avete voglia di sbizzarrirvi potete utilizzare diversi programmi gratuiti per generare contenuti da dare in pasto a questi tool. Ma questo sicuramente non aiuterà a diminuire i costi!
Icone vettoriali
18 Dicembre 2007
XBAP e browser
27 Novembre 2007
Visual Studio 2008 e XAML WPF
24 Novembre 2007
Infine è arrivato. Mi riferisco a Visual Studio 2008. Sicuramente la notizia non è nuovissima ma dopo qualche giorno d’uso della versione definitiva mi sembrava necessario accennarne.
Visual Studio 2008 è la versione dell’ambiente di sviluppo più adatta a Windows Vista. Ovviamente si installa e gira perfettamente sopra il sistema senza necessità di fix. Ma la parte più significativa è l’integrazione dei tool per sfruttare bene il framework .NET 3.5. Ha parecchie funzionalità interessanti (LINQ, il nuovo progetto per i servizi WCF, il supporto AJAX, ecc.).
Ma in questi giorni mi affascina l’editor per lo XAML del WPF: vedere in azione le capacità di aiuto contestuale nella digitazione del codice è impressionante. Soprattutto se si pensa alla complessità di XAML nel contesto di una programmazione WPF.
Veramente un bel lavoro.
Microsoft, Open Source, CodePlex e IronRuby
27 Luglio 2007
Mi hanno preceduto! Visto gli ultimi annunci volevo parlare di Microsoft e dell’open source ma lo hanno già fatto Vincos e Romeo Pruno. Comunque per chi desidera saperne di più c’è anche il sito di Microsoft dedicato all’Open Source.
Comunque, restando sempre in tema, ieri ho citato Microsoft Family.Show, un progetto open source (magari ancora non approvato OSI) di Microsoft disponibile su Codeplex. Microsoft ha sempre messo a disposizione parecchio codice di esempio sull’utilizzo dei suoi prodotti (e in effetti la comunità fa riferimento da molti anni alla grande quantità di risorse a disposizione su MSDN). CodePlex è però un po’ diverso. Si tratta, in pratica, di un SourceForge in salsa Microsoft. Su di esso si trovano parecchi progetti alcuni molto validi non necessariamente di Microsoft ma anche di persone non collegate all’azienda.
E’ anche da poco disponibile una prima implementazione di IronRuby, una implementazione di uno dei linguaggi più trendy del momento su CLR (cioè su .NET). Ovviamente tutto con sorgenti e liberamente modificabile. La cosa interessante è che Microsoft intende rendere disponibile il tutto su RubyForge. Lavorando su .NET, IronRuby è in grado di interagire con il sistema sottostante senza problemi. Quindi si possono utilizzare anche WPF, WCF, WW e tutto l’armamentario .NET 3.0 su Vista (e XP e 2003). Personalmente considero Ruby una sorta di copia brutta di Smalltalk ma condivide con questo una serie interessante di particolarità. Ho quindi provato a scrivere un semplice HelloWorld su WPF in IronRuby:
require 'PresentationFramework, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' require 'PresentationCore, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35' hw = System::Windows::Window.new hw.title = "Hello world" hw.content = "Hello world scritto in IronRuby" app = System::Windows::Application.new app.run hw
Il risultato è minimale ma promettente.
Adesso servirebbe solo un bell’ambiente di sviluppo che sia in grado di utilizzare degnamente il framework .NET.