【发布时间】:2011-08-30 09:00:38
【问题描述】:
我正在寻找一种在Brushes 集合(Aqua、Azure、...Black、...)中随机选择Brush 的方法。有什么线索吗?
【问题讨论】:
我正在寻找一种在Brushes 集合(Aqua、Azure、...Black、...)中随机选择Brush 的方法。有什么线索吗?
【问题讨论】:
你可以使用一点反射,像这样:
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 实例,而不是像我的示例中那样每次调用该方法时重新创建一个新种子。
【讨论】:
如果您只是想要随机颜色,任何随机颜色,只需使用 Random 对象生成 0 到 255 之间的 (a)rgb 值。
如果您确实需要命名颜色(画笔),您可以将所有预定义值存储在查找表中并随机生成索引。由于Brushes 是一个类(与“枚举”相反),因此随机获取静态属性有点棘手,但您可以使用反射来完成它。通过反射将所有属性名称存储在查找表中,然后再次使用反射获取与存储名称对应的属性值。
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)];
}
我希望我没有在这里犯任何错误,我在手机上无法测试它,但你明白了。
【讨论】:
Color myColor = Color.FromRgb(randomByte1, randomByte2, randomByte3); SolidColorBrush myBrush = new SolidColorBrush(myColor);(尽管这个答案中的第二个建议是 much 更整洁) 谢谢!
Brushes 不是一个集合,它是一个有很多静态属性的类。您可以通过反射选择静态属性,但我建议您只使用所需的画笔创建一个数组:
Brush[] brushes = new Brush[] {
Brushes.AliceBlue,
Brushes.AntiqueWhite,
Brushes.Aqua,
...
Brushes.YellowGreen
};
那么你就可以很容易地随机选择一个了:
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)));
【讨论】:
我添加了一个实用方法,如下所示,它将返回随机颜色。
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;
}
【讨论】:
这应该可行:
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)];
}
【讨论】:
获取 WPF 默认画笔:
var brushes = typeof(Brushes).GetProperties(BindingFlags.Public | BindingFlags.Static).Select(pi => (Brush)pi.GetValue(null, null));
【讨论】: