【发布时间】:2012-01-24 05:31:17
【问题描述】:
我想尝试一下 dotnetbar 样式管理器的色调。 C# 的 System.Drawing.Color 中有很多颜色,所以我想用一个按钮来制作一个简单的应用程序,该按钮可以遍历每种颜色。
我会做某种 foreach 循环或类似的事情,但它说 System.Drawing.Color 是一种类型。我是 C# 新手,有没有办法做到这一点?
【问题讨论】:
标签: c# visual-studio for-loop struct
我想尝试一下 dotnetbar 样式管理器的色调。 C# 的 System.Drawing.Color 中有很多颜色,所以我想用一个按钮来制作一个简单的应用程序,该按钮可以遍历每种颜色。
我会做某种 foreach 循环或类似的事情,但它说 System.Drawing.Color 是一种类型。我是 C# 新手,有没有办法做到这一点?
【问题讨论】:
标签: c# visual-studio for-loop struct
您指的是通过静态属性在System.Drawing.Color structure 中定义的命名颜色。它们都列在文档中,但正如您所发现的,没有直观的方式循环它们。
相反,您需要使用Reflection(简而言之,可以看到自身的代码)来获取它们。基本上,您所做的是获取 Color 类型中所有公共静态属性的集合(在这种情况下,恰好是命名的颜色),然后循环遍历其中的每一个。
例如,您可能会使用这样的代码(警告,未经测试!):
var colorType = typeof(System.Drawing.Color);
var staticProperties = colorType.GetProperties(BindingFlags.Static | BindingFlags.Public);
var colors = staticProperties.Select(prop => (Color)prop.GetValue(null, null));
foreach (Color clr in colors)
{
// Test the color...
}
【讨论】:
如果你还想尝试一下,只是为了好玩,我建议以下。
(你说你是新人,那我来一步步指导)
我们将做一个简单的例子,我们将改变我们要按下的按钮的颜色。
添加一些代码:
for (int r = 0; r <= 255; r++)
{
for (int g = 0; g <= 255; g++)
{
for (int b = 0; b <= 255; b++)
{
button1.BackColor = Color.FromArgb(r, g, b);
}
}
}
在按钮中你现在只需调用
backgroundWorker1.RunWorkerAsync();
现在您可以长时间观察颜色了。 :)
【讨论】:
Color.FromArgb 可以解决问题。使用它你可以制作新的颜色。
例如做红色:
Color c = Color.FromArgb(255, 0, 0);
顺便说一句,“遍历每种颜色”可能有点多。有 256(alpha) x 256(red) x 256(green) x 256(blue) 颜色。那是 4294967296 组合。
【讨论】: