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?

Était-ce utile?

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);

scroll top