Questo articolo riguarda F# e Silverlight, ovvero "il matrimonio perfetto" (tesi).
Silverlight è sostanzialmente, per quanto mi riguarda, originalità della UI ed effetti d'animazione (non
sono affatto attratto dai controlli à la WebForms, nonostante ne apprezzi l'elevata "skinnabilità").
Originalità della UI ed effetti d'animazione hanno bisogno di una potente programmazione a carattere matematico.
Tale tipo di programmazione si concilia meravigliosamente con la sintassi e le caratteristiche di F#.
CVD ;)
Scherzi a parte, i templates Silverlight di Visual Studio per progetti F# sono finalmente disponibili
(qui) per entrambe le versioni 2 e 3!
È ora agevolmente possibile scrivere librerie F# referenziabili all'interno di una applicazione Silverlight.
Esemplifichiamo. Al solito.
Obiettivo:
Costruire un IValueConverter che traduca una PointCollection nell'aria contenuta dal relativo Polygon.
Abbozziamo l'implementazione step-by-step:
- creare un progetto libreria di classi F# per Silverlight (ad esempio per la versione 3);
- implementare un modulo che esponga i necessari algoritmi (in appropriato e sintetico F#);
- referenziare tale libreria compilata nel progetto applicazione Siverlight (diciamo sviluppato in C#);
- utilizzare i metodi esposti per sviluppare il Converter;
- controllarne il funzionamento implementando una banale interfaccia dimostrativa (vedi figura sotto).

Finestra di Visual Studio coi nuovi templates:

Ora diamo un'occhiata al codice F#.
L'algoritmo è abbstanza semplice: data una lista di punti nello spazio bidimensionale (x, y) ordinata (in senso antiorario in un
sistema di coordinate levogiro), l'area del poligono che ha come vertici tali punti è calcolabile utilizzando la seguente formula
(Nota: Silverlight usa un sistema di coordinate destrorso)

che, tradotta in F#, è qualcosa del tipo
#light
namespace Pacem.Science.Geometry
open System.Windows.Media
module public EuclideanGeometry =
let public Area2D(polygon: PointCollection) =
let n = polygon.Count
let divideBy2 f = f * 0.5
let step i = polygon.[i].X * polygon.[(i+1)%n].Y - polygon.[i].Y * polygon.[(i+1)%n].X
{0..n-1}
|> Seq.fold(fun acc i -> acc + step i ) 0.0
|> divideBy2
Ora compiliamo, referenziamo e implementiamo il nostro IValueConverter:
public class AreaConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is System.Windows.Media.PointCollection)
{
double area = Pacem.Science.Geometry.EuclideanGeometry.Area2D(
(System.Windows.Media.PointCollection)value
);
if (targetType == typeof(double))
return area;
if (targetType == typeof(string))
{
if (parameter is string)
return area.ToString((string)parameter, culture);
else
return area.ToString(culture);
}
}
throw new NotImplementedException();
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Il più è fatto. Quanto al markup, rimando alla consultazione del codice, scaricabile dal link sotto.
Nota bene: demo e codice sono stati implementati con Silverlight 3 Beta1,
Non prevedo
né intendo
modificare questo articolo per aggiornarlo alle future versioni di Silverlight.
«
Silverlight AreaConverter
Take care. Bye.
Feedbacks
-
Visual Studio 2010
Tuomas Hietanen (martedì 4 agosto 2009 18.43)
“Nice... I wish it would also work with Visual Studio 2010. But it doesn't. :-(”
-
Re: Silverlight and F# happily ever after
Art Scott (giovedì 27 agosto 2009 17.35)
“Nice Cristian.
Tuomas: OK I'm interested VS2010 ... any news on this working there?”