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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top