corda convertido ao nome da cor Brushes / escova em C #
Pergunta
Eu tenho um arquivo de configuração onde um desenvolvedor pode especificar uma cor de texto, passando em uma string:
<text value="Hello, World" color="Red"/>
Ao invés de ter um olhar instrução switch gigantesco para todas as cores possíveis, seria bom usar apenas as propriedades nas System.Drawing.Brushes classe em vez de modo internamente I pode dizer algo como:
Brush color = Brushes.Black; // Default
// later on...
this.color = (Brush)Enum.Parse(typeof(Brush), prasedValue("color"));
A não ser que os valores na escova / escovas não são enums. Então Enum.Parse me dá nenhuma alegria. Sugestões?
Solução
Recap de todas as respostas anteriores, diferentes maneiras de converter uma string para um pincel de cor ou:
// 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");
Outras dicas
String para escova:
myTextBlock.Foreground = new BrushConverter().ConvertFromString("#FFFFFF") as SolidColorBrush;
Esse é o meu caso aqui!
A escova pode ser declarado como este
Brush myBrush = new SolidBrush(Color.FromName("Red"));
D'oh. Depois de um tempo de olhar eu encontrei:
Color.FromName(a.Value)
Depois de bater "post". De lá, é um pequeno passo para:
color = new SolidBrush(Color.FromName(a.Value));
Vou deixar esta questão aqui para outros ....
Você pode usar o reflexo para isso:
Type t = typeof(Brushes);
Brush b = (Brush)t.GetProperty("Red").GetValue(null, null);
É claro, você vai querer alguma manipulação de erro / verificação de intervalo se a cadeia está errado.
Eu concordo que o uso de TypeConverters são o melhor método:
Color c = (Color)TypeDescriptor.GetConverter(typeof(Color)).ConvertFromString("Red");
return new Brush(c);
Tente usar um TypeConverter
. Exemplo:
var tc = TypeDescriptor.GetConverter(typeof(Brush));
Outra alternativa é usar a reflexão, e passar por cima as propriedades em SystemBrushes
.
Se você quiser, você pode estender isso ainda mais e permitir-lhes para especificar valores para os, G e B valores de R. Então você acabou de chamar Color.FromArgb (int r, g int, int b);
Você pode usar Sistema .Drawing.KnownColor enum. Ele especifica todas as cores do sistema conhecido.