1

次の小さなクラスを使用して、WinFormsアプリケーションで使用するカスタムボタンを作成しました

public class MyButton : Button
{
    protected override void OnPaint(PaintEventArgs e)
    {
        this.BackColor = Color.ForestGreen;
        base.OnPaint(e);
    }
}

私は単にアプリケーションをカスタマイズ可能にして、ボタンの色(そしてやがては他のコントロール)を1か所で変更するだけでよく、その変更がアプリケーション全体に反映されるようにしたいと考えています。

上記のコードを使用してカスタムボタンを作成した後、すべての標準のSystem.Windows.Forms.Buttons()をMyNamespace.MyButton()に置き換えることにしました。ただし、新しいボタンはすべて画面上で変更されて表示されますが、テキストボックス(私は変更していません)などの他のコントロールは、画面上にまったくレンダリングされません。ただし、アプリケーションでウィンドウをクリックしてドラッグすると、欠落しているすべてのコントロールが突然表示されます。

何が原因なのかわかりません。誰かアドバイスしてもらえますか?

4

1 に答える 1

3

ペイントイベントでbackcolorプロパティを「設定」しないでください。これにより、画面が常に更新される可能性があります。

1つのオプションは、代わりにコンストラクターでプロパティを設定してみることです。

public class MyButton : Button
{
  public MyButton() {
    this.BackColor = Color.ForestGreen;
  }
}

コントロールのシリアル化されたBackColorプロパティを無視するために、ボタンクラスを次のように変更してみてください。

public class MyButton : Button {
  private Color myColor = Color.ForestGreen;

  public MyButton() {
    base.BackColor = myColor;
  }

  [DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
  public new Color BackColor {
    get { return myColor; }
    set { // do nothing 
    }
  }

}

このボタンコントロールは、デザイナのBackColorプロパティを効果的に無視します。すべてのボタンの色を変更したい場合は、コードでmyColor値を変更して再構築するだけです。

于 2012-09-04T15:26:16.090 に答える