di .NET e di altre amenità

Appunti di WPF: La strana coppia

Appena qualcuno nomina XAML, la maggior parte delle persone pensa immediatamente a complesse interfacce colme di effetti grafici mozzafiato. Certo, XAML è lo strumento principe per la loro realizzazione, però troppi dimenticano cos'è realmente XAML. Io stesso ho raggiunto una diversa consapevolezza solo chiacchierando con Raffaele Rialdi durante la WPC, e tale consapevolezza mi ha consentito di usarlo da subito anche se in realtà non è di user interface che ho bisogno. Veniamo al dunque: XAML è essenzialmente il miglior modo di serializzare un grafo di oggetti che sia mai stato inventato. Ciò lo rende uno strumento favoloso per rappresentare la gerarchia di oggetti che compone una user interface, ma se guardate la cosa da un diverso punto di vista potete intravedere una serie di possibilità interessanti che si aprono. All'interno degli assembly che costituiscono WPF ci sono un paio di classi statiche che sono in grado di prendere qualsiasi (o quasi) oggetto con tutta la sua gerarchia, serializzarlo in XAML e in seguito recuperarlo trasformando il markup nuovamente nell'oggetto di partenza. La bellezza di XamlWriter e XamlReader è che praticamente sono in grado di fare tutto ciò senza la minima traccia degli attributi di serializzazione cui siamo stati abituati da XmlSerializer.

Ora, prendete XAML, aggiungete un generosa dose di NHibernate, un poco di astuzia e avrete ottenuto un cocktail folgorante. Immaginate di avere degli oggetti mappati con NHibernate su un database, poco importa di che oggetti parliamo e che struttura hanno le tabelle, ma come spesso accade vi trovate ad avere la necessità di gestire delle proprietà dinamiche, un po' come fa Dynamics oppure WCF con IExtensibleObject. Succede talvolta che per gestire le customizzazioni sia necessario consentire alle classi di avere più proprietà di quelle definite nella loro dichiarazione. Si sa, i clienti riescono sempre ad inventare qualcosa che non avevamo previsto. Se avete una necessità di questo tipo e state lavorando con NHibernate, probabilmente avete un grosso problema. Il fatto è che se scrivete un file di mappatura dovete metterci tutte le proprietà e di certo non potete aggiungerne a runtime. Dovrete quindi gestirvi le mappature a mano generando i file XML da dare in pasto all'ORM e anche così i problemi che rimangono sono davvero tanti.

Bene, allora vi propongo una soluzione un po' diversa che ho adottato recentemente. Prendete il vostro database, qualunque esso sia e aggiungete alla opportuna tabella una campo di testo, il più grande possibile, un clob in Oracle, un ntext in SqlServer. Se avete la fortuna di usare SQL Server 2005 mettete direttamente un campo di tipo XML. In questo campo andranno a finire tutte le proprietà aggiuntive, di qualunque tipo esse siano, serializzate come un Dictionary<string, object> in XAML. Ora passate alla vostra classe che rappresenta l'oggetto di business e aggiungete una proprietà Xaml privata e associatela mediante il file di mappatura al campo di database di cui sopra. Una interessante caratteristica di NHibernate è di poter mappare anche i campi e le proprietà private. In questo caso è importante mappare una proprietà privata perchè i dati serializzati in XAML non devono mai essere raggiunti in questa forma ma al momento in cui sono assegnati dal runtime di NHibernate alla proprietà devono essere deserializzati e copiati in un field di tipo Dictionary<string, object> cui ho accennato poco fa. Questa operazione è semplice utilizzando le classi XamlWriter e XamlReader. Ecco come:

private string Xaml
{
    get { return XamlWriter.Save(dictionary); }
    set { dictionary = XamlReader.Load(value) as PropertyDictionary }
}

