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