Đặt giá trị System.Drawing.Color


80

Xin chào, làm thế nào để đặt R G Bgiá trị trong System.Drawing.Color.G?

cái nào giống như System.Drawing.Color.G=255;không được phép vì nó chỉ đọc

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

tôi chỉ cần tạo một ColorĐối tượng bằng cách gán các R G Bgiá trị tùy chỉnh


1
Lưu ý cho những người khác đến câu hỏi này, vấn đề này chỉ ảnh hưởng đến System.Drawing. Nếu bạn đang sử dụng WPF, bạn nên sử dụng System.Windows.Media Để biết thêm thông tin, hãy xem bài đăng này: stackoverflow.com/questions/2428930/…
HK1

Câu trả lời:


141

Bạn có thể tạo màu bằng phương thức FromArgb tĩnh :

Color redColor = Color.FromArgb(255, 0, 0);

Bạn cũng có thể chỉ định alpha bằng cách sử dụng quá tải sau .


12

Các Colorcấu trúc là bất biến (như tất cả các cấu trúc thực sự nên có), có nghĩa là các giá trị của thuộc tính của nó không thể thay đổi một lần mà ví dụ cụ thể đã được tạo.

Thay vào đó, bạn cần tạo một phiên bản mới của cấu trúc với các giá trị thuộc tính mà bạn muốn. Vì bạn muốn tạo màu bằng cách sử dụng các giá trị RGB thành phần của nó, bạn cần sử dụng FromArgbphương pháp :

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

2
-1 cho "như tất cả các cấu trúc thực sự nên là". Chúc may mắn khi viết một số mã C.
Dariusz

12
@Dariusz Tôi không thấy thẻ [c] cho câu hỏi này. Tôi viết mã C mọi lúc, tôi chỉ viết nó không giống như cách tôi viết mã C # của tôi ...
Cody Grey

9

Bạn phải sử dụng phương thức Color.FromArgb để tạo cấu trúc màu mới

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

4

Bạn có thể tạo phần mở rộng để chỉ thay đổi một thành phần màu

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

thì bạn có thể sử dụng cái này:

  yourColor = yourColor.ChangeG(100);

4
Vâng, nhưng đừng làm điều này. Nó che giấu thực tế rằng bạn đang thực sự tạo một phiên bản mới của cấu trúc, rất khó hiểu đối với những người chưa hiểu về tính bất biến. Và khá vô dụng cho một người nào đó.
Cody Grey

1
Trước hết bạn CẦN hiểu tính bất biến. Mã trở nên xấu hơn nếu bạn luôn viết yourColor = Color.FromArgb(yourColor.A,yourColor.R,100,yourColor.B);. Vì vậy, nó là hữu ích
Stecya

1
Khó hiểu những gì bạn nghĩ là xấu về mã rõ ràng.
Cody Grey

1
@CodyGray: Một vấn đề lớn khi viết ra mọi thứ là khó có thể rõ ràng về mặt trực quan liệu mục đích và / hoặc tác dụng của mã sẽ chỉ đơn thuần là thay đổi Ghay nó sẽ có các hiệu ứng khác. Với thiết kế của cấu trúc Màu, tôi không nghĩ có cách nào hay để khắc phục điều đó; nếu đã có một đơn giản ArgbColorstruct với bốn lĩnh vực tiếp xúc với single-byte, và một Colorlớp mà nó đã mặc nhiên chuyển đổi, sau đó var temp = myColor.AsArgb(); temp.Green=100; myColor = temp;sẽ làm cho rõ ràng rằng nếu như myColorđã từng là một tên hoặc hệ thống màu sắc ...
supercat

1
... rằng bất kỳ đặc điểm nào như vậy sẽ được lọc ra bằng AsArgbphương pháp này, nhưng bất kỳ đặc điểm nào khác Greenchưa được lọc bằng phương pháp đó sẽ được giữ lại. Trên thực tế, nếu người ta xác định một phương thức mở rộng để chuyển đổi sang kiểu cấu trúc trường mở, thì cách tiếp cận đó có thể khả thi ngay cả với Colornhư đã định nghĩa và có thể là cách tốt nhất để thực hiện mọi việc.
supercat

2

Bạn có thể làm:

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());
        }
    }
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.