web-dev-qa-db-fra.com

Choisissez un pinceau aléatoire

Je cherche une méthode pour choisir une collection Brush au hasard dans la collection Brushes (Aqua, Azure, ... Black, ...). Un indice?

26
ojsim

Vous pouvez utiliser un peu de réflexion, comme suit:

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

Cela fera l'affaire. Vous souhaiterez peut-être modifier la randomisation pour utiliser une instance externe Random au lieu de recréer une nouvelle valeur de départ chaque fois que la méthode est appelée, comme dans mon exemple.

45

Si vous voulez simplement des couleurs aléatoires, toutes couleurs aléatoires, utilisez simplement un objet Random pour générer des valeurs (a) rgb comprises entre 0 et 255.

Si vous voulez réellement une couleur nommée (Pinceau), vous pouvez stocker toutes les valeurs prédéfinies dans une table de recherche et y générer de manière aléatoire un index. Comme Brushes est une classe (par opposition à un "enum"), il devient un peu plus difficile d'extraire une propriété statique au hasard, mais vous pouvez utiliser la réflexion pour le faire. Stockez tous les noms de propriété par réflexion dans une table de recherche, puis utilisez à nouveau la réflexion pour obtenir la valeur de la propriété qui correspond au nom stocké.

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

Et pour obtenir un pinceau au hasard ...

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

J'espère que je n'ai commis aucune erreur ici, je suis sur mon téléphone et je ne peux pas le tester, mais vous avez une idée générale.

14
Ed S.

La Brushes n'est pas une collection, c'est une classe avec beaucoup de propriétés statiques. Vous pouvez choisir les propriétés statiques avec réflexion, mais je suggérerais que vous créiez simplement un tableau avec les pinceaux que vous souhaitez:

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

Ensuite, vous pouvez facilement en choisir un par hasard:

Random rnd = new Random();
Brush brush = brushes[rnd.Next(brushes.Length)];
7
Guffa
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)));
3
Kyriacos

Cela devrait fonctionner:

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

Pour obtenir les brosses WPF par défaut:

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

J'ai ajouté une méthode utilitaire comme ci-dessous, qui retournera une couleur aléatoire.

    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
Malu MN