2011-02-23 18 views
7

Hallo everbody,वेब रंग सूची सी # आवेदन

अगर उदाहरण के लिए मैं दृश्य स्टूडियो का उपयोग कर Winform में एक पैनल के BackColor निर्धारित करते हैं, मैं 3 सूचियों से रंग चुन सकते में:

कस्टम, वेब, सिस्टम

क्या मेरे सी # कोड एप्लिकेशन में केवल वेब रंगों को पुनः प्राप्त करना संभव है? वे KnownColor का हिस्सा हैं लेकिन अब तक मुझे केवल मेरी सूची से सिस्टम नियंत्रण को खत्म करने का तरीका मिल सकता है।

मैं वेब रंगों का उपयोग करना चाहता हूं क्योंकि उन्हें एक अच्छे तरीके से क्रमबद्ध किया गया है और मैं उन्हें एक स्व-कार्यान्वित combobox में डालना चाहता हूं।

धन्यवाद

+0

आप KnownColor enum की सूची सूची चाहते हैं? – Magnus

+0

असल में हाँ, लेकिन मैं दृश्य स्टूडियो में वेब टैब में रंगों को सॉर्ट करना चाहता हूं। मैंने कुछ एल्गोरिदम के साथ रंगों को सॉर्ट करने का प्रयास किया लेकिन परिणाम उतना अच्छा नहीं है। – Klaus78

उत्तर

8

Color struct (सिस्टम रंग SystemColors कक्षा में स्थिरांक के रूप में परिभाषित कर रहे हैं)

इन रंगों की एक सूची प्राप्त करने के लिए बस करो स्थिरांक के रूप में सभी वेब रंग शामिल हैं:

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

GetConstants के रूप में परिभाषित किया गया है:

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

संपादित करें:

रंग हल कर बिल्कुल तरह वी.एस. में क्या प्राप्त करने के लिए:

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

webColors.Sort(new StandardColorComparer()); 
sysColors.Sort(new SystemColorComparer()); 

StandardColorComparer और SystemColorComparer साथ इस प्रकार के रूप में परिभाषित:

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

N.B. :

यह कोड System.Drawing.Design.ColorEditor से परावर्तक के माध्यम से लिया गया है।

+0

नोड: 'GetConstants' (मूल रूप से) रंगीन पिकर में 'पृष्ठभूमि रंग', आदि के लिए उपयोग किया जाता है .. गुण – digEmAll

+0

उत्तर के लिए धन्यवाद। तथ्य यह है कि दोनों समाधान स्ट्रिंग नाम के अनुसार क्रमबद्ध रंगों को वापस करते हैं। मैं विजुअल स्टूडियो टैब में रंगों को क्रमबद्ध करना चाहता हूं, जहां लाल रंग के रंग क्लस्टरर्ड ईसीसी हैं .... – Klaus78

+0

@ क्लाउस 78: मेरा संपादन जांचें;) – digEmAll

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

संपादित करें:

आदेश करने के लिए रंग संलग्न:

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

अन्य उत्तर से अधिक संक्षिप्त । –

0

आप आप प्रारंभिक बिंदु के रूप में उपयोग कर सकता है यह इसका प्राथमिक रंग के अनुसार क्रमबद्ध की जरूरत है:

var colors = Enum.GetValues(typeof(KnownColor)) 
       .Cast<KnownColor>() 
       .Select(kc => Color.FromKnownColor(kc)) 
       .OrderBy(c => c.GetHue()) 
संबंधित मुद्दे