В визуальной студии при создании элементов управления в разметке (или в кодировке) вы можете указать цвета в формате HEX следующим образом: "#FFFFFF", но вы также можете выбрать из списка предустановленных цветов, таких как: Белый, Пшеница, Окно и т.д. (См. Снимок экрана).
Можно ли расширить этот список и добавить дополнительные цвета?
Добавить параметры цвета в System.Drawings.Color
Ответ 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
если вам нужен существующий цвет, а затем скопируйте их новое перечисление. с использованием отражателя
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, чтобы захватить ваш цвет по вашему выбору, а пройти весь этот трудный путь.