选择一个随机画笔

ojs*_*sim 27 .net c# wpf brushes

我正在寻找一种BrushBrushes集合中随机选择的方法(Aqua,Azure,... Black,...).任何线索?

Edw*_*aal 45

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

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;
}
Run Code Online (Sandbox Code Playgroud)

那就行了.您可能希望更改随机化以使用外部Random实例,而不是在每次调用方法时重新创建新种子,如我的示例所示.


Ed *_* S. 14

如果您只是想要随机颜色,任何随机颜色,只需使用一个Random对象来生成(a)0到255之间的rgb值.

如果您确实需要命名颜色(Brush),则可以将所有预定义值存储在查找表中,并随机生成一个索引.作为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 ) );
    }
}
Run Code Online (Sandbox Code Playgroud)

并获得随机刷......

private Random _rand = new Random();
private Brush GetRandomBrush()
{
   return _brushes[_rand.Next(_brushes.Count)];
}
Run Code Online (Sandbox Code Playgroud)

我希望我没有在这里犯任何错误,我在手机上,无法测试,但你得到了一般的想法.


Guf*_*ffa 7

Brushes不是一个集合,它是用大量的静态属性的类.您可以使用反射选择静态属性,但我建议您只使用所需的画笔创建一个数组:

Brush[] brushes = new Brush[] {
  Brushes.AliceBlue,
  Brushes.AntiqueWhite,
  Brushes.Aqua,
  ...
  Brushes.YellowGreen
};
Run Code Online (Sandbox Code Playgroud)

然后您可以随机轻松选择一个:

Random rnd = new Random();
Brush brush = brushes[rnd.Next(brushes.Length)];
Run Code Online (Sandbox Code Playgroud)

  • 我认为使用反射的一次性成本不会证明这种方法的合理性。如果在将来的框架版本中对类进行了修改,您还将获得抓住所有属性的好处。您建议采用这种方法还有其他原因吗? (2认同)