L'unica accortezza da seguire è quella di creare una classe PropertyDictionary che estenda Dictionary<string, object>. Questo perchè XamlWriter e XamlReader non sono in grado di operare su tipi generici, perciò bisogna ingannarli in questo modo. Ora, esponendo il Dictionary avrete ottenuto la vostra classe estensibile, perfettamente integrata con NHibernate. Mettete nelle proprietà praticamente quello che vi pare, e questo verrà automaticamente serializzato e deserializzato senza colpo ferire e naturalmente NHibernate provvederà a persistere il tutto sul database.

Appunti di WPF: Building a Perfect WPF Developer Workstation

Ottimo post di Tim Sneath che elenca i must-have-tools per il perfetto wpf-developer. Mettetelo nei preferiti perchè è sicuramente di immensa utilità...

Link: Building a Perfect WPF Developer Workstation

WPF/e: Preparare l'ambiente di sviluppo

Finalmente grazie alle feste ho avuto un po' il tempo di provare la CTP di WPF/e che è stata pubblicata da qualche giorno. Dirò più avanti le mie impressioni che al momento non sono del tutto positive, ma per il momento vorrei dare qualche indicazione su ciò che ho scoperto per preparare il proprio PC allo sviluppo con WPF/e grazie a un po' di ricerche in rete.

Il primo problema da risolvere è di procurarsi i package da installare per far girare le applicazioni WPF/e. Ecco un breve riepilogo dei link:

Download per Windows:

Download per Mac:

WPF/e SDK:

Update VS2005 per WAP:

Web Application Project:

I file scaricati debbono essere installati nello stesso ordine in cui sono elencati. Il primo è naturalmente il package principale che installerà sulla vostra macchina il necessario per far girare gli esempi che si trovano in rete. Poi vi renderete conto che vi manca un minimo di documentazione perciò l'SDK diventerà vitale. Nel menù di avvio l'SDK aggiunge alcune voci tra cui una che aggiorna Visual Studio 2005 installando un template di progetto. Questi template però non possono essere installati a meno che non siano state installati i seguenti download. Si tratta dell'aggiornamento di Visual Studio per il Web Application Project e il Web Application Project stesso sul quale è basato il template di WPF/e.

Se a questo punto pensate di essere pronti vi sbagliate. In effetti il namespace di WPF/e http://schemas.microsoft.com/client/2007 non è riconosciuto da Visual Studio perciò vi troverete senza intellisense oppure, nel peggiore dei casi se avete precedentemente installato "Cider" vi troverete l'intellisense completo di WPF che non farà altro che creare confusione. Infatti bisogna ricordare che WPF/e è un subset, anche piuttosto limitato, di WPF perciò almeno il 50% del markup che è utilizzabile nei file XAML di WPF non lo è con WPF/e. Per ricondurre Visual Studio alla ragione conviene innanzitutto assegnare l'estenzione .xaml all'editor xml e poi copiare il file wfpe.xsd dalla cartella dell'SDK a quella degli schemi di VS e cioè:

da: C:\Programmi\Microsoft SDKs\WPFE\Help\XSD
a:  C:\Programmi\Microsoft Visual Studio 8\Xml\Schemas

A questo punto sarete in grado di lavorare abbastanza agevolmente anche se devo avvertirvi che la documentazione dell'SDK è quanto di più fallace potreste incontrare nella vostra vita... buon lavoro.

Appunti di WPF: Libreria 3D su codeplex

La notizia è un po' vecchiotta (almeno secondo i tempi della rete) ma dato che qualcuno mi aveva chiesto informazioni sul mondo 3D in Windows Presentation Foundation oggi che mi è capitato di vedere nuovamente il link ho deciso di postarlo. In effetti durante il webcast avevo dimenticato di segnalare questa libreria che è stata realizzata per consentire l'uso di controlli standard (Textbox, Buttons, Slider, etc...) in una scena tridimensionale. Il problema infatti è che tali controlli non sono usabili in tale contesto perchè il runtime li converte in una bitmap prima di effettuarne il rendering perdendo così le funzionalità. I ragazzi di hanno escogitato una tecnica interessante che consiste nel sovrapporre un controllo reale reso trasparente al controllo reso in 3D facendo coincidere le zone sensibili all'iterazione dell'utente. Dateci un'occhiata perchè è molto istruttiva.

