在 Visual Studio 中,当在标记(或代码隐藏)中创建控件时,您可以指定 HEX 格式的颜色,如下所示:“#FFFFFF”,但您也可以从预设颜色列表中进行选择,例如:白色、小麦、窗口等(见截图)。
是否可以扩展该列表并添加其他颜色?
6 回答
此列表基于System.Drawing.KnownColor
枚举值。由于枚举无法扩展并且您不能从另一个枚举继承,因此如果您想创建具有更多命名颜色的列表以在您自己的代码中使用,您必须使用手动添加的这些值以及您希望在那里看到的其他值来实现您自己的枚举.
当然,除了System.Drawing.KnownColor
enum 之外,Color
struct 中还有一个方法用于获取这个命名颜色 - 的值Color.FromKnownColor
。我认为您还应该向 struct 添加扩展方法,Color
该方法将对您自己的枚举执行相同的操作,就像FromKnownColor
方法对KnownColor
枚举一样。也许你甚至可以FromKnownColor
在你自己的扩展方法中使用方法来简化这个标准枚举中已经存在的颜色。
但是,如果您只想在 ASP.NET 设计器中扩展这一列表,则无法通过在您自己的项目中进行任何更改或通过更改 VS 中的选项来做到这一点。也许您可以为 Visual Studio 编写一个加载项来执行此操作,但这是我看到的唯一方法,如果这是您想要做的。
编辑:如果继承控件是您的一个选项,也许您可以获得的最佳答案是simplecoder建议的答案,如他的回答中所述- 基于旧控件创建自己的控件,并将此新枚举值绑定到属性你想使用新的颜色。
正如@Sayse 指出的那样,您不能创建扩展属性:为什么?阅读:MSDN 博客 一种方法是创建扩展方法并使用它。@Sayse 指出 @Konrad 指出了 KnownColor Enum 的问题
所以这里有一个稍微扭曲的解决方案。
通过继承控制类,我很肯定这应该有效。这涉及的工作很少,但是一旦掌握了它,它就会非常简单。
- 继承 Control 类,例如 MyCustomButton 继承 System.web.UI.WebControls.Button
- 创建一个新的属性 BackColor2 ,它作为 MyColor 的新枚举使用
覆盖 BackColor 属性,BackColor 定义在 Button 的父类中,即
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
}
}
您需要编写自己的控件并为 Visual Studio 添加设计时支持。这可以让您直接从 VS Toolbox 中使用它。为了快速解决,请考虑使用以下代码在代码中定义颜色:
using System.Drawing;
this.myButton.BackColor = ColorTranslator.FromHtml("#FF0000");
不是直接的,因为您无法创建扩展属性。
一种解决方案是制作扩展方法
public static Color MyNewColor(this Color str)
{
return Color.FromArgb(255, 255, 255, 255);
}
然后可以从
(new Color()).MyNewColor()
如此略有不同并且可能效率较低,因为它创建两种颜色而不是像现有属性那样创建一种颜色,但会实现您正在寻找的东西..
您确实无法编辑 .Net Framework 提供的此列表来添加您选择的其他颜色。正如@Konrad Gadzina 在上面的帖子中总结的那样,原因很明显。您可以按照@simplecoder 的建议选择替代方式。
但我宁愿说,使用 Pick Color 功能来获取您选择的颜色,而不是通过所有这些艰难的方式。
您可以创建自己的下拉列表,其中包含现有列表中的所有颜色。
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 插件。