2009-10-01 11 views
5

私はWinFormsアプリケーションを構築しており、ほとんどのコントロールで特定の色を使用しています。私は時々WinFormsデザイナーから、時には自分のコードに直接行うことがあります。どのように私はWinFormアプリケーションでアプリケーション全体のカラーコードを実装していますか?

私はどこかのように見える静的クラスを得た:

public static class MyColors 
    { 
     public static Color DarkGreen = Color.FromArgb(0, 70, 62); 
     ... 
     public static Color Orange = Color.FromArgb(239, 132, 16); 

    } 

私は非常に簡単に私のコードでこれらの色を使用することができますが、それはこのエラーを発生させ、デザイナーから行うことは不可能です:

MyColors.DarkGreenは、有効な値ではありません。

(私はそれらの色ののInt32表現を保存しようとしたが、これは、同じエラーで失敗)

私が今使っているソリューションは、デザイナーのRGBカラーコードを使用することですMyColorsクラスの値が自分のコードに含まれていて、Visual Studioのすべての機能を置き換えるという変更を行っています。これはすてきな解決策ではありませんが、私はこれまでより良いアイデアを見つけることができませんでした。

アイデア?


注:私はおよそthis questionを知って、私は「KnownColors」を変更を見ていないよと、鉱山からわずかに異なっています。

答えて

2

追加のカラー定義をデザイナーがサポートするには、Colorエディタを拡張または置き換える独自のエディタを作成する必要があります。これらを定義したら、影響を受けるプロパティにEditor属性を適用して、エディタを使用するプロパティをデザイナに指示する必要があります。

また、TypeConverterTypeConverterAttributeと同様のことを行うことで、ある程度の成功を収めることができます。

+0

@Jeff:デフォルトのwinformsコントロール(ボタン、ラベルなど)の色を更新したいので、これらのコントロールから継承しない限り、ForeColor/BackColorプロパティにEditor属性を実際に適用できません。私には少し残酷すぎるように聞こえる...または私は何かが恋しい? – Brann

+0

@Brann:フォームを実装して既に継承しています。あなたは自分のフォーム内の上書きにそれを適用する必要があります。 –

+0

もちろん、フォーム内のコントロールは、親コントロールから継承するためにColor.Emptyに設定する必要があります。そうしないと、フォームをオーバーライドする必要があります。私はデザイナーのサポートを得るための選択肢があるとは思わない、私は恐れている。 –

2

プロパティウィンドウ自体の動作を変更する必要があるため、これは可能ではないと思います。 「255,128,64」の入力は、プロパティウィンドウに、システムカラー、名前付き「ウェブ」カラー、またはRGB指定のカラーにタイプされたものを回そうとするコードが含まれているため、「blah blah blah Int32の有効な値ではありません。このように変換できないテキスト(「MyColors.DarkGreen」など)のメッセージ。

+1

独自のTypeConverterを提供することでこの動作を無効にできますが、コントロールをオーバーライドしてプロパティを追加する必要があります。 –

+0

@Jeff:私はあなたを信じていますし、StackOverflowの典型であるように、あなたがこれを行う方法を提案するために投票していない間に "あなたはこれを行うことはできません"という投票を得ています。 :) – MusiGenesis

1

おそらく、デザイナーで何もやろうとしないことです。デザイン時にすべてのフォームをデフォルトの色にしておきます。

私は自分のスキームと類似したスキームを持っていて、あらゆる種類の問題が詰まっています。ボタンはデザイナーでRGB値に設定されています。同じフォーム上の別のボタンは、(静的クラスからの)コード内に色のセットを持っていて、2つの色が少し異なりました。

色を変更したい場合は、静的なクラスを変更してすべてのフォームのをチェックする必要があります。微妙な違いは明白ではありません。

コードにすべての色を設定した場合、コントロールが見つからない場合はすぐに明らかになります。色を変更する場合は、色を変更する必要があります。

私たちがやった別の調整は、名前に記載されている使用法を持つ静的クラスにメンバーを追加することでした。例えば

:あなたはオレンジにDarkGreenから、あなたのすべてのボタンを変更したい場合は

public static class MyColors 
    { 
     public static Color DarkGreen = Color.FromArgb(0, 70, 62); 
     ... 
     public static Color Orange = Color.FromArgb(239, 132, 16); 

     public static Color ButtonBackColor = DarkGreen; 
    } 

この方法では、それだけで1行の変更です。

0

これは、あなたが探している結果を与えるはずです。おそらく除去できる括弧の数が多すぎます。

public static Color DarkGreen = Color.FromArgb(((int)(((byte)(0)))), ((int)(((byte)(70)))), ((int)(((byte)(62))))); 
1

あなたがテーマのアプローチを持ってしようとしている場合は、固定された背景色と前景色プロパティを持つすなわちラベルはコンポーネントを作成し、以下のように背後にそのコードを変更します。

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Diagnostics; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Windows.Forms; 

namespace YourNameSpace 
{ 
    public partial class NameOfStaticColoredLabel : Label 
    { 
     public NameOfStaticColoredLabel() 
     { 
      InitializeComponent(); 
     } 

     public NameOfStaticColoredLabel(IContainer container) 
     { 
      container.Add(this); 

      InitializeComponent(); 
     } 

     public override Color ForeColor 
     { 
      get 
      { 
       return Color.Black; 
      } 
      set 
      { 
       base.ForeColor = Color.Black; 
      } 
     } 

     public override Color BackColor 
     { 
      get 
      { 
       return Color.Aquamarine; 
      } 
      set 
      { 
       base.BackColor = Color.Aquamarine; 
      } 
     } 
    } 
} 

あなたがしなければならないすべてを見ることができるようにラベルコントロールの関連プロパティをオーバーライドしています。次に、このラベルをアプリケーション・フォームにドラッグ・アンド・ドロップします。その色を変更する必要があるときは、上記のクラスで行い、アプリを再構築してください。この方法では、スタティックなカラーラベルが作成され、デザイナーやコードからその色を変更することはできません。

関連する問題