向System.Drawings.Color添加颜色选项

时间:2013-04-24 21:11:45

标签: c# asp.net visual-studio-2012 system.drawing asp.net-4.5

在visual studio中,当在标记中创建控件时(或在代码隐藏中),您可以指定HEX格式的颜色,如:“#FFFFFF”,但您也可以从预设颜色列表中进行选择,如:White,小麦,窗户等(见截图) 是否可以扩展该列表并添加其他颜色? enter image description here

6 个答案:

答案 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类,我很肯定这应该有效。这涉及很少的工作,但是一旦你掌握它,它就会很直接。

  1. 继承Control类,例如MyCustomButton继承System.web.UI.WebControls.Button
  2. 创建一个新的属性BackColor2,它使用MyColor的新枚举
  3. 覆盖BackColor属性,BackColor在Button的Parent类中定义,它是
     System.Web.Ui.WebControls.WebControl

  4. 将BackColor Set属性设为Private并将其链接到BackColor 2

  5. 如果您需要现有颜色,请将它们复制到新的枚举中。使用反射器

    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
            }
        }  
    

答案 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功能来抓住你选择的颜色而不是经历所有这些困难的方式。