Link: 3D Tools for the Windows Presentation Foundation

"Oggi non hai nessun evento in programma"... :-S

Da qualche giorno Google Calendar ha iniziato a farmi arrivare questa inutile notifica tutte le mattine. Per carità, non che non mi faccia piacere sapere di avere una giornata libera (almeno per Google), ma mi chiedo a chi possa essere venuto in mente che un messaggio del genere riveste una qualche utilità pratica...

Webcast fra pochi minuti

Attenzione, fra qualche minuto inizia il mio webcast su WPF

Link:

Ciao Piergiorgio

Apprendo stamattina della morte di Piergiorgio Welby. Sono fortemente diviso tra la tristezza di sapere che il 2006 si è portato via un altro grande uomo, e la gioia di sapere che finalmente Piergiorgio ha ottenuto la liberazione dalla sua prigionia durata 40 anni. Non posso che ricordare la profondità e l'acume dei suoi scritti, e per questo rattristarmi che Piergiorgio non sarà più tra noi a nutrirci della sua forza e creatività, ma di fronte alla coscienza che il suo desiderio è compiuto rallegrarmi della consapevolezza che ora certamente Piergiorgio sta bene.

Grazie di essere stato tra noi.

Appunti di WPF: WPF e CAB

Durante il webcast di Giovedì, qualcuno mi ha chiesto a proposito della compatibilità tra il Composite Application Block e WPF. Quest'oggi leggo un post a proposito di questo argomento che giro nel mio blog nella speranza che arrivi a chi mi aveva posto la domanda cui al momento non avevo saputo dare risposta.

Link: WPF & Composite Application Block (CAB)

Appunti di WPF: E il prossimo webcast?

Giovedì prossimo mi aspetta un secondo webcast, dal titolo un po' criptico di "Creare interfacce avanzate con XAML", che in verità potrebbe dire tutto come nulla. Ad uso e consumo di chi vorrà seguirmi vi allego qui a fianco una piccola preview di quello che sarà il risultato finale del webcast.

L'applicazione "bruttina" del primo webcast migrerà un passetto alla volta fino a diventare decisamente più accettabile ed usabile grazie alle fantastiche possibilità di Windows Presentation Foundation.

La cosa curiosa, che vi invito a tenere in considerazione è che per arrivare a questo risultato non scriveremo una sola riga di codice C# per dimostrare che organizzando opportunamente il lavoro e sfruttando a fondo le possibilità di WPF, una vera separazione tra grafica e logica oltre che ausipicabile diventa anche possibile. Gli argomenti che toccheremo saranno: Layout, Risorse, Stili, Decorator, Control Templates, Brushes, Bitmap Effects, Transformazioni, Triggers e Animazioni. Si tratterà ovviamente di una overview degli argomenti che spero di poter approfondire in successive puntate.

Vi aspetto tutti quindi il prossimo 21 dicembre, numerosi come lo scorso giovedì.

Appunti di WPF: Qualche risposta alle domande...

Le domande a cui mi riferisco sono quelle che mi sono state poste durante il webcast che ho tenuto il 14 dicembre scorso. Pensando e ripensando a quando detto mi sono rso conto che la fretta di chiudere il webcast per la mancanza di tempo mi ha portato probabilmente ad essere un po' impreciso in alcune risposte. Ho deciso perciò di dare qualche risposta un po' pià dettagliata su queste righe nella speranza che chi le ha poste mi segua e ne possa beneficiare.

Domanda: "L'uso di WPF mi può portare dei vantaggi che mi spingano ad abbandonare WindowsForms in suo favore?"

