C#从Color中获取所有颜色

时间:2010-09-29 11:30:17

标签: c# arrays collections loops colors

我想让ComboBox填充System.Drawing.Color

中的所有颜色

但我似乎无法从该系列收集所有颜色

我已经尝试使用foreach来完成这样的工作:

foreach (Color clr in Color)
     {

     }

但我得到的只是一个错误。

那么如何循环使用所有颜色呢?

任何帮助将不胜感激。

6 个答案:

答案 0 :(得分:42)

您可以从KnownColor

获取颜色
KnownColor[] colors  = Enum.GetValues(typeof(KnownColor));
foreach(KnownColor knowColor in colors)
{
  Color color = Color.FromKnownColor(knowColor);
}

或使用反射来避免颜色,如菜单桌面... 包含在KnowColor中

Type colorType = typeof(System.Drawing.Color);
// We take only static property to avoid properties like Name, IsSystemColor ...
PropertyInfo[] propInfos = colorType.GetProperties(BindingFlags.Static | BindingFlags.DeclaredOnly | BindingFlags.Public);
foreach (PropertyInfo propInfo in propInfos) 
{
  Console.WriteLine(propInfo.Name);
}

答案 1 :(得分:13)

与@ madgnome的代码类似,但我更喜欢以下内容,因为它不需要解析字符串名称(在我看来是冗余间接):

foreach (var colorValue in Enum.GetValues(typeof(KnownColor)))
    Color color = Color.FromKnownColor((KnownColor)colorValue);

答案 2 :(得分:4)

这就是我想你想要的:

foreach (Color color in new ColorConverter().GetStandardValues())
{
    MessageBox.Show(color.ToString());
}

它将遍历所有颜色的标准值,并且应该适合您需要的

答案 3 :(得分:4)

我获取颜色的方法。我认为这是通过Reflection库的最佳方式。

private List<Color> GetAllColors()
{
    List<Color> allColors = new List<Color>();

    foreach (PropertyInfo property in typeof(Color).GetProperties())
    {
        if (property.PropertyType == typeof(Color))
        {
            allColors.Add((Color)property.GetValue(null));
        }
    }

    return allColors;
}

答案 4 :(得分:0)

要求是要有一个可供选择的系统颜色列表,一个&#34; web&#34;的列表。颜色,AKA的专业颜色,然后RGB通过R,G,B语法,最后使用颜色选择器控制完整。

我保存颜色列表和系统颜色属性以供日后使用。 ReduceName(颜色)删除&#34;颜色[名称]&#34;字符串中的组件。如果您没有维护正在运行的颜色列表,则会在第二个列表中显示两次。处理这种方法可能有一种更优雅的方法,但时间往往比完美更重要,通常就是这种情况。

_ListAllColors = new List<Color>();
_SystemColorProperties = typeof(SystemColors).GetProperties();
foreach (PropertyInfo propertyInfo in _SystemColorProperties)
{
    object colorObject = propertyInfo.GetValue(null, null);
    Color color = (Color)colorObject;
    if (!_ListAllColors.Contains(color))
    {
        systemColorsComboBox.Items.Add(ReduceName(color));
        _ListAllColors.Add(color);
    }
}

foreach (KnownColor colorValue in Enum.GetValues(typeof(KnownColor)))
{
    Color color = Color.FromKnownColor(colorValue);

    if (!_ListAllColors.Contains(color))
    {
        professionalColorsComboBox.Items.Add(ReduceName(color));
        _ListAllColors.Add(color);
    }
}

System Colors

Professional Colors

答案 5 :(得分:0)

基于@Julien Hoarau的答案,我用来查找颜色的方法是将它们像这样转储到LinqPad中:

void Main()
{
    ((KnownColor[])Enum.GetValues(typeof(KnownColor)))
        .Select(knowColor => System.Drawing.Color.FromKnownColor(knowColor))
        .Where(color => color.R == color.R)
        .ToList()
        .ForEach(color =>   
    {

        var _label = new Label();
        _label.Background = new SolidColorBrush(System.Windows.Media.Color.FromArgb(color.A, color.R, color.G, color.B));
        _label.Foreground = new SolidColorBrush(System.Windows.Media.Color.FromArgb(color.A, (byte)~color.R, (byte)~color.G, (byte)~color.B));
        _label.Content = $"{color.Name} R:{color.R} G:{color.G} B:{color.B}";
        _label.Dump();
    });
}

哪个会产生这样的漂亮列表:

enter image description here