【问题标题】:Pick a Random Brush选择一个随机画笔
【发布时间】:2011-08-30 09:00:38
【问题描述】:

我正在寻找一种在Brushes 集合(Aqua、Azure、...Black、...)中随机选择Brush 的方法。有什么线索吗?

【问题讨论】:

    标签: c# .net wpf brushes


    【解决方案1】:

    你可以使用一点反射,像这样:

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

    【讨论】:

    • 谢谢 :) 这就是我想要的。
    【解决方案2】:

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

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

    【讨论】:

    • 为了在第一句话上快速扩展并保存未来 new-to-wpf-me 的一些谷歌搜索,Color myColor = Color.FromRgb(randomByte1, randomByte2, randomByte3); SolidColorBrush myBrush = new SolidColorBrush(myColor);(尽管这个答案中的第二个建议是 much 更整洁) 谢谢!
    【解决方案3】:

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

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

    那么你就可以很容易地随机选择一个了:

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

    【讨论】:

    • 我不认为使用反射的一次性成本可以证明这种方法的合理性。如果在框架的未来版本中修改了类,您还可以获得获取所有属性的好处。您建议这样做还有其他原因吗?
    • @Ed S.:很多人似乎都将反射作为第一选择,所以我提出了一个替代方案,以表明您不必对所有事情都使用反射。
    • 是的,这就是我提到这样做的原因。也就是说,在这种情况下,反射似乎是最佳途径。
    • 为什么投反对票?如果你不解释你认为错的地方是什么,就无法改进答案。
    【解决方案4】:
    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)));
    

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

        这应该可行:

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

        【讨论】:

          【解决方案7】:

          获取 WPF 默认画笔:

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

          【讨论】:

            猜你喜欢
            • 2010-11-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-07-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多