Выберите случайную кисть - PullRequest
27 голосов
/ 22 мая 2011

Я ищу способ выбора случайной Brush в Brushes коллекции (Aqua, Azure, ... Black, ...).Любая подсказка?

Ответы [ 7 ]

45 голосов
/ 22 мая 2011

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

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 вместо повторного создания нового начального числа при каждом вызове метода, как в моем примере.

14 голосов
/ 22 мая 2011

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

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

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

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

7 голосов
/ 22 мая 2011

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

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

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

Random rnd = new Random();
Brush brush = brushes[rnd.Next(brushes.Length)];
3 голосов
/ 14 мая 2017
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)));
0 голосов
/ 23 февраля 2016

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

var brushes = typeof(Brushes).GetProperties(BindingFlags.Public | BindingFlags.Static).Select(pi => (Brush)pi.GetValue(null, null));
0 голосов
/ 13 января 2016

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

    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;
    }
0 голосов
/ 18 августа 2012

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

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