Встановіть значення 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.
Dariusz

12
@Dariusz Я не бачу тегу [c] з цього питання. Я увесь час пишу код С, я просто не пишу його так само, як свій код С # ...
Коді Грей

9

Ви повинні використовувати метод Color.FromArgb, щоб створити нову структуру кольорів

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

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);весь час. Тож корисно
Стеця

1
Важко зрозуміти, що ви вважаєте потворним щодо явного коду.
Коді Грей

1
@CodyGray: Головною проблемою виписування всього є те, що навряд чи візуально очевидно, чи буде намір та / або ефект коду просто змінитися G, чи це матиме також інші ефекти. Беручи до уваги дизайн колірної структури, я не думаю, що існує хороший спосіб це виправити; якби існувала проста ArgbColorструктура з чотирма відкритими однобайтовими полями та Colorклас, до якого вона була неявно конвертована, тоді var temp = myColor.AsArgb(); temp.Green=100; myColor = temp;було б зрозуміло, що якби, наприклад myColor, був іменований або системний колір ...
supercat

1
... що будь-яка така характеристика буде відфільтрована AsArgbметодом, але збережені будь-які інші ознаки, крім тих, Greenякі не були відфільтровані цим методом. Насправді, якщо один визначив метод розширення для перетворення на тип структури відкритого поля, такий підхід може бути працездатним, навіть Colorякщо він визначений, і може бути найкращим способом зробити щось.
supercat

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());
        }
    }
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.