di .NET e di altre amenità

WPF Rocks... XeDotNet Rocks!

Giusto un appunto per ringraziare le quasi 70 persone che sono venute Venerdì sera al meeting di XeDotNet. E' pur vero che in questo periodo WPF tira, ma mai mi sarei aspettato di vedere persone arrivare fin da Frosinone e Napoli. Eroi a parte un grazie va a tutte le persone che ci hanno onorato con la loro presenza, che sono rimaste fino all'ultimo minuto sin oltre le 23:00 in trepido ascolto di Davide e Mauro, e che poi in gran numero sono venute al terzo tempo presso il Galloway di Mestre.

E' stata una bella serata, spero che i preannunci di iscrizione numerosi che ci sono per i prossimi meeting si traducano in altrettante serate dense di tecnologia ma anche di condivisione.

Technorati Tags:

Un meeting senza precedenti!

Spendo due parole per ringraziare le persone che nella serata di Venerdì hanno letteralmente preso di assalto il nostro meeting su Windows Presentation Foundation, costringendoci perfino a richiedere sedie aggiuntive all'hotel per ben due volte. Alla fine abbiamo totalizzato per la seconda volta nella storia del nostro ug una drop negativa (cioè abbiamo avuto più partecipanti che iscritti) fermandoci a 66 presenti.

Certo l'argomento del meeting è tra i più sentiti in questo periodo, però mi piace pensare che le persone abbiano compreso l'importanza degli eventi che presentiamo in termini di occasioni di formazione personale e di incontro e condivisione. Ringrazio perciò tutti, e con particolare simpatia gli eroi che sono partiti da Trieste e da Adria, per raggiungere un meeting a 150 KM di distanza per poi rientrare nella notte.

Un ringraziamento particolare va inoltre a Teorema che ha sponsorizzato l'intero semestre coprendo le spese vive dell'hotel fino a giugno.

La nostra attività continua, spinti come siamo da questi successi e dal continuo incremento di soci che finanziano la nostra attività. Nonostante il periodo numerose persone hanno ritenuto importante sottoscrivere la nostra tessera per il 2009 versando la ragguardevole cifra di 50€ regalando a tutti la possibilità di finanziare 3 o 4 meeting.

Vi aspetto tutti al prossimo appuntamento: http://www.xedotnet.org/meet/silverlightnet.aspx

Un concorso d'altri tempi?

MIX09_Color_RGB_tag Pensateci bene e rispondete a questo quesito: "cosa potete fare con 10K di codice in Silverlight o WPF?". Per quando la domanda può sembrare assurda, la risposta a questo quesito può essere davvero interessante e le conseguenze anche allettanti.

Si tratta infatti di un nuovo concorso collegato al MIX 2009, tra i cui premi si trovano anche dei biglietti di ingresso alla prestigiosa manifestazione. Il primo premio addirittura vince 3 notti al prestigioso (quanto assurdo) Venetia di Las Vegas e una carta di credito con 1500$.

Aldilà dei premi, sicuramente interessanti, devo dire che mi piace l'idea che sta dietro al concorso, un'idea con un sapore d'altri tempi, in cui davvero sviluppare con i Byte contati era cosa di tutti i giorni.

Ma attenzione che 10K sono di "codice" e non di "compilato". :) Una sfida davvero estrema.

Link: INSPIRE THE WORLD WITH JUST 10K

Un po' di link alla rinfusa #3

Silverlight

: Una libreria interessante per usare facilmente i downloadable fonts di Silverlight al posto del "banale" testo HTML

ASP.NET

: La risposta ad una domanda ricorrente da parte di Scott Guthrie... "Come posso gestire le configurazioni di sviluppo e produzione nello stesso progetto di Visual Studio 2005?"

ASP.NET Centric Extensions : Una serie di Extension Methods pensati per lavorare meglio con ASP.NET. Da provare!

Windows Presentation Foundation

Free Vector Images for your WPF Projects : Un paio di utili link a risorse vettoriali per chi lavora con Windows Presentation Foundation

Appunti di WPF: Un po' di link alla rinfusa #2

E' un po' di tempo che non pubblico molto su WPF, a causa di un lavoro che sto portando avanti che per ora mi assorbe fino all'ultimo minuto. Per oggi pubblico una serie di link che ho trovato nel web... 

 

: Robert Relyea spiega per quale motivo XAML è case-sensitive

