Conversion d'une chaîne à brosses / pinceau nom de la couleur en C #
Question
J'ai un fichier de configuration dans laquelle un développeur peut spécifier une couleur de texte en passant dans une chaîne:
<text value="Hello, World" color="Red"/>
Plutôt que d'avoir un look instruction switch gigantesque pour toutes les couleurs possibles, il serait agréable de simplement utiliser les propriétés dans la classe System.Drawing.Brushes à la place pour que je puisse dire intérieurement quelque chose comme:
Brush color = Brushes.Black; // Default
// later on...
this.color = (Brush)Enum.Parse(typeof(Brush), prasedValue("color"));
Sauf que les valeurs de brosse / brosses ne sont pas énumérations. Alors Enum.Parse me donne pas de joie. Suggestions?
La solution
Recap de toutes les réponses précédentes, différentes façons de convertir une chaîne en couleur ou pinceau:
// 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");
Autres conseils
Chaîne à brosse:
myTextBlock.Foreground = new BrushConverter().ConvertFromString("#FFFFFF") as SolidColorBrush;
C'est mon cas ici!
Une brosse peut être déclarée comme ceci
Brush myBrush = new SolidBrush(Color.FromName("Red"));
D'oh. Après un certain temps de regarder, je trouve:
Color.FromName(a.Value)
Après avoir atteint "post". De là, il n'y a qu'un pas à:
color = new SolidBrush(Color.FromName(a.Value));
Je vais laisser cette question ici pour d'autres ....
Vous pouvez utiliser la réflexion pour cela:
Type t = typeof(Brushes);
Brush b = (Brush)t.GetProperty("Red").GetValue(null, null);
Bien sûr, vous voulez une vérification de gestion des erreurs / plage si la chaîne ne va pas.
Je suis d'accord que l'utilisation TypeConverters sont la meilleure méthode:
Color c = (Color)TypeDescriptor.GetConverter(typeof(Color)).ConvertFromString("Red");
return new Brush(c);
Essayez d'utiliser un TypeConverter
. Exemple:
var tc = TypeDescriptor.GetConverter(typeof(Brush));
Une autre alternative consiste à utiliser la réflexion et aller sur les propriétés en SystemBrushes
.
Si vous voulez, vous pouvez étendre ce encore plus et leur permettre de spécifier les valeurs de R, les valeurs G et B. Ensuite, vous appelez simplement Color.FromArgb (int r, int g, int b);