2010-09-29 17 views
19

voglio fare un ComboBox pieno di tutti i colori da System.Drawing.ColorC# ottenere tutti i colori da colori

Ma io non riesco a raccogliere tutti i colori da quella collezione

ho già provato ad utilizzare un foreach per fare il lavoro in questo modo:

foreach (Color clr in Color) 
    { 

    } 

Ma tutto quello che ottiene è un errore.

Quindi, come posso eseguire il ciclo su tutti i colori?

Qualsiasi aiuto sarà apprezzato.

risposta

33

Si potrebbe prendere colore da KnownColor

KnownColor[] colors = Enum.GetValues(typeof(KnownColor)); 
foreach(KnownColor knowColor in colors) 
{ 
    Color color = Color.FromKnownColor(knowColor); 
} 

o l'uso di riflessione per evitare di colore come Menu, desktop ... contengono in 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); 
} 
+0

Grazie! questo era esattamente ciò di cui avevo bisogno. Mi sarei accontentato semplicemente di tutti i colori e poi ho trovato un modo per filtrarli per evitare il menu e i colori del desktop da solo. Grazie mille! – Pieter888

3

Questo è quello che pensi desidera:

foreach (Color color in new ColorConverter().GetStandardValues()) 
{ 
    MessageBox.Show(color.ToString()); 
} 

passerà attraverso tutti i valori standard per il colore e dovrebbe funzionare per ciò che è necessario

12

Simile al codice di @ madgnome, ma preferisco quanto segue poiché non richiede l'analisi dei nomi delle stringhe (un riferimento indiretto ridondante, a mio avviso):

foreach (var colorValue in Enum.GetValues(typeof(KnownColor))) 
    Color color = Color.FromKnownColor((KnownColor)colorValue); 
+0

Manca ")" alla fine della prima riga – Butzke

+0

@Butzke grazie, risolto. –

3

Il mio modo di ottenere i colori. Penso che sia il modo migliore tramite la libreria Reflection.

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

L'esigenza era quella di avere un elenco dei colori di sistema da scegliere, un elenco dei colori "web", alias i colori professionali, e quindi RGB tramite R, G, la sintassi B, e infine il uso del controllo del selettore del colore per completezza.

Salva l'elenco di colori e le proprietà del colore del sistema da utilizzare in seguito. Il ReduceName (colore) rimuove i componenti "Colore [Nome]" dalla stringa. Se non si mantiene un elenco in esecuzione dei colori, verranno visualizzati due volte nella seconda lista. Probabilmente c'è un approccio più elegante alla gestione, ma il tempo è stato più importante che perfetto, come spesso accade.

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

System Colors

Professional Colors

Problemi correlati