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