27

我正在寻找一种随机选择集合的方法BrushBrushesAqua,Azure,...Black,...)。有什么线索吗?

4

7 回答 7

49

您可以使用一些反射,如下所示:

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实例,而不是在每次调用该方法时重新创建一个新种子,如我的示例所示。

于 2011-05-21T21:12:48.303 回答
13

如果您只是想要随机颜色,任何随机颜色,只需使用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)];
}

我希望我没有在这里犯任何错误,我在我的手机上并且无法测试它,但你明白了一般的想法。

于 2011-05-21T21:00:01.777 回答
7

Brushes不是一个集合,它是一个具有很多静态属性的类。您可以通过反射挑选出静态属性,但我建议您只需使用所需的画笔创建一个数组:

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

然后你可以很容易地随机选择一个:

Random rnd = new Random();
Brush brush = brushes[rnd.Next(brushes.Length)];
于 2011-05-21T21:05:01.717 回答
3
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)));
于 2017-05-14T08:07:00.933 回答
1

我添加了一个实用方法,如下所示,它将返回随机颜色。

    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;
    }
于 2016-01-13T10:29:45.273 回答
0

这应该有效:

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)];
}
于 2012-08-18T19:31:32.030 回答
0

获取 WPF 默认画笔:

var brushes = typeof(Brushes).GetProperties(BindingFlags.Public | BindingFlags.Static).Select(pi => (Brush)pi.GetValue(null, null));
于 2016-02-22T22:31:13.027 回答