Il blog di Giuseppe Marchi - SharePoint MVP
NAVIGATION - SEARCH

Silverlight colors - La gestione dei colori in Silverlight 3.0

L'utilizzo dei colori in Silverlight 3.0 solitamente viene effettuato direttamente all'interno del file .xaml soprattutto grazie alla presenza dell'intellisense, che permette la scelta del friendly name proprio di ogni colore disponibile, all'interno delle proprietà di tipo Color degli elementi visivi facenti parte della nostra applicazione.
Ogni colore ha il suo nome e il relativo codice esadecimale, proprio come nell'html. In questa tabella potete trovare l'elenco completo dei colori disponibili:

Silverlight colors

Lato codice però, non abbiamo la stessa facilità di scelta.
Questo perchè la classe Color ha solamente un costruttore di default, senza parametri. Il che significa che volendo utilizzare semplicemente quest'ultima, dobbiamo poi far uso delle proprietà A, R, G e B.

Color c = new Color();

c.A = 255; c.R = 0; c.G = 0; c.B = 0;
SolidColorBrush brush = new SolidColorBrush(c);

Come potete vedere risulta abbastanza scomodo. A fronte di tale mancanza però, hanno inserito la classe Colors, che permette di istanziare un colore a partire da un insieme predefinito di colori di base.

Color c = Colors.Black;

SolidColorBrush brush = new SolidColorBrush(c);

Il fatto è che tale insieme è composto solamente da pochi colori, però per le attività più veloci risulta un'ottima soluzione.
Lo stesso meccanismo vale anche per la classe SystemColors, che contiene un piccolo elenco di colori legati al sistema operativo.

Color c = SystemColors.ControlColor;

SolidColorBrush brush = new SolidColorBrush(c);

Un'altra possibilità che abbiamo, invece, per istanziare un nuovo colore è quella di utilizzare il metodo FromARGB() proprio sempre della classe Color, passando rispettivamente il valore per il canale alpha, il valore per il rosso, per il verde e per il blu.

Color c = Color.FromArgb(255, 255, 255, 255);

SolidColorBrush brush = new SolidColorBrush(c);

Anche questa però risulta parecchio scomoda, in quanto dobbiamo sapere sempre i valori da dare alle proprietà R, G e B per la costruzione del colore di cui necessitiamo.
Per quanto riguarda invece la creazione di una nuova istanza della classe Color a partire da un colore espresso in forma esadecimale, purtroppo Silverlight non ha la classe ColorTranslator del .NET Framework, presente all'interno delle sue librerie, ma nulla ci vieta di creare un piccolo metodo che permetta di convertire i valori esadecimali in byte.

public static Color GetColorFromHexadeciaml(string color)

{
Color.FromArgb(
Convert.ToByte(color.Substring(1, 2), 16),
Convert.ToByte(color.Substring(3, 2), 16),
Convert.ToByte(color.Substring(5, 2), 16),
Convert.ToByte(color.Substring(7, 2), 16)
);
}

Se invece, siamo così pigri da voler creare dei colori lato codice, utilizzando il relativo firendly name, possiamo utilizzare un trucco abbastanza carino, di cui però non garantisco per quanto riguarda le performance in caso di utilizzo intensivo.
Attraverso la classe XamlReader è possibile creare un nuovo oggetto passando in stringa la sintassi che lo rappresenterebbe all'interno di un file .xaml; se quindi, creiamo un elemento di tipo Line e lo coloriamo tramite il colore LightBlue, come se lo stessimo facendo all'interno dell'editor testuale di Visual Studio, siamo poi in grado di recuperare l'istanza della classe Color dalla proprietà Fill, che abbiamo valorizzato all'interno della sintassi XAML.

private Color FromKnownColor(string colorName)

{
Line line = (Line)XamlReader.Load("<Line " +
"xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" " +
"xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" " +
"Fill=\"" + colorName + "\" />");
return (Color)line.Fill.GetValue(SolidColorBrush.ColorProperty);
}

Color c = FromKnownColor("LightBlue");

Sarete d'accordo con me che, rispetto al resto, questa è la soluzione più comoda per l'utilizzo dei colori tramite i relativi friendly name, lato codice.
blog comments powered by Disqus