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

#c# #.net #wpf #brushes

#c# #.net #wpf #Кисти

Вопрос:

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

Ответ №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 resu<
}
  

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

Ответ №2:

Если вам просто нужны случайные цвета, любые случайные цвета, просто используйте 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)];
}
  

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

Комментарии:

1. Для быстрого расширения первого предложения и сохранения будущих изменений в wpf-me немного погуглите, Color myColor = Color.FromRgb(randomByte1, randomByte2, randomByte3); SolidColorBrush myBrush = new SolidColorBrush(myColor); (хотя, по общему признанию, второе предложение в этом ответе намного аккуратнее) Спасибо!

Ответ №3:

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

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

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

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

Комментарии:

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

2. @Ed S.: Похоже, многие люди используют отражение в качестве первого средства, поэтому я предложил альтернативу, чтобы показать, что вам не обязательно использовать отражение для всего.

3. Да, именно поэтому я упомянул, что делаю это и таким образом. Тем не менее, это тот случай, когда отражение кажется лучшим маршрутом.

4. Почему понижающий голос? Если вы не объясните, что именно, по вашему мнению, неправильно, это не сможет улучшить ответ.

Ответ №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:

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

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

Ответ №6:

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

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

Ответ №7:

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

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