: Un utile elenco delle braking changes tra la versione del Mix e la prossima release.

: E' stato pubblicato in versione stand-alone WPFPerf, il tool per le performance in WPF. Qualcosa anche .

: un nuovo sito sulle tecnologie WPF con anche una bella di applicazioni.

: Un'immagine PNG che riassume le feature di Silverlight.

 

Appunti di WPF: WPF Coding Guidelines

Paul Stovell ha pubblicato sul suo weblog una serie di linee guida per la stesura di codice XAML. Ad una prima analisi ci sono un po' di cose che non mi piacciono, ma comunque si tratta di un buon punto di partenza

Link: XAML and WPF coding guidelines

Appunti di WPF: ComponentOne public Beta

ComponentOne ha da qualche settimana iniziato una fase di beta test su prodotti dedicati a windows Presentation Foundation. La beta è pubblica ed è possibile iscriversi ad essa dal seguente indirizzo:

Link:

ASP.NET 2.0: DataBinding alla WPF

Da programmatore ASP.NET quale sono c'è una cosa che invidio a Windows Presentation Foundation. Non si tratta certo di animazioni, 3D e quant'altro che sono lontane anni luce da quel poco che si può fare con ASP.NET e con le recenti librerie AJAX e quindi non vale nemmeno la pena di invidiarle. Piuttosto se guardiamo al DataBinding, laddove ci sono delle profonde somiglianze, vi è anche una marcata differenza per quanto riguarda l'uso che se ne può fare in WPF quando ad esempio si collegano più controlli tra di loro. La prima volta che ho visto uno dei tanti esempi di DataBinding usato per questo scopo, sono rimasto letteralmente affascinato pensando a quanto codice mi avrebbe risparmiato il poter usare una sintassi simile in ASP.NET. Nulla di trascendentale, magari un checkbox che abilita o disabilita un pannello, un porzione di pagina che cambia colore in accordo con il valore di una DropDowList e così via, tutte cose che grazie al BindingEngine di WPF sono di una banalità impressionante ma che richiedono molto codice ridondante in ASP.NET.

Beh, la bella notizia è che con un po' di astuzia e con una buona conoscenza del funzionamento del modello di compilazione di ASP.NET (detto con tutta la modestia possibile, sia chiaro) la cosa si può fare eccome, e le differenze con WPF sono davvero minime, dettate soprattutto dal flusso di eventi che porta al rendering della pagina più che da altre sottigliezze. Ma prima di entrare nel merito di questa proof-of-concept che ho realizzato nelle serate della recente vacanza in Svizzera e che potete scaricare in coda a questo post, vale la pena di approfondire meglio con un piccolo esempio il funzionamento di WPF.

Binding, ElementName & Path

In WPF per realizzare il DataBinding si fa uso di quella che comunemente viene definita una Markup Extension. Le Merkup Extension che ora non è il caso di approfondire sono delle estensioni che permettono di semplificare la sintassi di XAML per introdurre referenze ed estensioni che arricchiscono il suo significato. "Binding" è la markup extension che si incarica di collegare i dati agli elementi compositivi dell'interfaccia. La cosa curiosa è che mediante Binding è possibile specificare come sorgente dati un elemento dell'interfaccia stessa.

<Border Margin="{Binding ElementName=sldDistance, Path=Value}"></Border>

Con una sintassi come quella specificata nel riquadro è possibile ad esempio specificare uno slider come sorgente dati di un Border. Il risultato sarà che spostando lo slider varia il margine del bordo. ElementName infatti specifica il legame con un ipotetico controllo Slider che porta questo nome mentre path referenzia la sua proprietà Value.

Penso sia evidente a tutti la potenza di una sintassi del genere che nel caso di WPF consente di applicare delle logiche anche molto complesse grazie anche all'uso di Converter che nella fase di binding sono in grado di applicare delle conversioni ai dati che transitano in una direzione e nell'altra. Per un esempio completo di quanto descritto vi invito ad approfondire un tempo fa.

Do it in ASP.NET

E' giunto il momento di mettere assieme i tasselli della soluzione che ho architettato per mimare in ASP.NET questo stesso comportamento. Il primo di essi si chiama ExpressionBuilder. Il più usato e famoso degli ExpressionBuilder è quello che in ASP.NET consente di specificare le risorse localizzate in una pagina. Si tratta semplicemente di un codeblock il cui prefisso è il simbolo del dollaro ($) che si comporta in modo molto particolare. Esso infatti viene valutato al momento della compilazione della pagina e da adito ad una piccola porzione di codice che assegna una attributo di un server control. Questo pezzetto di codice, generato per mezzo di CodeDOM viene inserito nella pagina compilata dal runtime ed è in grado di valorizzare la proprietà dui è associato applicando delle logiche particolari. Per una spiegazine estensiva vi invito a leggere un .

