C#从Color中获取所有颜色
我想让ComboBox
填充System.Drawing.Color
所有颜色
但我似乎无法从该系列中收集所有颜色
我已经尝试过使用foreach
来完成这样的工作:
foreach (Color clr in Color) { }
但我得到的只是一个错误。
那我怎么能循环所有的颜色呢?
任何帮助将不胜感激。
你可以从KnownColor中获取颜色
KnownColor[] colors = Enum.GetValues(typeof(KnownColor)); foreach(KnownColor knowColor in colors) { Color color = Color.FromKnownColor(knowColor); }
或者使用reflection来避免像Menu , Desktop …这样的颜色包含在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); }
类似于@ madgnome的代码,但我更喜欢以下内容,因为它不需要解析字符串名称(在我看来是冗余间接):
foreach (var colorValue in Enum.GetValues(typeof(KnownColor))) Color color = Color.FromKnownColor((KnownColor)colorValue);
这就是我想你想要的:
foreach (Color color in new ColorConverter().GetStandardValues()) { MessageBox.Show(color.ToString()); }
它将遍历所有标准的颜色值,并且应该适合您的需要
我得到颜色的方式。 我认为这是通过Reflection库的最佳方式。
private List GetAllColors() { List allColors = new List (); foreach (PropertyInfo property in typeof(Color).GetProperties()) { if (property.PropertyType == typeof(Color)) { allColors.Add((Color)property.GetValue(null)); } } return allColors; }
要求是有一个系统颜色列表可供选择,一个“网络”颜色列表,AKA专业颜色,然后通过R,G,B语法RGB,最后使用颜色选择器控件完整性。
我保存颜色列表和系统颜色属性供以后使用。 ReduceName(颜色)从字符串中删除“Color [Name]”组件。 如果您没有维护颜色的运行列表,则会在第二个列表中显示两次。 可能有更优雅的方法来处理,但时间比完美更重要,通常情况下。
_ListAllColors = new List(); _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); } }