Converte la stringa di spazzole / spazzola nome del colore in C #
Domanda
Ho un file di configurazione in cui uno sviluppatore può specificare il colore del testo, passando in una stringa:
<text value="Hello, World" color="Red"/>
Invece di avere uno sguardo gigantesca un'istruzione switch per tutti i colori possibili, sarebbe bello utilizzare solo le proprietà nelle System.Drawing.Brushes classe invece così internamente che posso dire qualcosa del tipo:
Brush color = Brushes.Black; // Default
// later on...
this.color = (Brush)Enum.Parse(typeof(Brush), prasedValue("color"));
Se non fosse che i valori in spazzola / e non sono enumerazioni. Così Enum.Parse mi dà nessuna gioia. Suggerimenti?
Soluzione
Recap di tutte le risposte precedenti, diversi modi per convertire una stringa in un colore o pennello:
// best, using Color's static method
Color red1 = Color.FromName("Red");
// using a ColorConverter
TypeConverter tc1 = TypeDescriptor.GetConverter(typeof(Color)); // ..or..
TypeConverter tc2 = new ColorConverter();
Color red2 = (Color)tc.ConvertFromString("Red");
// using Reflection on Color or Brush
Color red3 = (Color)typeof(Color).GetProperty("Red").GetValue(null, null);
// in WPF you can use a BrushConverter
SolidColorBrush redBrush = (SolidColorBrush)new BrushConverter().ConvertFromString("Red");
Altri suggerimenti
String a pennello:
myTextBlock.Foreground = new BrushConverter().ConvertFromString("#FFFFFF") as SolidColorBrush;
Questo è il mio caso qui!
Un pennello può essere dichiarato come questo
Brush myBrush = new SolidBrush(Color.FromName("Red"));
D'oh. Dopo un po 'di ricerca ho trovato:
Color.FromName(a.Value)
Dopo aver premuto "post". Da lì il passo è breve per:
color = new SolidBrush(Color.FromName(a.Value));
Lascio questa domanda qui per gli altri ....
Si potrebbe utilizzare la riflessione per questo:
Type t = typeof(Brushes);
Brush b = (Brush)t.GetProperty("Red").GetValue(null, null);
Naturalmente, si vorrà un po 'di controllo di gestione degli errori / intervallo se la stringa è sbagliata.
Sono d'accordo che utilizzano TypeConverters sono il metodo migliore:
Color c = (Color)TypeDescriptor.GetConverter(typeof(Color)).ConvertFromString("Red");
return new Brush(c);
Provare a usare un TypeConverter
. Esempio:
var tc = TypeDescriptor.GetConverter(typeof(Brush));
Un'altra alternativa è quella di utilizzare la riflessione, e andare oltre le proprietà in SystemBrushes
.
Se si desidera, è possibile estendere questo ancora di più e consentire loro di specificare i valori per la R, G e B valori. Poi basta chiamare Color.FromArgb (int r, int g, int b);
È possibile utilizzare sistema .Drawing.KnownColor enum. Specifica tutti i colori di sistema note.