L'idea che mi è venuta è quella di sfruttare un ExpressionBuilder per simulare la markup extension di WPF. Una cosa che occorre tenere presente è che la stringa che funge da parametro di un ExpressionBuilder viene passata per intero al metodo responsabile di generare il codice perciò è molto semplice introdurre una sintassi simile, se non identica a quella delle markup extension.

BackColor="<%$ Binding: ElementName=ddlColor, Path=SelectedValue %>"

L'idea era buona, ma il problema è che il codice generato dalla ExpressionBuilder deve condurre all'assegnazione della proprietà cui è associata. Per questo mi ci è voluto un po' per arrivare ad un metodo alternativo, ma poi, meditando sull'uso degli Anonymous Methods ho trovato la giusta soluzione che ora provo ad illustrare.

Il primo passo è stato creare un metodo statico, nella classe che rappresenta il Builder, il quale si occupi di raccogliere le informazioni dei controlli specificati nel Binding e le utilizzi nel metodo anonimo associato all'evento load della pagina. Ecco il metodo in questione:

public static T MakeBinding<T>( Page page, string boundControlId, string boundPropertyName, string targetControlId, string targetPropertyName, string converter, string converterParameter) { page.Load += delegate(object sender, EventArgs e) { Control bound = page.Form.FindControl(boundControlId); if (bound == null) return; Control target = page.Form.FindControl(targetControlId); if (target == null) return; Type boundType = bound.GetType(); PropertyInfo boundProperty = boundType.GetProperty(boundPropertyName); if (boundProperty == null) return; Type targetType = target.GetType(); PropertyInfo targetProperty = targetType.GetProperty(targetPropertyName); if (targetProperty == null) return; object targetValue = targetProperty.GetValue(target, null); IValueConverter converterInstance = CreateConverter(converter); boundProperty.SetValue(bound, converterInstance.Convert( targetValue, boundProperty.PropertyType, converterParameter, CultureInfo.CurrentUICulture), null); }; return default(T); }

Il metodo è un Generico perchè deve restituire un tipo conforme con la proprietà cui è associato il Binding. Esso poi riceve in ingresso i parametri che vengono estratti dalla stringa dell'ExpressionBuilder. In prima istanza non fa altro che agganciare un anonymous method all'evento load della pagina. Al momento in cui l'evento viene sollevato i parametri vengono usati per  trovare i controlli referenziati nella pagina e copiare i valori opportunamente trasformati dal convertitore prescelto oppure da quello di Default. Il convertitore altro non è che una classe che implementa l'interfaccia IValueConverter, la stessa che fa capo ai convertitori di WPF. Infine il metodo ritorna il valore di default per il tipo generico.

L'expressionBuilder non fa altro che forgiare una chiamata al metodo statico MakeBinding<T>() con gli opportuni parametri:

public override CodeExpression GetCodeExpression( BoundPropertyEntry entry, object parsedData, ExpressionBuilderContext context) { Dictionary<string, string> values = Parse(entry.Expression); return new CodeSnippetExpression( string.Format( @"Elite.Web.UIDataBinding.BindingExpressionBuilder.MakeBinding<{0}>" + @"(this, ""{1}"", ""{2}"", ""{3}"", ""{4}"", ""{5}"", ""{6}"")", entry.PropertyInfo.PropertyType.FullName, entry.ControlID, entry.PropertyInfo.Name, values["ElementName"], values["Path"], values.ContainsKey("Converter") ? values["Converter"] : null, values.ContainsKey("ConverterParameter") ? values["ConverterParameter"] : null)); }

