Выберите случайную кисть

Я ищу метод, чтобы выбрать случайный Brush на Brushes коллекция (Aqua, Azure, ...Черный.,..). Есть зацепки?

7 ответов


вы можете использовать немного отражения, например:

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;
}

это сделает трюк. Вы можете изменить рандомизацию, чтобы использовать внешний Random экземпляр, вместо повторного создания нового семени каждый раз, когда вызывается метод, как в моем примере.


если вы просто хотите случайные цвета, любые случайные цвета, просто используйте Random объект для генерации (a)значений rgb между 0 и 255.

Если вам действительно нужен именованный цвет (кисть), вы можете сохранить все предопределенные значения в таблице подстановки и случайным образом создать в ней индекс. As Brushes является классом (в отличие от "перечисления"), становится немного сложнее случайным образом получить статическое свойство, но вы можете использовать отражение для этого. Хранить все имена свойств через отражение в таблице подстановки, а затем снова используйте отражение, чтобы получить значение свойства, соответствующего сохраненному имени.

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 ) );
    }
}

и получить случайную кисть...

private Random _rand = new Random();
private Brush GetRandomBrush()
{
   return _brushes[_rand.Next(_brushes.Count)];
}

Я надеюсь, что я не сделал никаких ошибок здесь, я на своем телефоне и не могу проверить это, но вы получите общую идею.


на Brushes не является коллекцией, это класс с большим количеством статических свойств. Вы можете выбрать статические свойства с отражением, но я бы предложил вам просто создать массив с помощью кистей, которые вы хотите:

Brush[] brushes = new Brush[] {
  Brushes.AliceBlue,
  Brushes.AntiqueWhite,
  Brushes.Aqua,
  ...
  Brushes.YellowGreen
};

тогда вы можете легко выбрать один случайным образом:

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)));

Это должно работать:

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)];
}

Я добавил метод утилиты как ниже, который вернет случайный цвет.

    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;
    }

чтобы получить кисти WPF по умолчанию:

var brushes = typeof(Brushes).GetProperties(BindingFlags.Public | BindingFlags.Static).Select(pi => (Brush)pi.GetValue(null, null));