Pregunta

Estoy buscando un método para elegir una al azar Brush en Brushes colección (Aqua,Azul, Negro...,...).Alguna pista?

¿Fue útil?

Solución

Usted puede usar un poco de reflexión, así:

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

Que va a hacer el truco.Puede que desee cambiar la aleatorización para uso externo Random ejemplo, en lugar de volver a crear una nueva semilla cada vez que se llama al método, como en mi ejemplo.

Otros consejos

Si usted simplemente quiere colores aleatorios, cualquier colores aleatorios, sólo tiene que utilizar un Random objeto para generar un (a)rgb valores entre 0 y 255.

Si usted realmente desea un color con nombre (Pincel) podría almacenar todos los valores predeterminados en una tabla de búsqueda y generar aleatoriamente un índice en ella.Como Brushes es una clase (en oposición a un `enum') se pone un poco más complicado al azar para obtener una propiedad estática, pero se puede usar la reflexión para hacerlo.Almacenar todos los nombres de la propiedad a través de la reflexión en una tabla de búsqueda y, a continuación, utilizar la reflexión, una vez más para obtener el valor de la propiedad que se corresponde con el nombre guardado.

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

Y para conseguir un azar del Pincel...

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

Espero no hacer ningún error aquí, estoy en mi teléfono y no puedo probarlo, pero usted consigue la idea general.

El Brushes no es una colección, es una clase con un montón de propiedades estáticas.Se podría recoger las propiedades estáticas con la reflexión, pero me permito sugerir que usted acaba de crear una matriz con los pinceles que desee:

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

Entonces usted puede elegir uno al azar:

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

Esto debería funcionar:

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

He añadido un método de utilidad de abajo, que devolverá un color al azar.

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

Para obtener WPF defecto pinceles:

var brushes = typeof(Brushes).GetProperties(BindingFlags.Public | BindingFlags.Static).Select(pi => (Brush)pi.GetValue(null, null));
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top