Si potrebbe fare meglio, usando bene le classi e i metodi di CodeDOM, ma per questo esempio è sufficiente. Tutto sommato il mio obbiettivo è di provare che il meccanismo funziona a dovere. Scaricando il codice troverete un piccolo esempio che associa ad AJAX l'utilizzo dell'ExpressionBuilder. La cosa ce vi invito a notare è che per realizzarlo non è stato necessario scrivere alcun codice nel codebehind della pagina perchè tutte i comportamenti sono conferiti mediante l'Expression Builder. Chi intendesse utilizzarlo tenga presenta che si tratta di poco più che un test, e che ha alcune limitazioni rispetto a WPF, dovute più che altro alla mancata implementazione:

  1. La proprietà Path non consente di specificare un vero e proprio Path come in WPF ma solo il Control ID.
  2. I controlli vengono cercati solo al primo livello della gerarchia
  3. Specificare un converter è un po' difficile perchè richiede di immettere il namespace e la classe. Sarebbe meglio trovare un metodo per abbreviare la sintassi che altrimenti rischia di essere un po' troppo logorroico.-
  4. Le proprietà composte di ASP.NET non sono supportate (es. Font-Size)

Tutte queste limitazioni sono facilmente superabili e probabilmente un po' alla volta cercherò di pubblicare nuove versioni se il Binder incontrerà il successo che ha avuto ASP.NET. Per il momento vi invito a provare l'esempio di cui potete vedere uno spezzone in questo riquadro:

<div class="panel"> <asp:Panel id="pnlFont" runat="server" CssClass="scroll-panel" Height="100px"> <asp:Image id="imgSpiderman" runat="server" ImageUrl="images/spiderman.jpg" Width="<%$ Binding: ElementName=ddlSize, Path=SelectedValue, Converter=Elite.Web.UIDataBinding.UnitConverter %>" Height="<%$ Binding: ElementName=ddlSize, Path=SelectedValue, Converter=Elite.Web.UIDataBinding.UnitConverter %>" /> </asp:Panel> <p class="control-row"><label>Size:</label> <asp:DropDownList ID="ddlSize" runat="server" AutoPostBack="true"> <asp:ListItem Text="25%" Value="25" /> <asp:ListItem Text="50%" Value="50" /> <asp:ListItem Text="100%" Value="100" Selected="True" /> <asp:ListItem Text="200%" Value="200" /> <asp:ListItem Text="400%" Value="400" /> </asp:DropDownList></p> </div>

Download: Elite.Web.UIDataBinding.zip (23,4 Kb)

Video: Demo (72 KB)

Appunti di WPF: Expression distribuite con MSDN

Probabilmente la notizia è già girata ieri, ma la ribadisco perché serva da informazione di completamento per chi mi ha seguito al meeting di un mese fa. In buona sostanza è stato annunciato che l'uscita dalla beta degli strumenti della linea "expression" li vedrà disponibili al pubblico all'interno di MSDN Premium.
La notizia non è per nulla scontata dato che precedenti rumors davano questi prodotti per completamente esclusi da MSDN.

Appunti di WPF: Un po di link utili

WPF/E vs DHTML vs Flash vs WPF performance test: Un test che mette a contronto le performance di DHTML, Flash, WPF e WPF/e con un benchmark. Il tentativo è interessante, ma secondo me ci sono alcuni dettagli che non lo rendono del tutto attendibile.  

Xaml Editor List: Una serie di link agli editor free per WPF e WPF/e

WPF/E Pad and Others Updated for the Feb CTP: Alcuni tool per WPF/e

Listening to DependencyProperty changes: Un esempio di uso delle Dependency Property che spiega il meccanismo dell'override.

Fun Controls Bag - 9 new WPF Controls on CodePlex Una collezione di 9 controlli per WPF scaricabili da Codeplex

Appunti di WPF: Expression Blend Release Candidate

Me ne accorgo con un giorno di ritardo, ma sono lieto di apprendere che ieri Expression Blend è passato alla fase di Release Candidate ed è disponibile per il download a questo indirizzo: Microsoft Expression Blend

Appunti di WPF: Un po' di link alla rinfusa...

Il webcast è andato. Non c'era molta gente, una trentina di persone, ma me lo aspettavo dato che si tratta di un argomento un po' di la da venire. Ne aprofitto per postare un po' di link che ho nominato durante il webcast, e durante il meeting di venerdì:

Utile documento per migliorare le prestazioni di WPF: WPF Performance Whitepaper

Un esempio eccellente di applicazione WPF: http://www.otto.de/vista

Il link al sorgente e alle slide del webcast: http://www.xedotnet.org/contents/373.aspx

Grazie a tutti i partecipanti. Segnatevi il prossimo appuntamento, Mercoledì 28 Marzo 2007 - Ore 14:30 - Tecniche di Search Engine Optimization con ASP.NET 2.0