Laden...

Aus Button.BackColor den Farbnamen extrahieren und vergleichen

Erstellt von TimFranke vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.112 Views
T
TimFranke Themenstarter:in
15 Beiträge seit 2014
vor 7 Jahren
Aus Button.BackColor den Farbnamen extrahieren und vergleichen

Hallo,

in einem Array habe ich verschiedene Standard-Farbnamen stehen.

Im Code möchte ich prüfen, ob die Hintergrundfarbe eines Buttons einem Element
des o.a. Arrays entspricht.

Buttonname.BackColor liefert "Color [Yellow]" anstatt einfach "Yellow", was den direkten
Vergleich für mich schwierig macht.

Kann ich aus BackColor einfach den reinen Farbnamen extrahieren?

Gruss,
Tim

G
17 Beiträge seit 2015
vor 7 Jahren

Hi,

eigentlich sollte die Eigenschaft "Name" den Farbnamen liefern, also z.B.
ButtonXYZ.BackColor.Name

5.299 Beiträge seit 2008
vor 7 Jahren

Color ist eigenartig. Es gibt einige vordefinierte Colors, die haben einen Namen, andere nicht.
Button.Backcolor liefert auf keinen Fall "Color [Yellow]".
Weil "Color [Yellow]" ist ein String, Button.BackColor ist aber eine Color.

Colors lassen sich auch nicht gescheit untereinander vergleichen.
Etwa Color.FromRgb(0xFFFF00) und Color.Yellow sind derselbe Farbwert.
Allerdings Color.Yellow ist eine benamte Color, und Color.FromRgb(0xFFFF00) nicht.
Man sollte also immer Color.ToArgb() untereinander vergleichen.

Der frühe Apfel fängt den Wurm.

3.003 Beiträge seit 2006
vor 7 Jahren

Um herauszufinden, ob es eine benannte Farbe gibt, die die übergebenen Werte hat, reicht eine kleine Extension:

public static bool TryGetNamedColor(this Color color, out Color result)
{
    result = Enum.GetValues(typeof(KnownColor)).OfType<KnownColor>().Select(Color.FromKnownColor).FirstOrDefault(p => p.ToArgb() == color.ToArgb());
    return result != Color.Empty;
}

Anwendung:


Color result;
if(ButtonXYZ.BackColor.TryGetNamedColor(out result))
{
    FarbTextBox.Text = "Hintergrundfarbe ist " + result.Name;
}
else
{
   FarbTextBox.Text = "Die aktuelle Hintergrundfarbe hat keinen Namen.";
}

LaTino
(So schwierig sind Colors nicht. Ich würde abraten, sich auf Namen zu verlassen, wenn doch, schaue man sich das Enum KnownColors an.)

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

5.299 Beiträge seit 2008
vor 7 Jahren

naja, wenn mans weiss, ist nichts schwierig.

Aber doch eigenartig, oder?

Und auch sehr fragwürdig, ob dieses Verhalten noch dem Gesetz der kleinstmöglichen Überraschungen folgt:

dynamic col = Color.Yellow;
var col2 = Color.FromArgb(col.ToArgb());
var b = col == col2;                // False, obwohl dieselbe Farbe
var col3 = Color.FromArgb(col.ToArgb);
b = col2 == col3;	// True - ist ja auch derselbe Farbwert

Was mich noch wundert ist, dass es überhaupt benannte Farben gibt.
Weil ich fund keinerlei Mittel, ebenfalls eine benannte Farbe zu erzeugen.
Mit Mitteln der Vererbung kann diese Einschränkung ja nicht zustandegebracht worden sein, denn Color ist ja ein struct. 8o

Der frühe Apfel fängt den Wurm.

16.835 Beiträge seit 2008
vor 7 Jahren

Das hat aber weniger was mit Color, mehr mit dynamic zutun.

5.299 Beiträge seit 2008
vor 7 Jahren

Aha.

Macht mich aber iwie kein stück schlauer.
Sorry, aber auf mich machen solche (hingeworfenen) Posts keinen guten Eindruck. Sie lassen zwar erkennen, dass du etwas weißt, aber was es ist, bleibt verborgen.

Also gestatte mir noch die Frage: Was hat es mit dynamic zu tun?

Der frühe Apfel fängt den Wurm.

3.003 Beiträge seit 2006
vor 7 Jahren

Aber doch eigenartig, oder?

Ja. Nein. Vielleicht 😉.
KnownColors ist eine Enumeration. Den struct Color kann man aus einem Mitglied dieser Enumeration erzeugen. Wenn man das gemacht hat, merkt er sich, dass er aus der Enumeration erzeugt wurde, und liefert den Wert dieser Enumeration, aus der er erzeugt wurde, als Name. Wurde er nicht aus der Enumeration erzeugt, liefert er die Zeichenkettenrepräsentation seiner Farbwerte als Name.

Diese Geschichte funktioniert klaglos, wenn man sich entweder auf Farben beschränkt, die aus KnownColors erzeugt wurden, oder auf Farben, die per rgb-Angabe erzeugt wurden.

Und auch sehr fragwürdig, ob dieses Verhalten noch dem Gesetz der kleinstmöglichen Überraschungen folgt

Nein, ist es nicht.

Diese Methode vergleicht mehr als die ARGB-Werte der Color-Strukturen.Sie vergleicht auch einige Zustandsflags.Wenn Sie nur die ARGB-Werte zweier Color-Strukturen vergleichen möchten, vergleichen Sie sie mit der ToArgb-Methode.

Die kleinste Überraschung ist m.E. die, wenn man sich an seine Dokumentation hält.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

5.299 Beiträge seit 2008
vor 7 Jahren

Die kleinste Überraschung ist m.E. die, wenn man sich an seine Dokumentation hält.
Watt?

Millionen Zeilen Code sind verständlich, ganz ohne Dokumentation! Derlei Zeilen Überraschungswert würde ich aber deutlich niedriger ansetzen als diesen Fell hier.
Also "kleinste" Überraschung ist das hier sicher nicht.

Sondern es bleibt eine Eigenartigkeit, wenn auch eine dokumentierte.

Ich sag ja auch nicht, dasses iwie falsch ist, ist imo Ansichtssache, bzw. obliegt dem Programmierer, wie er mittels == - Operator-Implementation die Bedingungen definiert, wann 2 Farben gleich sind.

Und da wurde halt definiert, dass benanntes Gelb und unbenanntes Gelb verschieden seien.
/OT

Der frühe Apfel fängt den Wurm.