public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { string strValue = value as string; if (strValue != null) { object obj = null; string text = strValue.Trim(); if (text.Length == 0) { obj = Color.Empty; } else { // First, check to see if this is a standard name. // obj = GetNamedColor(text); if (obj == null) { if (culture == null) { culture = CultureInfo.CurrentCulture; } char sep = culture.TextInfo.ListSeparator[0]; bool tryMappingToKnownColor = true; TypeConverter intConverter = TypeDescriptor.GetConverter(typeof(int)); // If the value is a 6 digit hex number only, then // we want to treat the Alpha as 255, not 0 // if (text.IndexOf(sep) == -1) { // text can be '' (empty quoted string) if (text.Length >= 2 && (text[0] == '\'' || text[0] == '"') && text[0] == text[text.Length - 1]) { // In quotes means a named value string colorName = text.Substring(1, text.Length - 2); obj = ExtendedColors.FromName(colorName); tryMappingToKnownColor = false; } else if ((text.Length == 7 && text[0] == '#') || (text.Length == 8 && (text.StartsWith("0x") || text.StartsWith("0X"))) || (text.Length == 8 && (text.StartsWith("&h") || text.StartsWith("&H")))) { // Note: ConvertFromString will raise exception if value cannot be converted. obj = ExtendedColors.FromArgb(unchecked ((int)(0xFF000000 | (uint)(int)intConverter.ConvertFromString(context, culture, text)))); } } // Nope. Parse the RGBA from the text. // if (obj == null) { string[] tokens = text.Split(new char[] { sep }); int[] values = new int[tokens.Length]; for (int i = 0; i < values.Length; i++) { values[i] = unchecked ((int)intConverter.ConvertFromString(context, culture, tokens[i])); } // We should now have a number of parsed integer values. // We support 1, 3, or 4 arguments: // // 1 -- full ARGB encoded // 3 -- RGB // 4 -- ARGB // switch (values.Length) { case 1: obj = ExtendedColors.FromArgb(values[0]); break; case 3: obj = ExtendedColors.FromArgb(values[0], values[1], values[2]); break; case 4: obj = ExtendedColors.FromArgb(values[0], values[1], values[2], values[3]); break; } tryMappingToKnownColor = true; } if ((obj != null) && tryMappingToKnownColor) { // Now check to see if this color matches one of our known colors. // If it does, then substitute it. We can only do this for "Colors" // because system colors morph with user settings. // int targetARGB = ((ExtendedColors)obj).ToArgb(); foreach (ExtendedColors c in Colors.Values) { if (c.ToArgb() == targetARGB) { obj = c; break; } } } } if (obj == null) { throw new ArgumentException("Invalid ExtendedColors text"); } } return(obj); } return(base.ConvertFrom(context, culture, value)); }
/// <summary> /// Creates a ExtendedColors structure from the specified 8-bit color values (red, green, and blue). The alpha value is implicitly 255 (fully opaque). Although this method allows a 32-bit value to be passed for each color component, the value of each component is limited to 8 bits. /// </summary> /// <param name="red">The red component value for the new ExtendedColors. Valid values are 0 through 255. </param> /// <param name="green">The green component value for the new ExtendedColors. Valid values are 0 through 255. </param> /// <param name="blue">The blue component value for the new ExtendedColors. Valid values are 0 through 255. </param> /// <returns>The Color that this method creates.</returns> public static ExtendedColors FromArgb(int red, int green, int blue) { return(ExtendedColors.FromArgb(255, red, green, blue)); }