c# .net wpf brushes

c# - Elige un pincel aleatorio



.net wpf (7)

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

Estoy buscando un método para elegir un Brush azar en la colección de Brushes (Aqua, Azure, ... Black, ...). ¿Cualquier pista?


He añadido un método de utilidad como el de abajo, que devolverá un color aleatorio.

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


Los Brushes no son una colección, es una clase con muchas propiedades estáticas. Podría seleccionar las propiedades estáticas con reflexión, pero le sugiero que cree una matriz con los pinceles que desee:

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

Entonces puedes elegir fácilmente uno al azar:

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


Para obtener los pinceles predeterminados de WPF:

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


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

Eso hará el truco. Es posible que desee cambiar la asignación aleatoria para utilizar una instancia Random externa, en lugar de volver a crear una nueva semilla cada vez que se llame al método, como en mi ejemplo.


Si simplemente desea colores aleatorios, cualquier color aleatorio, simplemente use un objeto Random para generar (a) valores rgb entre 0 y 255.

Si realmente desea un color con nombre (Pincel), puede almacenar todos los valores predefinidos en una tabla de búsqueda y generar aleatoriamente un índice en él. Como Brushes es una clase (a diferencia de un `enumeración ''), es un poco más complicado obtener aleatoriamente una propiedad estática, pero se podría usar la reflexión para hacerlo. Almacene todos los nombres de propiedades a través de la reflexión en una tabla de búsqueda y luego use la reflexión una vez más para obtener el valor de la propiedad que corresponde al nombre almacenado.

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 obtener un pincel al azar ...

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

Espero no haber cometido ningún error aquí, estoy usando mi teléfono y no puedo probarlo, pero entiendes la idea general.


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