Добавить параметры цвета в System.Drawings.Color

В визуальной студии при создании элементов управления в разметке (или в кодировке) вы можете указать цвета в формате HEX следующим образом: "#FFFFFF", но вы также можете выбрать из списка предустановленных цветов, таких как: Белый, Пшеница, Окно и т.д. (См. Снимок экрана).
Можно ли расширить этот список и добавить дополнительные цвета?
enter image description here

Ответ 1

Этот список основан на System.Drawing.KnownColor значениях перечисления. Поскольку enums не может быть расширен, и вы не можете наследовать из другого перечисления, если вы хотите создать список с более именованным именем цвета для использования в вашем собственном коде, вы должны реализовать свой собственный enum с этими значениями, добавленными вручную и с дополнительными, которые вы хотите увидеть там.

И, конечно же, наряду с System.Drawing.KnownColor enum существует метод в Color struct, который используется для получения значения этого именованного цвета - Color.FromKnownColor. Я думаю, вы также должны добавить метод расширения к Color struct, который будет делать то же самое для вашего собственного перечисления, поскольку метод FromKnownColor делает для KnownColor enum. Возможно, вы даже можете использовать метод FromKnownColor в своем собственном методе расширения, чтобы упростить цвета, которые уже существуют в этом стандартном перечислении.

Но если единственное, что вы хотите сделать, - это расширить этот список в дизайнере ASP.NET, вы не сможете сделать это с изменениями в своем собственном проекте или путем изменения параметров в VS. Возможно, вы можете написать надстройку для Visual Studio для этого, но это единственный способ, который я вижу, если это то, что вы хотели сделать.

EDIT. Если наследование элемента управления является для вас вариантом, возможно, лучший ответ, который вы можете получить, - это тот, который предлагается simplecoder, как описанный в его ответе - создание собственного элемента управления на основе старого с новыми значениями enum, привязанными к свойству, для которого вы хотите использовать новые цвета.

Ответ 2

Как отметил @Sayse, вы не можете создать свойство расширения: почему? Читайте это: Блог MSDN один из способов сделать - это создать метод расширения и использовать его. который @Sayse указал @Konrad указал на проблему с KnownColor Enum

Итак, вот решение с небольшим завихрением.

Наследуя класс управления, я уверен, что это должно сработать. Это связано с небольшой работой, но как только вы ее повесьте, это очень прямо.

  • Класс Inherit Control, например MyCustomButton наследует System.web.UI.WebControls.Button
  • Создайте новое свойство BackColor2, которое потребляет в качестве нового перечисления MyColor
  • Переопределить свойство BackColor, BackColor определяется в родительском классе Button, который является  System.Web.Ui.WebControls.WebControl

  • Сделать свойство BackColor Set частным и связать его с BackColor 2

если вам нужен существующий цвет, а затем скопируйте их новое перечисление. с использованием отражателя

enter image description here

enter image description here

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Drawing;
using System.ComponentModel;

namespace ClassLibrary1
{
    public class MyButton : System.Web.UI.WebControls.Button
    {

        [DefaultValue(typeof(Color), "")]
        public virtual Color BackColor
        {
            get
            {
                if (!this.ControlStyleCreated)
                    return Color.Empty;
                else
                    return this.ControlStyle.BackColor;
            }
            private set
            {
               // this.ControlStyle.BackColor = value;  , OVerride it with your  MyColor
                this.ControlStyle.BackColor =YourMethodConvertMyColorToColor(this.BackColor2);
            }
        }

        private Color YourMethodConvertMyColorToColor(MyColor c){
            //your implementation 
            if (c == MyColor.MyColorGreen)
            {
                return ColorTranslator.FromHtml("#FF0000"); ; //just example
            }

            return Color.Green;//default
        }

        MyColor _mycolor;  //Global Value

        [DefaultValue(typeof(MyColor), "")]
        public  MyColor BackColor2
        {
            get
            {
                return _mycolor;
            }
            set
            {
                this._mycolor = value;
            }
        }
    }

    public enum MyColor
    {
       MyColorGreen=1,
       MyColorBlue=2
    }
}

Изменить: System.Drawing.Color - это структура, поэтому ее нельзя унаследовать. Это шоу-стоппер. Вот почему я думал, что управление наследованием - это только решение

Также я попытался добавить метод расширения вроде этого, и это не сработало для меня. В дизайнере я не вижу myColor

public static class MyExtensions
    {
        public static System.Drawing.Color MyColor(this System.Drawing.Color c)
        {
            return Color.AliceBlue;  // could be your color
        }
    }  

Ответ 3

Непосредственно, поскольку вы не можете создавать свойства расширения.

Одним из решений является создание метода расширения

    public static Color MyNewColor(this Color str)
    {
        return Color.FromArgb(255, 255, 255, 255);
    }

Это можно затем вызвать из (new Color()).MyNewColor()

настолько немного отличается и, вероятно, менее эффективен, так как он создает два цвета вместо одного, как существующие свойства, но достигнет того, что вы ищете.

Ответ 4

Вам нужно написать свой собственный элемент управления и добавить поддержку времени разработки для Visual Studio. Это может позволить вам использовать его непосредственно из VS Toolbox. Для быстрого решения рассмотрите определение цвета кода, использующего этот код:

using System.Drawing;

this.myButton.BackColor = ColorTranslator.FromHtml("#FF0000");

Ответ 5

вы можете создать свой собственный выпадающий список, содержащий все цвета из уже доступного списка.

    Dim colorList as new DropDownList()
    Dim colorArray As String() = System.Enum.GetNames(GetType(KnownColor))
    colorList.DataSource = colorArray 
    colorList.DataBind()

теперь вы можете добавить свои собственные цвета вручную в список.

    colorList.Items.Add(newcolor.ToString)

чтобы использовать его внутри Visual Studio IDE, вы должны создать свою собственную надстройку Visual Studio.

Ответ 6

Вы действительно не можете редактировать этот список, предоставленный .NET Framework, чтобы добавить дополнительные цвета по вашему выбору. Причины вполне очевидны, как указано в вышеупомянутой статье @Konrad Gadzina. Вы можете выбрать альтернативный способ, предложенный @simplecoder.

Но я бы скорее сказал, используя функцию Pick Color, чтобы захватить ваш цвет по вашему выбору, а пройти весь этот трудный путь.