2009-06-30 6 views
0

私はforeColorが常に紅色で、backColorが常にシアンであるカスタムボタンを作成しようとしています。醜い色のスキームが、私はそれを取得しようとしているので、私は個々のコントロールを個別に設定せずに一貫したカラースキームで大量のコントロールを作成することができます。ここで私はボタンをコード化された方法は次のとおりです。私は私のフォーム上にカスタムボタンを削除するとカスタムWinformsコントロール(具体的なボタン)

public partial class CustomButton : Button 
{ 
    private static Color _defaultForeColor = Color.Crimson; 
    private static Color _defaultBackColor = Color.Cyan; 

    public CustomButton() 
    { 
     InitializeComponent(); 
     base.ForeColor = _defaultForeColor; 
     base.BackColor = _defaultBackColor; 
    } 


    public AutoScaleMode AutoScaleMode { get; set; } 

    [DefaultValue(typeof(Color), "Crimson")] 
    override public Color ForeColor 
    { 
     get { return base.ForeColor; } 
     set 
     { 
      base.ForeColor = _defaultForeColor; 
     } 
    } 

    [DefaultValue(typeof(Color), "Cyan")] 
    public override Color BackColor 
    { 
     get { return base.BackColor; } 
     set 
     { 
      base.BackColor = _defaultBackColor; 
     } 
    }   
} 

、背景には、通常のボタンの色で、テキストが真っ赤です。私はアプリを実行する場合も同じです。プロパティウィンドウでフォアカラーまたはバックカラーを変更しようとすると、設定したデフォルト(クリムゾン、シアン)に戻り、アプリを実行するとそのように表示されます。デザイナーと実行時にコントロールが正しく表示されるようにするにはどうすればよいですか?

答えて

2

UseVisualStyleBackColorが自動的にtrueに設定され、それを上書きできないため、問題があります。 falseに変更すると、ボタンが正しく動作することがわかります。

一つのオプションは、このようなボタンのOnControlAddedを上書きすることです:

protected override void OnControlAdded(ControlEventArgs e) 
{ 
    base.OnControlAdded(e); 
    UseVisualStyleBackColor = false; 
} 

デザイナーで初めて、色は表示されませんが、あなたがアプリケーションを実行すると、それが正常に動作します。

0

たとえば、アプリケーションの設定(またはコントロールに固有の設定クラス)に前後の色をバインドすることをお勧めします。標準ボタンとデザイナーでバインド、または独自の子孫を使用し、コードでバインドします。この場合、一貫したカラースキームが得られ、さらに重要なことに、再コンパイルせずに変更することができます。

public class CustomButton : Button 
{ 
    public CustomButton 
    { 
     InitializeComponent(); 
     if (!DesignMode) 
     { 
      DataBindings.Add(new Binding("ForeColor", Settings.Default, "ButtonForeColor", true, DataSourceUpdateMode.Never)); 
      DataBindings.Add(new Binding("BackColor", Settings.Default, "ButtonBackColor", true, DataSourceUpdateMode.Never)); 
     } 
    } 

    // ...