在visual studio中,当在标记中创建控件时(或在代码隐藏中),您可以指定HEX格式的颜色,如:“#FFFFFF”,但您也可以从预设颜色列表中进行选择,如:White,小麦,窗户等(见截图)
是否可以扩展该列表并添加其他颜色?
答案 0 :(得分:16)
此列表基于System.Drawing.KnownColor
枚举值。作为枚举cannot be extended和您cannot inherit from another enum,如果您想创建包含更多命名颜色的列表以在您自己的代码中使用,您必须实现自己的枚举,并手动添加这些值以及您希望添加的其他值看到那里。
当然,与System.Drawing.KnownColor
枚举一起,Color
结构中有一个方法用于获取此命名颜色的值 - Color.FromKnownColor
。我认为您还应该向Color
结构添加扩展方法,这将对您自己的枚举执行相同操作,因为FromKnownColor
方法对KnownColor
枚举执行。也许你甚至可以在你自己的扩展方法中使用FromKnownColor
方法,使其更简化已经存在于此标准枚举中的颜色。
但是,如果您要做的唯一事情是在ASP.NET设计器中扩展这一个列表,则不能对自己项目中的任何更改或通过更改VS中的选项来执行此操作。也许你可以为Visual Studio写一个加载项来做这件事,但这是我看到的唯一方法,如果这是你想要做的。
编辑:如果继承控件是您的选项,也许您可以获得的最佳答案是 simplecoder 建议的答案,如described in his answer - 使用这个新的枚举值创建您自己的控件,这个新的枚举值绑定到您想要使用新颜色的属性。
答案 1 :(得分:7)
正如@Sayse指出你无法创建扩展属性:为什么?阅读本文:MSDN Blog 一种方法是创建extesion方法并使用它。 @Sayse指出 @Konrad用KnownColor Enum指出了这个问题
所以这是一个很少扭曲的解决方案。
通过继承Control类,我很肯定这应该有效。这涉及很少的工作,但是一旦你掌握它,它就会很直接。
覆盖BackColor属性,BackColor在Button的Parent类中定义,它是
System.Web.Ui.WebControls.WebControl
将BackColor Set属性设为Private并将其链接到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
}
}
答案 2 :(得分:3)
不直接,因为您无法创建扩展属性。
一种解决方案是制作扩展方法
public static Color MyNewColor(this Color str)
{
return Color.FromArgb(255, 255, 255, 255);
}
然后可以从中调用
(new Color()).MyNewColor()
因为创建两种颜色而不是像现有属性一样,所以稍有不同,可能效率较低,但会达到您想要的效果。
答案 3 :(得分:3)
您需要编写自己的控件并为Visual Studio添加设计时支持。这可以让您直接从VS工具箱中使用它。要快速解决方案,请考虑使用此代码在代码中定义颜色:
using System.Drawing;
this.myButton.BackColor = ColorTranslator.FromHtml("#FF0000");
答案 4 :(得分:0)
您可以创建自己的下拉列表,其中包含已有列表中的所有颜色。
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加载项。
答案 5 :(得分:0)
您真的无法编辑.Net Framework提供的此列表来添加您选择的其他颜色。原因很明显,正如@Konrad Gadzina在上面的帖子中总结的那样。您可以选择@simplecoder建议的备用方式。
但我宁愿说,使用Pick Color功能来抓住你选择的颜色而不是经历所有这些困难的方式。