2013-04-24 9 views
11

ビジュアルスタジオでは、マークアップ(またはコードビハインド)でコントロールを作成するときに、色を "#FFFFFF"のようなHEX形式で指定できますが、白、小麦、窓などのプリセット色のリスト(スクリーンショットを参照)。
このリストを拡張して色を追加することはできますか?
enter image description hereSystem.Drawings.Colorにカラーオプションを追加する

+0

これはおそらくSystemColorクラスから来ているので、リストを簡単に拡張する方法はありません。 –

+0

@WiktorZychla System COlorは構造体クラスではありません - http://msdn.microsoft.com/en-us/library/system.drawing.color.aspx – dekdev

+0

@WiktorZychla System.Drawing.Colorは構造体であり継承できません – dekdev

答えて

3

拡張プロパティを作成することはできません。

一つの解決策は、2つの色の代わりに、既存のようなものを作成しているので、これは、次に (new Color()).MyNewColor()

から多少異なる、おそらくより少なく効率的に呼び出すことができ、拡張方法

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

を作ることですあなたが探しているものを達成するでしょう。

+0

注:私はasp.netに精通していないので、どのようにこれに当てはまるのかわからないが、質問はCにタグ付けされている# – Sayse

+0

これを試してみると?デザイナーでMyNewColorを見たことがありますか? – dekdev

+0

私はそれを試したときに色のメソッドリストに表示されましたが、asp.netアプリケーションではありませんでした – Sayse

16

このリストはSystem.Drawing.KnownColorのenum値に基づいています。列挙型cannot be extendedとあなたがcannot inherit from another enumの場合、独自のコードで使用する名前付き色でリストを作成するには、手動で追加した値と表示する追加の値で独自の列挙型を実装する必要があります。

System.Drawing.KnownColor enumには、Color構造体のメソッドがあり、この名前付きカラーの値を取得するために使用されます - Color.FromKnownColorです。私は構造体にも、FromKnownColorメソッドがKnownColor enumの場合と同じように、独自の列挙型に対して同じ処理を行うような拡張メソッドを追加する必要があると思います。そして、あなた自身の拡張メソッドでFromKnownColorメソッドを使用して、この標準列挙型に既に存在する色を単純化することもできます。

ただし、ASP.NETデザイナーでこの1つのリストを拡張するだけであれば、自分のプロジェクトの変更やVSのオプションを変更することでこれを行うことはできません。たぶん、Visual Studioにアドインを書き込んでこれを行うこともできますが、これが唯一の方法です。

EDIT:コントロールを継承することはあなたのためのオプションである場合は、多分あなたが得ることができる最高の答えはdescribed in his answerとして、 simplecoder によって提案されたものです - この新しい列挙型を持つ古いものをもとに、独自のコントロールを作成します新しい色を使用するプロパティにバインドされた値。

+0

PERFECT回答+1! (あなたは賞金を得るべきです) –

+0

あなたの答えをありがとう。あなたは色を取得するために使用できる拡張メソッドの例を提供できますか? – RAS

+0

私はenumに拡張メソッドを書くことはできないと思います?拡張メソッドを追加しても、Button/Controlクラスはビジュアルデザイナーでそれを参照することができませんので、表示することはできません - MyColor – dekdev

3

独自のコントロールを作成し、Visual Studioのデザインタイムサポートを追加する必要があります。これにより、VS Toolboxから直接使用することができます。このコードを使用してコード内の色を定義することを検討してください。

using System.Drawing; 

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

@Sayseは拡張プロパティを作成できません。なぜですか? MSDN Blog エクステンションメソッドを作成して使用する方法の1つです。 @Sayseが指摘したところ @KonradはKnownColor Enumの問題を指摘しました

ここでは少し歪んだ解決法があります。

Controlクラスを継承することによって、これはうまくいくはずです。これはほとんど仕事を必要としませんが、一度それを掛けてしまえば、それは非常に簡単です。

  1. 継承コントロールクラスなどのMyCustomButtonはSystem.web.UI.WebControls.Buttonを継承
  2. MyColorの新しい列挙型としてのBackColorプロパティは、BackColorプロパティを定義した
  3. オーバーライドを消費する新しいプロパティBackColor2を作成
    System.Web.Ui.WebControls.WebControl

  4. されるボタンの親クラスのプライベートにBackColorプロパティを設定プロパティを作成し、

  5. BackColorプロパティ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 IDEで使用するには、独自のVisual Studioアドインを作成する必要があります。

+0

コンポーネントデザイナークラスではなく、Visual Studioアドインですか? – dekdev

0

あなたは実際には、選択した色を追加するために.Net Frameworkによって提供されるこのリストを編集することはできません。その理由は、@Konrad Gadzinaの上記記事に要約されているように、非常に明白です。 @simplecoderで提案されているように、別の方法を選択することができます。

しかし、私はむしろ、ピックカラー機能を使用して、あなたの選択の色をつかむことができます。

関連する問題