2013-04-24 82 views
11

在visual studio中,在標記(或代碼隱藏)中創建控件時,可以用十六進制格式指定顏色,如下所示:「#FFFFFF」,但您也可以從預設顏色列表如:白色,小麥,窗口等(請參見截圖)。
是否可以擴展該列表並添加其他顏色?
enter image description here將顏色選項添加到System.Drawings.Color

+0

這可能來自SystemColor類,因此沒有簡單的方法來擴展列表。 – 2013-04-26 22:49:31

+0

@WiktorZychla System COlor is structure not class - http://msdn.microsoft.com/en-us/library/system.drawing.color.aspx – dekdev 2013-05-03 11:31:08

+0

@WiktorZychla System.Drawing.Color是Structure並且不能繼承 – dekdev 2013-05-03 11:40:22

回答

3

不直接,因爲你不能創建擴展屬性。

一種解決方案是使一個擴展方法

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

這可以然後從 (new Color()).MyNewColor()

所以稍有不同,可能是因爲它正在創建兩種顏色,而不是一個如現有的效率不高調用屬性,但會實現你正在尋找..

+0

注意:我不熟悉asp.net,所以不知道這是如何適用,但問題被標記爲c# – Sayse 2013-04-24 21:26:40

+0

當你試試這個?在設計師中你看到了MyNewColor? – dekdev 2013-05-03 12:14:38

+0

當我嘗試它時,它出現在顏色的方法列表中,但不在asp.net應用程序中 – Sayse 2013-05-03 12:39:40

16

此列表基於System.Drawing.KnownColor枚舉值。作爲枚舉cannot be extended和你cannot inherit from another enum,如果你想創建列表中使用更多的命名顏色在你自己的代碼中使用,你必須實現自己的枚舉與手動添加這些值,並與你希望在那裏看到更多的值。

而且,當然,還有System.Drawing.KnownColor enum在Color結構中有一個方法用於獲取此已命名顏色的值 - Color.FromKnownColor。我認爲你還應該將擴展方法添加到Color結構中,它將爲你自己的枚舉做相同的處理,因爲FromKnownColor方法對於KnownColor枚舉。也許你甚至可以在你自己的擴展方法中使用FromKnownColor方法來簡化這個標準枚舉中已經存在的顏色。

但是,如果您想要做的唯一事情就是在ASP.NET設計器中擴展這一個列表,那麼您無法在您自己的項目中進行任何更改或通過更改VS中的選項來執行此操作。也許你可以在Visual Studio中編寫一個插件來完成這個任務,但這是我看到的唯一方法,如果這是你想要做的。

編輯:如果繼承的控制是一個選擇,也許是最好的答案,你可以得到的是一個由建議simplecoder,作爲described in his answer - 基於舊與新枚舉創建自己的控制綁定到您想要使用新顏色的屬性的值。

+0

PERFECT answer +1! (你應該得到賞金) – 2013-05-02 01:46:40

+0

感謝您的回答。你能提供一個可以用來獲取顏色的擴展方法的例子嗎? – RAS 2013-05-02 23:17:13

+0

我猜你不能在enum上寫擴展方法嗎?即使你添加了擴展方法,Button/Control類將無法在視覺設計器中引用它,所以它不可能顯示 - MyColor – dekdev 2013-05-03 03:44:38

3

您需要編寫自己的控件併爲Visual Studio添加設計時支持。這可以讓你直接從VS工具箱使用它。爲了快速的解決方案考慮定義的顏色代碼後面使用此代碼:

using System.Drawing; 

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

由於@Sayse指出,你不能創建擴展屬性:爲什麼呢?閱讀:MSDN Blog 一種做法是創建Extesion方法並使用它。 @Sayse指出 @Konrad用KnownColor Enum指出了這個問題

所以這裏有一個小小的扭曲的解決方案。

通過繼承控制類,我認爲這應該工作。這隻涉及很少的工作,但一旦你掌握了它,它就非常簡單。

  1. 繼承Control類如MyCustomButton繼承System.web.UI.WebControls.Button
  2. 創建一個新的屬性BackColor2,消耗的MyColor的新枚舉
  3. 覆蓋的背景色屬性,背景色被定義父類巴頓是
    System.Web.Ui.WebControls.WebControl

  4. 做背景色設置屬性爲私人並將其鏈接到背景色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 
     } 
    } 
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) 

ofcourse使用它,你必須創建自己的Visual Studio插件在Visual Studio IDE中。

+0

它是Visual Studio加載項而不是組件設計器類? – dekdev 2013-05-03 12:19:54

0

您確實無法編輯.Net Framework提供的此列表以添加您選擇的其他顏色。原因很明顯,正如@Konrad Gadzina在上面的文章中總結的。您可以按照@simplecoder的建議選擇替代方式。

但我寧願說,使用選擇顏色功能來抓住你的選擇顏色,而不是經歷所有這些困難的方式。