Pergunta

Estou procurando um método para escolher aleatoriamente Brush em Brushes coleção (Aqua,Azure, ...Preto,...).Qualquer pista?

Foi útil?

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));
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top