Cześć, jak ustawić R G B
wartoś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ć Color
obiekt, przypisując R G B
wartości niestandardowe
c#
.net
colors
immutability
system.drawing.color
Sudantha
źródło
źródło
Odpowiedzi:
Możesz stworzyć kolor używając statycznej metody FromArgb :
Color redColor = Color.FromArgb(255, 0, 0);
Możesz również określić alfa, używając następującego przeciążenia .
źródło
Color
Struktura 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ć
FromArgb
metody :Color myColor = Color.FromArgb(100, 150, 75);
źródło
Aby utworzyć nową strukturę kolorów, należy użyć metody Color.FromArgb
var newColor = Color.FromArgb(0xCC,0xBB,0xAA);
źródło
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);
źródło
yourColor = Color.FromArgb(yourColor.A,yourColor.R,100,yourColor.B);
cały czas pisać . Jest to więc przydatneG
, 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 prostaArgbColor
struktura z czterema ujawnionymi polami jednobajtowymi iColor
klasą, do którejvar temp = myColor.AsArgb(); temp.Green=100; myColor = temp;
byłaby niejawnie konwertowana, to wyjaśniłoby, że gdyby np.myColor
był nazwany lub systemowy kolor ...AsArgb
metodę, ale wszelkie cechy inne niż te,Green
któ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 przypadkuColor
zdefiniowanego i może być najlepszym sposobem robienia rzeczy.Mógłbyś:
Color c = Color.FromArgb(red, green, blue); //red, green and blue are integer variables containing red, green and blue components
źródło
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()); } }
źródło