Escolha um pincel aleatório
Pergunta
Estou procurando um método para escolher aleatoriamente Brush
em Brushes
coleção (Aqua,Azure, ...Preto,...).Qualquer pista?
Solução
Você pode usar um pouco de reflexão, assim:
private Brush PickBrush()
{
Brush result = Brushes.Transparent;
Random rnd = new Random();
Type brushesType = typeof(Brushes);
PropertyInfo[] properties = brushesType.GetProperties();
int random = rnd.Next(properties.Length);
result = (Brush)properties[random].GetValue(null, null);
return result;
}
Isso será o suficiente.Você pode querer alterar a randomização para usar um método externo Random
por exemplo, em vez de recriar uma nova semente cada vez que o método é chamado, como no meu exemplo.
Outras dicas
Se você simplesmente quiser cores aleatórias, qualquer cor aleatória, basta usar um Random
objeto para gerar valores (a)rgb entre 0 e 255.
Se você realmente deseja uma cor nomeada (pincel), poderá armazenar todos os valores predefinidos em uma tabela de pesquisa e gerar aleatoriamente um índice nela.Como Brushes
é uma classe (em oposição a um `enum'), fica um pouco mais complicado buscar aleatoriamente uma propriedade estática, mas você pode usar a reflexão para fazer isso.Armazene todos os nomes de propriedades por meio de reflexão em uma tabela de pesquisa e use a reflexão mais uma vez para obter o valor da propriedade que corresponde ao nome armazenado.
private List<Brush> _brushes;
private void InitBrushes()
{
_brushes = new List<Brush>();
var props = typeof(Brushes).GetProperties( BindingFlags.Public | BindingFlags.Static );
foreach( var propInfo in props )
{
_brushes.Add( (Brush)propInfo.GetValue( null, null ) );
}
}
E para obter um pincel aleatório...
private Random _rand = new Random();
private Brush GetRandomBrush()
{
return _brushes[_rand.Next(_brushes.Count)];
}
Espero não ter cometido nenhum erro aqui, estou no celular e não posso testar, mas você entendeu.
O Brushes
não é uma coleção, é uma classe com muitas propriedades estáticas.Você poderia escolher as propriedades estáticas com reflexão, mas eu sugiro que você apenas crie um array com os pincéis desejados:
Brush[] brushes = new Brush[] {
Brushes.AliceBlue,
Brushes.AntiqueWhite,
Brushes.Aqua,
...
Brushes.YellowGreen
};
Então você pode facilmente escolher um aleatoriamente:
Random rnd = new Random();
Brush brush = brushes[rnd.Next(brushes.Length)];
Random rand = new Random();
Brush brush = new SolidColorBrush(Color.FromRgb((byte) rand.Next(0, 256), (byte) rand.Next(0, 256), (byte) rand.Next(0, 256)));
Isso deve funcionar:
Brush RandomBrush()
{
PropertyInfo[] brushInfo = typeof(Brushes).GetProperties();
Brush[] brushList = new Brush[brushInfo.Length];
for(int i = 0;i < brushInfo.Length;i++)
{
brushList[i] = (Brush)brushInfo[i].GetValue(null, null);
}
Random randomNumber = new Random(DateTime.Now.Second);
return brushList[randomNumber.Next(1, brushList.Length)];
}
Eu adicionei um método utilitário conforme abaixo, que retornará uma cor aleatória.
public static Brush getRandomBrush()
{
string[] brushArray = typeof(Brushes).GetProperties().
Select(c => c.Name).ToArray();
Random randomGen = new Random();
string randomColorName = brushArray[randomGen.Next(brushArray.Length)];
SolidColorBrush color = (SolidColorBrush)new BrushConverter().ConvertFromString(randomColorName);
return color;
}
Para obter pincéis padrão do WPF:
var brushes = typeof(Brushes).GetProperties(BindingFlags.Public | BindingFlags.Static).Select(pi => (Brush)pi.GetValue(null, null));