Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 随机挑选一支画笔_C#_.net_Wpf_Brushes - Fatal编程技术网

C# 随机挑选一支画笔

C# 随机挑选一支画笔,c#,.net,wpf,brushes,C#,.net,Wpf,Brushes,我正在寻找一种方法,在画笔集合(Aqua,Azure,…Black,…)中随机挑选画笔。有什么线索吗?如果您只是想要随机颜色,任何随机颜色,只需使用随机对象生成(a)介于0和255之间的rgb值 如果您确实需要命名颜色(画笔),可以将所有预定义值存储在查找表中,并随机生成索引。由于brusks是一个类(与“enum”相反),随机获取静态属性变得有点棘手,但您可以使用反射来实现。通过反射在查找表中存储所有属性名称,然后再次使用反射获取与存储名称对应的属性值 private List<Brus

我正在寻找一种方法,在
画笔
集合(Aqua,Azure,…Black,…)中随机挑选
画笔
。有什么线索吗?

如果您只是想要随机颜色,任何随机颜色,只需使用
随机对象生成(a)介于0和255之间的rgb值

如果您确实需要命名颜色(画笔),可以将所有预定义值存储在查找表中,并随机生成索引。由于
brusks
是一个类(与“enum”相反),随机获取静态属性变得有点棘手,但您可以使用反射来实现。通过反射在查找表中存储所有属性名称,然后再次使用反射获取与存储名称对应的属性值

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

我希望我在这里没有犯任何错误,我在手机上,无法测试它,但是你知道了大概的意思。

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

Brush[] brushes = new Brush[] {
  Brushes.AliceBlue,
  Brushes.AntiqueWhite,
  Brushes.Aqua,
  ...
  Brushes.YellowGreen
};
然后您可以很容易地随机选择一个:

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

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

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;
}
那就行了。您可能希望更改随机化以使用外部
随机
实例,而不是在每次调用该方法时重新创建新种子,如我的示例所示。

这应该可以:

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)];
}
Brush-RandomBrush()
{
PropertyInfo[]brushInfo=typeof(笔刷).GetProperties();
画笔[]画笔列表=新画笔[brushInfo.Length];
对于(int i=0;i
我添加了一个实用方法,如下所示,它将返回一个随机颜色

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

要获取WPF默认笔刷,请执行以下操作:

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

谢谢:)这正是我想要的。我认为使用反射的一次性成本不足以证明这种方法的合理性。如果该类在未来版本的框架中被修改,那么您还可以获取所有属性。你建议这样做还有其他原因吗?@Ed S:很多人似乎都把反射作为第一选择,所以我建议了一个替代方案,以表明你不必对所有事情都使用反射。是的,这就是为什么我也提到这样做的原因。也就是说,在这种情况下,反思似乎是最好的途径。为什么要投反对票?如果你不解释你认为错误的地方,就无法改进答案。要快速扩展第一句话并保存wpf me的一些谷歌新功能,
Color myColor=Color.FromRgb(随机字节1、随机字节2、随机字节3);SolidColorBrush myBrush=新的SolidColorBrush(myColor)(当然,这个答案中的第二个建议要简洁得多)谢谢!
var brushes = typeof(Brushes).GetProperties(BindingFlags.Public | BindingFlags.Static).Select(pi => (Brush)pi.GetValue(null, null));
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)));