none
Iterrieren über alle Standardcolors? RRS feed

  • Frage

  • Hi, ich möchte über alle Standardfarben der Klasse Color iterrieren und deren Namen und RGB's ausgeben. Danke Michael
    Freitag, 1. Juli 2011 12:48

Antworten

  • Hi Mimuel,

     

    es geht mit Reflection :

     

    foreach (PropertyInfo prop in typeof(SystemColors).GetProperties(BindingFlags.Static | BindingFlags.Public))
       {
        Color c = (Color)prop.GetValue(null, null);
        
       }
    

    Um das ganze zu nutzen, musst du noch

    System.Reflection referenzieren.

    using System.Reflection;



    Grüße

    Pawel


    • Als Antwort markiert mimuel Montag, 4. Juli 2011 08:20
    Freitag, 1. Juli 2011 13:40

Alle Antworten

  • Hi Mimuel,

     

    es geht mit Reflection :

     

    foreach (PropertyInfo prop in typeof(SystemColors).GetProperties(BindingFlags.Static | BindingFlags.Public))
       {
        Color c = (Color)prop.GetValue(null, null);
        
       }
    

    Um das ganze zu nutzen, musst du noch

    System.Reflection referenzieren.

    using System.Reflection;



    Grüße

    Pawel


    • Als Antwort markiert mimuel Montag, 4. Juli 2011 08:20
    Freitag, 1. Juli 2011 13:40
  • Hallo,

    das einfachste ohne Reflection und Co. sind die Standard-Werte des ColorConverters:

       var colorConverter = new ColorConverter();
       var standarColors = colorConverter.GetStandardValues(null);
       foreach (Color color in standarColors)
        Console.WriteLine("{0} => {1:X}", color.Name, color.ToArgb());
    
    

    was Color und SystemColors liefert.

    Alternativ kann man auch über die Werte KnownColor-Enumeration iterieren:

          var knownColors = Enum.GetValues(typeof(KnownColor));
          foreach (KnownColor knownColor in knownColors)
          {
            var color = Color.FromKnownColor(knownColor);
            Console.WriteLine("{0} => {1:X}", color.Name, color.ToArgb());
          }
    

    Gruß Elmar


    • Bearbeitet Elmar BoyeEditor Freitag, 1. Juli 2011 18:01 weniger umständliches KnownColor Beispiel
    Freitag, 1. Juli 2011 13:52
    Beantworter
  • Hallo M.,
    • ... über alle Standardfarben der Klasse Color iterrieren und deren Namen und RGB's ausgeben
    es kommt etwas darauf an, was die "Standard" - Farben für Dich sind.
    Die Systemfarben (SystemColors) sind beispielsweise keine eigenen Farben (etwa SystemColors.Control), sondern können ja geändert werden. Deswegen möchte man bei solchen Listen oft gern die System-Farben aus der Liste heraus haben. Hier eine mögliche Variante:
     private List<string> FarbInfos()
     {
      List<string> farbInfos = new List<string>();
      foreach( KnownColor color in Enum.GetValues(typeof(KnownColor)))
      {
      var farbe = Color.FromKnownColor(color);
      if (!farbe.IsSystemColor) 
       farbInfos.Add(farbe.Name + ", " + farbe.ToArgb().ToString("X")); 
      }
      return farbInfos;
     }
    

    Hier eine Variante (neben anderen) über GetNames von KnownColors (ginge auch kürzer, aber bewusst so) :
     private List<string> FarbInfos()
     {
      List<string> farben = new List<string>();
      string[] farbNamen = Enum.GetNames(typeof(KnownColor));
      foreach (string farbName in farbNamen)
      {
      KnownColor knownColor = (KnownColor)Enum.Parse(typeof(KnownColor), farbName);
      Color farbe = Color.FromKnownColor(knownColor); 
      if (!farbe.IsSystemColor)
       farben.Add(farbe.Name + ", " + farbe.ToArgb().ToString("X"));
      }
      return farben;
     }
    

    Genauso ähnlich geht auch ColorConverter.GetStandardValues gut, was im Prinzip die gleiche Anzahl (allerdings zusätzlich die Systemfarben, was ggf. nicht gewünscht ist). In meinem Beispiel kannst Du noch ggf. mit IsSystemColor o.ä. eingrenzen, je nachdem, was Du möchtest (vielleicht die transparente Farbe etwa nicht). Man kann auch sehr einfach Enum.GetValues(typeof(KnownColor)) benutzen. Wenn man aber direkt Strings haben möchte, ist eher:
     string[] farben = Enum.GetNames(typeof(KnownColor));
    

    einfacher und geeigneter.
    Es gibt auch noch andere Möglichkeiten. Wichtig ist, dass man auch ggf. IsSystemColor berücksichtigt, bzw. die transparente Farbe ggf. weglässt, was gern (z.T. der Kürze halber) vergessen wird und was überhaupt letztlich Standard-Farben für einen sind. Schliesslich gäbe es mehrere Deutungen:
    [C# Liste mit Color-Werten ColorTranslator.FromHtml, System.Windows.Media, and GetStandardValues.]
    http://www.eggheadcafe.com/microsoft/Csharp/35772513/liste-mit-colorwerten.aspx

     
    ciao Frank
    Freitag, 1. Juli 2011 16:32