web-dev-qa-db-fra.com

Convertir la chaîne en pinceaux / nom de couleur de pinceau en C #

J'ai un fichier de configuration où un développeur peut spécifier une couleur de texte en passant une chaîne:

 <text value="Hello, World" color="Red"/>

Plutôt que d'avoir une gigantesque instruction switch pour rechercher toutes les couleurs possibles, ce serait bien d'utiliser les propriétés de la classe System.Drawing.Brushes à la place, donc en interne, je peux dire quelque chose comme:

 Brush color = Brushes.Black;   // Default

 // later on...
 this.color = (Brush)Enum.Parse(typeof(Brush), prasedValue("color"));

Sauf que les valeurs dans Brush/Brushes ne sont pas des énumérations. Donc Enum.Parse ne me donne aucune joie. Suggestions?

38
Clinton Pierce

Récapitulatif de toutes les réponses précédentes, différentes façons de convertir une chaîne en couleur ou en 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");
69
Lucas

Chaîne à brosser:

myTextBlock.Foreground = new BrushConverter().ConvertFromString("#FFFFFF") as SolidColorBrush;

C'est mon cas ici!

43
Junior M

Un pinceau peut être déclaré comme ceci

Brush myBrush = new SolidBrush(Color.FromName("Red"));
12
user186917

D'oh. Après un certain temps de recherche, j'ai trouvé:

 Color.FromName(a.Value)

Après avoir appuyé sur "post". À partir de là, il suffit de:

 color = new SolidBrush(Color.FromName(a.Value));

Je vais laisser cette question ici pour les autres ....

8
Clinton Pierce

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 aurez besoin d'une gestion des erreurs/vérification de la plage si la chaîne est incorrecte.

2
Jon B

Je suis d'accord que l'utilisation de TypeConverters est la meilleure méthode:

 Color c = (Color)TypeDescriptor.GetConverter(typeof(Color)).ConvertFromString("Red");
 return new Brush(c);
1
Brian Rudolph

Essayez d'utiliser un TypeConverter. Exemple:

var tc = TypeDescriptor.GetConverter(typeof(Brush));

Une autre alternative consiste à utiliser la réflexion et à parcourir les propriétés dans SystemBrushes.

0
leppie

Si vous le souhaitez, vous pouvez l'étendre encore plus et leur permettre de spécifier des valeurs pour les valeurs R, G et B. Ensuite, vous appelez simplement Color.FromArgb (int r, int g, int b);

0
BFree