Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Если вам действительно нужен именованный цвет (Brush), вы можете сохранить все предопределенные значения в таблице поиска и произвольно сгенерировать в него индекс. Поскольку 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)];
}

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

Ответ 3

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

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

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

Random rnd = new Random();
Brush brush = brushes[rnd.Next(brushes.Length)];

Ответ 4

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

Ответ 5

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

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

Ответ 6

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

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

Ответ 7

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

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