Web color list in C # application

Hello to all,

if, for example, I install BackColor panels in Winform using Visual Studio, I can choose a color from three lists:

Custom, Web, System

Is it possible to return only Web colors in my C # code application? They are part of KnownColor, but so far I could only find how to remove System Control from my list.

I would like to use web colors because they are sorted in a good way, and I would like to insert them into a self-implemented combobox.

thanks

+7
source share
3 answers

Color struct contains all web colors as constants (system colors are defined as constants in the SystemColors class)

To get a list of these colors, simply do:

 var webColors = GetConstants(typeof(Color)); var sysColors = GetConstants(typeof(SystemColors)); 

having GetConstants defined as follows:

 static List<Color> GetConstants(Type enumType) { MethodAttributes attributes = MethodAttributes.Static | MethodAttributes.Public; PropertyInfo[] properties = enumType.GetProperties(); List<Color> list = new List<Color>(); for (int i = 0; i < properties.Length; i++) { PropertyInfo info = properties[i]; if (info.PropertyType == typeof(Color)) { MethodInfo getMethod = info.GetGetMethod(); if ((getMethod != null) && ((getMethod.Attributes & attributes) == attributes)) { object[] index = null; list.Add((Color)info.GetValue(null, index)); } } } return list; } 

EDIT:

To get colors sorted exactly the same as in VS, do:

 var webColors = GetConstants(typeof(Color)); var sysColors = GetConstants(typeof(SystemColors)); webColors.Sort(new StandardColorComparer()); sysColors.Sort(new SystemColorComparer()); 

with StandardColorComparer and SystemColorComparer defined as follows:

 class StandardColorComparer : IComparer<Color> { // Methods public int Compare(Color color, Color color2) { if (color.A < color2.A) { return -1; } if (color.A > color2.A) { return 1; } if (color.GetHue() < color2.GetHue()) { return -1; } if (color.GetHue() > color2.GetHue()) { return 1; } if (color.GetSaturation() < color2.GetSaturation()) { return -1; } if (color.GetSaturation() > color2.GetSaturation()) { return 1; } if (color.GetBrightness() < color2.GetBrightness()) { return -1; } if (color.GetBrightness() > color2.GetBrightness()) { return 1; } return 0; } } class SystemColorComparer : IComparer<Color> { // Methods public int Compare(Color color, Color color2) { return string.Compare(color.Name, color2.Name, false, CultureInfo.InvariantCulture); } } 

NB:

This code was taken from System.Drawing.Design.ColorEditor through a reflector.

+8
source
 var webColors = Enum.GetValues(typeof(KnownColor)) .Cast<KnownColor>() .Where (k => k >= KnownColor.Transparent && k < KnownColor.ButtonFace) //Exclude system colors .Select(k => Color.FromKnownColor(k)); 

EDIT:

To order colors, add:

 .OrderBy(c => c.GetHue()) .ThenBy(c => c.GetSaturation()) .ThenBy(c => c.GetBrightness()); 
+7
source

If you need to sort it by its primary color, you can use this as a starting point:

 var colors = Enum.GetValues(typeof(KnownColor)) .Cast<KnownColor>() .Select(kc => Color.FromKnownColor(kc)) .OrderBy(c => c.GetHue()) 
0
source

All Articles