Ustaw wartości System.Drawing.Color

80

Cześć, jak ustawić R G Bwartości w System.Drawing.Color.G?

co jest jak System.Drawing.Color.G=255;jest niedozwolone, ponieważ jest tylko do odczytu

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

Po prostu muszę utworzyć Colorobiekt, przypisując R G Bwartości niestandardowe

Sudantha
źródło
1
Uwaga dla innych, którzy przychodzą do tego pytania, ten problem dotyczy tylko System.Drawing. Jeśli używasz WPF, powinieneś używać System.Windows.Media Aby uzyskać więcej informacji, zobacz ten post: stackoverflow.com/questions/2428930/ ...
HK1

Odpowiedzi:

12

ColorStruktura jest niezmienne (jak wszystkie konstrukcje powinny być naprawdę), co oznacza, że wartości jego właściwości nie mogą być zmieniane raz, że szczególną instancja została utworzona.

Zamiast tego musisz utworzyć nowe wystąpienie struktury z żądanymi wartościami właściwości. Ponieważ chcesz utworzyć kolor za pomocą jego składowych wartości RGB, musisz użyć FromArgbmetody :

Color myColor = Color.FromArgb(100, 150, 75);
Cody Gray
źródło
2
-1 dla „jak wszystkie struktury powinny być”. Powodzenia w pisaniu kodu w C.
Dariusz
12
@Dariusz Nie widzę tagu [c] w tym pytaniu. Piszę kod C przez cały czas, ja po prostu nie napisać to tak samo jak ja, mój kod C # ...
Cody Grey
9

Aby utworzyć nową strukturę kolorów, należy użyć metody Color.FromArgb

var newColor = Color.FromArgb(0xCC,0xBB,0xAA);
Viacheslav Smityukh
źródło
4

Możesz rozszerzyć tylko jeden składnik koloru

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

możesz użyć tego:

  yourColor = yourColor.ChangeG(100);
Stecya
źródło
4
Tak, ale nie rób tego. Ukrywa fakt, że faktycznie tworzysz nową instancję struktury, co jest bardzo mylące dla kogoś, kto jeszcze nie rozumie niezmienności. I całkiem bezużyteczne dla kogoś, kto to robi.
Cody Gray
1
Przede wszystkim MUSISZ zrozumieć niezmienność. Kod staje się brzydszy, jeśli będziesz yourColor = Color.FromArgb(yourColor.A,yourColor.R,100,yourColor.B);cały czas pisać . Jest to więc przydatne
Stecya
1
Trudno zrozumieć, co uważasz za brzydkie w jawnym kodzie.
Cody Gray
1
@CodyGray: Głównym problemem przy zapisywaniu wszystkiego jest to, że nie jest wizualnie oczywiste, czy intencją i / lub skutkiem kodu będzie zwykła zmiana G, czy też będzie to miało inne skutki. Biorąc pod uwagę projekt struktury Color, nie sądzę, aby można było to naprawić; gdyby istniała prosta ArgbColorstruktura z czterema ujawnionymi polami jednobajtowymi i Colorklasą, do której var temp = myColor.AsArgb(); temp.Green=100; myColor = temp;byłaby niejawnie konwertowana, to wyjaśniłoby, że gdyby np. myColorbył nazwany lub systemowy kolor ...
superkat
1
... że każda taka charakterystyka zostanie odfiltrowana przez AsArgbmetodę, ale wszelkie cechy inne niż te, Greenktóre nie zostały odfiltrowane tą metodą, zostaną zachowane. W rzeczywistości, gdyby zdefiniować metodę rozszerzenia w celu konwersji na typ struktury z otwartym polem, podejście to może być wykonalne nawet w przypadku Colorzdefiniowanego i może być najlepszym sposobem robienia rzeczy.
supercat
2

Mógłbyś:

Color c = Color.FromArgb(red, green, blue); //red, green and blue are integer variables containing red, green and blue components
FIre Panda
źródło
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
źródło