Legen Sie die System.Drawing.Color-Werte fest

80

Hallo, wie man R G BWerte einstellt System.Drawing.Color.G?

Das ist wie System.Drawing.Color.G=255;nicht erlaubt, weil es schreibgeschützt ist

Property or indexer 'System.Drawing.Color.G' cannot be assigned toit is read only

Ich muss nur ein ColorObjekt erstellen, indem ich benutzerdefinierte R G BWerte zuweise

Sudantha
quelle
1
Hinweis für andere, die zu dieser Frage kommen, betrifft dieses Problem nur System.Drawing. Wenn Sie WPF verwenden, sollten Sie System.Windows.Media verwenden. Weitere Informationen finden Sie in diesem Beitrag: stackoverflow.com/questions/2428930/…
HK1

Antworten:

12

Die ColorStruktur ist unveränderlich (wie es eigentlich alle Strukturen sein sollten), was bedeutet, dass die Werte ihrer Eigenschaften nicht geändert werden können, sobald diese bestimmte Instanz erstellt wurde.

Stattdessen müssen Sie eine neue Instanz der Struktur mit den gewünschten Eigenschaftswerten erstellen . Da Sie eine Farbe mit ihren Komponenten-RGB-Werten erstellen möchten, müssen Sie die folgende FromArgbMethode verwenden :

Color myColor = Color.FromArgb(100, 150, 75);
Cody Grey
quelle
2
-1 für "wie alle Strukturen wirklich sein sollten". Viel Glück beim Schreiben eines C-Codes.
Dariusz
12
@Dariusz Ich sehe kein [c] -Tag zu dieser Frage. Ich schreibe die ganze Zeit C-Code, ich schreibe ihn einfach nicht so wie meinen C # -Code ...
Cody Gray
9

Sie müssen die Color.FromArgb-Methode verwenden, um eine neue Farbstruktur zu erstellen

var newColor = Color.FromArgb(0xCC,0xBB,0xAA);
Viacheslav Smityukh
quelle
4

Sie können eine Erweiterung vornehmen, um nur eine Farbkomponente zu ändern

static class ColorExtension
{
    public static Color ChangeG(Color this color,byte g) 
    {
        return Color.FromArgb(color.A,color.R,g,color.B);
    }
}

dann können Sie dies verwenden:

  yourColor = yourColor.ChangeG(100);
Stecya
quelle
4
Ja, aber tu das nicht. Es verbirgt die Tatsache, dass Sie tatsächlich eine neue Instanz der Struktur erstellen, was für jemanden sehr verwirrend ist, der die Unveränderlichkeit noch nicht versteht. Und ziemlich nutzlos für jemanden, der es tut.
Cody Gray
1
Zunächst MÜSSEN Sie die Unveränderlichkeit verstehen. Code wird hässlicher, wenn Sie die yourColor = Color.FromArgb(yourColor.A,yourColor.R,100,yourColor.B);ganze Zeit schreiben . Also ist es nützlich
Stecya
1
Schwer zu verstehen, was Sie an explizitem Code für hässlich halten.
Cody Gray
1
@CodyGray: Ein Hauptproblem beim Ausschreiben ist, dass es visuell kaum offensichtlich ist, ob die Absicht und / oder Wirkung des Codes darin besteht, sich lediglich zu ändern G, oder ob er auch andere Auswirkungen hat. Angesichts des Designs der Farbstruktur gibt es meines Erachtens keinen guten Weg, dies zu beheben. Wenn es eine einfache ArgbColorStruktur mit vier exponierten Colorvar temp = myColor.AsArgb(); temp.Green=100; myColor = temp;myColor
Einzelbytefeldern
1
... dass solche Merkmale durch die AsArgbMethode herausgefiltert würden, andere Merkmale, Greendie nicht durch diese Methode herausgefiltert worden waren, jedoch beibehalten würden. Wenn man eine Erweiterungsmethode definiert, die in den Open-Field-Strukturtyp konvertiert werden soll, kann dieser Ansatz sogar mit Colorder definierten Methode funktionieren und der beste Weg sein, Dinge zu tun.
Supercat
2

Du könntest es tun:

Color c = Color.FromArgb(red, green, blue); //red, green and blue are integer variables containing red, green and blue components
Feuerpanda
quelle
1
using System;
using System.Drawing;
public struct MyColor
    {
        private byte a, r, g, b;        
        public byte A
        {
            get
            {
                return this.a;
            }
        }
        public byte R
        {
            get
            {
                return this.r;
            }
        }
        public byte G
        {
            get
            {
                return this.g;
            }
        }
        public byte B
        {
            get
            {
                return this.b;
            }
        }       
        public MyColor SetAlpha(byte value)
        {
            this.a = value;
            return this;
        }
        public MyColor SetRed(byte value)
        {
            this.r = value;
            return this;
        }
        public MyColor SetGreen(byte value)
        {
            this.g = value;
            return this;
        }
        public MyColor SetBlue(byte value)
        {
            this.b = value;
            return this;
        }
        public int ToArgb()
        {
            return (int)(A << 24) || (int)(R << 16) || (int)(G << 8) || (int)(B);
        }
        public override string ToString ()
        {
            return string.Format ("[MyColor: A={0}, R={1}, G={2}, B={3}]", A, R, G, B);
        }

        public static MyColor FromArgb(byte alpha, byte red, byte green, byte blue)
        {
            return new MyColor().SetAlpha(alpha).SetRed(red).SetGreen(green).SetBlue(blue);
        }
        public static MyColor FromArgb(byte red, byte green, byte blue)
        {
            return MyColor.FromArgb(255, red, green, blue);
        }
        public static MyColor FromArgb(byte alpha, MyColor baseColor)
        {
            return MyColor.FromArgb(alpha, baseColor.R, baseColor.G, baseColor.B);
        }
        public static MyColor FromArgb(int argb)
        {
            return MyColor.FromArgb(argb & 255, (argb >> 8) & 255, (argb >> 16) & 255, (argb >> 24) & 255);
        }   
        public static implicit operator Color(MyColor myColor)
        {           
            return Color.FromArgb(myColor.ToArgb());
        }
        public static implicit operator MyColor(Color color)
        {
            return MyColor.FromArgb(color.ToArgb());
        }
    }
user2991535
quelle