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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top