设置System.Drawing.Color值


80

您好如何在中设置R G BSystem.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

Answers:



12

Color结构是不可变的(就像所有结构一样),这意味着一旦创建了特定实例,就不能更改其属性的值。

相反,您需要使用所需的属性值创建结构的实例。由于要使用其分量RGB值创建颜色,因此需要使用FromArgb方法

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

2
-1表示“所有结构都应如此”。祝您编写一些C代码好运。
Dariusz 2013年

12
@Dariusz我在这个问题上没有看到[c]标签。我一直都在写C代码,只是写的方式和我的C#代码不同……
Cody Gray


4

您可以扩展以仅更改一种颜色分量

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
首先,您需要了解不变性。如果您一直写代码,代码将变得更难看yourColor = Color.FromArgb(yourColor.A,yourColor.R,100,yourColor.B);。所以很有用
Stecya

1
很难理解您认为关于显式代码的丑陋之处。
科迪·格雷

1
@CodyGray:编写所有内容的一个主要问题是,代码的意图和/或效果G是否仅仅是改变,或者它是否还会产生其他效果,在视觉上几乎是不明显的。考虑到Color结构的设计,我认为没有解决此问题的好方法。如果有一个ArgbColor具有四个暴露的单字节字段的简单结构,以及一个Color可以隐式转换为该类的类,var temp = myColor.AsArgb(); temp.Green=100; myColor = temp;则应明确指出,例如,如果它myColor已被命名为系统颜色...
supercat

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());
        }
    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.