In realtà ritengo non sia saggio "abbandonare" WindowsForms. Le due piattaforme, WindowsForms e WPF hanno entrambe dei vantaggi e degli svantaggi che devono essere attentamente soppesati prima di decidere in favore dell'una o dell'altra. Di certo molte applicazioni, soprattutto quelle dedicate ad ambiti dove la usabilità e il forte impatto grafico siano molto importanti WPF sarà irrinunciabile e garantirà di sviluppare con velocità ed efficacia. Altri ambiti, più pragmaticamente dovranno essere ancora affrontati con le tradizionali WindowsForms che ancora per molto tempo saranno le sole ad avre la completezza e l'efficacia cui siamo abituati. Il tempo comunque a mio parere dovrà spingere nella direzione di WPF, soprattutto quando il mercato si renderà pienamente conto di ciò che essa può offrire e quindi i clienti cominceranno a pretendere applicazioni scritte con queste feature.

Domanda: "Posso scomporre lo XAML?"

Confesso che di primo acchito francesca mi ha lasciato un po' interdetto, almeno fintanto che non ha chiarito cosa intendeva dire. In effetti si stava riferendo ad un concetto molto importante nella programmazione che noi tutti normalmente abbiamo molto presente. Mi riferisco al riutilizzo del codice, cioè allo "scomporre" le varie parti di un file XAML in differenti porzioni suddivise in differenti file. La mia risposta è stata in questo caso solo parziale. In effetti oltre all'uso delle risorse, è anche possibile creare degli UserControl, che al pari di quelli di ASP.NET consentono di riutilizzare differenti porzioni di codice dando loro la responsabilità di una parte dell'interfaccia riutilizzata in più punti dell'applicazione.

Domanda: "Qual'è il nome esatto dei tool di design per lo XAML?"

Stamane alcuni colleghi mi hanno dato un brivido dicendomi che secondo loro Expression Blend era stato rilasciato circa due settimane fa. Stasera sono andato a vedere se davvero mi era sfuggita una notizia di tale portata e ho avuto la conferma che non mi sbagliavo. Expression Blend, quello che fino a poco tempo fa era denominato Interactive Designer è stato rilasciato in BETA 1. La beta è scaricabile a questo indirizzo. Probabilmente i colleghi si sono confusi con Expression Web che è stato rilasciato il 4 dicembre scorso in RTM mache con XAML ha nulla a che vedere. Mi risulta che Expression Blend sia un tool abbastanza maturo ma probabilmente non ha un grande impatto per il pubblico degli sviluppatori ma soprattutto per quello dei visual design. L'altro tool cui mi riferivo nel webcast è il "Visual Studio 2005 extensions for .NET Framework 3.0 (WCF & WPF), November 2006 CTP", per gli amici "cider". Il nome così lungo è il motivo per cui non lo ricordavo. Cider purtroppo non è uno strumento attualmente utilizzabile perchè soffre di alcuni bug che impediscono di importare propri namespace.

Spero di essere stato esauriente, al limite sapete dove trovarmi.

Il materiale del Webcast

Ovviamente mi sono dimenticato di dare il riferimento al materiale del webcast che ho appena concluso. Eccovi il link:

http://www.xedotnet.org/40/section.aspx/360

Se avete bisogno di chiarimenti, i riferimenti li avete...

Grazie a tutti i presenti.

Appunti di WPF: I template secondo Charles

Charles Petzold, l'autore di "Applications = Code + Markup" ha pubblicato una eccellente articolo a proposito dei ControlTemplates. Si tratta di un articolo che spiega con dovizia di particolari le caratteristiche dei controlli "lookless" di WPF e come personalizzarne l'aspetto fino a stravolgerli completamente. Per inciso questo sarà anche uno degli argomenti che tratterò nel webcast della prossima settimana quando faremo uso dei ControlTemplates per trasformare radicalmente l'aspetto di una ListBox.

Link: Using Templates to Customize WPF Controls