System.Drawing.Color値を設定します


80

こんにちはR G B値を設定する方法System.Drawing.Color.G

System.Drawing.Color.G=255;読み取り専用であるため、これは許可されていません

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

ColorカスタムR G B値を割り当ててオブジェクトを作成する必要があります


1
この質問に来る他の人のために、この問題はSystem.Drawingにのみ影響することに注意してください。あなたがWPFを使用している場合は、詳細情報についてはSystem.Windows.Mediaを使用する必要があり、この記事を参照してください。stackoverflow.com/questions/2428930/...
HK1

回答:



12

Color構造は不変、特定のインスタンスが作成された後、そのプロパティの値を変更することができないことを意味し、(すべての構造が本当にあるべきな)。

代わりに、必要なプロパティ値を使用して構造の新しいインスタンスを作成する必要があります。コンポーネントのRGB値を使用して色を作成するため、次のFromArgb方法を使用する必要があります。

Color myColor = Color.FromArgb(100, 150, 75);

2
-1は「すべての構造が実際にあるべきであるため」です。いくつかのCコードを書いて頑張ってください。
ダリウス2013年

12
@Dariuszこの質問に[c]タグが表示されません。私は...私のC#のコードがそうであるように私はCコードのすべての時間を書き、私はちょうどそれを同じように書いていない
コーディグレー

9

新しい色構造を作成するには、Color.FromArgbメソッドを使用する必要があります

var newColor = Color.FromArgb(0xCC,0xBB,0xAA);

4

1つのカラーコンポーネントを変更するだけの拡張機能を作成できます

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

次に、これを使用できます。

  yourColor = yourColor.ChangeG(100);

4
ええ、でもこれはしないでください。これは、実際に構造の新しいインスタンスを作成しているという事実を隠し、不変性をまだ理解していない人にとっては非常に混乱します。そして、そうする人にとってはかなり役に立たない。
コーディグレイ

1
まず第一に、あなたはNEED不変性を理解すること。いつも書くとコードが醜くなりますyourColor = Color.FromArgb(yourColor.A,yourColor.R,100,yourColor.B);。だからそれは
便利

1
明示的なコードについてあなたが醜いと思うことを理解するのは難しいです。
コーディグレイ

1
@CodyGray:すべてを書き出す際の大きな問題は、コードの意図や効果が単に変更されるだけなのGか、それとも他の効果もあるのかが視覚的にほとんど明らかではないということです。Color構造体の設計を考えると、それを修正する良い方法はないと思います。ArgbColor4つの公開されたシングルバイトフィールドを持つ単純な構造体と、Colorそれが暗黙的に変換可能なクラスがあったvar temp = myColor.AsArgb(); temp.Green=100; myColor = temp;場合、たとえばmyColor名前付きまたはシステムカラーであった場合は...
supercat 2013年

1
...そのようなAsArgb特性はメソッドによって除外されますが、そのメソッドによって除外されなかった特性Greenは保持されます。実際、オープンフィールド構造タイプに変換する拡張メソッドを定義した場合、そのアプローチはColor定義されたとおりでも機能する可能性があり、物事を行うための最良の方法である可能性があります。
スーパーキャット2013年

2

あなたができること:

Color c = Color.FromArgb(red, green, blue); //red, green and blue are integer variables containing red, green and blue components

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());
        }
    }
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.