Je veux créer une ComboBox
avec toutes les couleurs de System.Drawing.Color
Mais je n'arrive pas à rassembler toutes les couleurs de cette collection
J'ai déjà essayé d'utiliser une foreach
pour faire le travail comme ceci:
foreach (Color clr in Color)
{
}
Mais tout ce que je reçois est une erreur.
Alors, comment puis-je parcourir toutes les couleurs?
Toute aide serait appréciée.
Vous pouvez prendre la couleur de KnownColor
KnownColor[] colors = Enum.GetValues(typeof(KnownColor));
foreach(KnownColor knowColor in colors)
{
Color color = Color.FromKnownColor(knowColor);
}
ou utilisez la réflexion pour éviter les couleurs telles que Menu , Bureau ... contenir dans 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);
}
Semblable au code de @ madgnome, mais je préfère ce qui suit car il n’exige pas l’analyse des noms de chaînes (un indirection redondant, à mon avis):
foreach (var colorValue in Enum.GetValues(typeof(KnownColor)))
Color color = Color.FromKnownColor((KnownColor)colorValue);
Ma façon d'obtenir des couleurs. Je pense que c'est la meilleure solution via la bibliothèque de réflexion.
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;
}
Voici ce que je pense que vous voulez:
foreach (Color color in new ColorConverter().GetStandardValues())
{
MessageBox.Show(color.ToString());
}
il va parcourir toutes les valeurs standard pour la couleur et devrait fonctionner pour ce dont vous avez besoin
L’exigence était d’avoir une liste des couleurs système à choisir, une liste des couleurs "Web", AKA les couleurs professionnelles, puis RVB via la syntaxe R, G, B et enfin l’utilisation du sélecteur de couleurs pour la complétude.
Je sauvegarde la liste des couleurs et les propriétés de la couleur système pour une utilisation ultérieure. Réduire le nom (couleur) supprime les composants "Couleur [Nom]" de la chaîne. Si vous ne maintenez pas une liste de couleurs courante, vous les verrez apparaître deux fois dans la deuxième liste. Il existe probablement une approche plus élégante à cet égard, mais le temps importait plus que la perfection, comme c'est souvent le cas.
_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);
}
}