C#从颜色中获取所有颜色

C#从颜色中获取所有颜色,c#,arrays,collections,loops,colors,C#,Arrays,Collections,Loops,Colors,我想制作一个组合框,填充System.Drawing.Color 但是我似乎不能收集所有的颜色 我已经尝试使用foreach来完成以下工作: foreach (Color clr in Color) { } void Main() { ((KnownColor[])Enum.GetValues(typeof(KnownColor))) .Select(knowColor => System.Drawing.Color.FromKnownCol

我想制作一个
组合框
,填充
System.Drawing.Color

但是我似乎不能收集所有的颜色

我已经尝试使用
foreach
来完成以下工作:

foreach (Color clr in Color)
     {

     }
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();
    });
}
但我得到的只是一个错误

那么我怎样才能循环使用所有的颜色呢


任何帮助都将不胜感激。

您可以从

或者使用反射来避免菜单、桌面等颜色。。。包含在颜色中

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

这就是我认为你想要的:

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

它将循环使用颜色的所有标准值,并且应该适用于您需要的

,类似于@madgnome的代码,但我更喜欢以下内容,因为它不需要解析字符串名称(我认为这是一个冗余的间接过程):


我得到颜色的方法。我认为通过反射库是最好的方法

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;
}
private List GetAllColors()
{
List allColors=新列表();
foreach(PropertyInfo属性的typeof(Color).GetProperties())
{
if(property.PropertyType==typeof(颜色))
{
Add((Color)property.GetValue(null));
}
}
返回所有颜色;
}

要求有一个可供选择的系统颜色列表,一个“web”颜色列表,也称为专业颜色,然后是通过R、G、B语法的RGB,最后是使用颜色选择器控件以确保完整性

我保存了颜色和系统颜色属性的列表,以供以后使用。ReduceName(color)从字符串中删除“color[Name]”组件。如果您没有维护一个运行的颜色列表,您将让它们在第二个列表中显示两次。也许有一种更优雅的方法来处理这个问题,但时间比完美更重要,这是经常发生的情况

_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);
    }
}
\u ListAllColors=new List();
_SystemColorProperties=typeof(SystemColors).GetProperties();
foreach(PropertyInfo PropertyInfo in_SystemColorProperties)
{
object colorObject=propertyInfo.GetValue(null,null);
Color Color=(Color)colorObject;
如果(!\u ListAllColors.Contains(颜色))
{
systemColorsComboBox.Items.Add(ReduceName(color));
_ListAllColors.Add(颜色);
}
}
foreach(Enum.GetValues中的KnownColor colorValue(typeof(KnownColor)))
{
Color Color=Color.FROMKNOWN Color(colorValue);
如果(!\u ListAllColors.Contains(颜色))
{
professionalColorsComboBox.Items.Add(还原名称(颜色));
_ListAllColors.Add(颜色);
}
}


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

foreach (Color clr in Color)
     {

     }
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();
    });
}
这会产生如下的好列表:

foreach (Color clr in Color)
     {

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

谢谢!这正是我所需要的。我会简单地选择所有颜色,然后找到一种过滤它们的方法,以避免我自己选择菜单和桌面颜色。非常感谢你!第一行末尾缺少“)”