1

我使用以下小类创建了一个自定义按钮以在我的 WinForms 应用程序中使用

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

我只是想让我的应用程序可定制,这样我只需要在一个地方更改按钮颜色(以及其他控件),并且该更改会反映在整个应用程序中。

使用上述代码创建自定义按钮后,我着手将所有标准 System.Windows.Forms.Buttons() 替换为 MyNamespace.MyButton()。然而,虽然新按钮在屏幕上都出现了变化,但其他控件(如文本框(我没有修改))根本不会在屏幕上呈现。但是,如果我在我的应用程序中单击并拖动一个窗口,那么所有丢失的控件都会突然出现。

我不知道是什么原因造成的。谁能给我建议。

4

1 回答 1

3

您不应该在绘制事件中“设置”背景色属性,这会导致屏幕不断刷新。

一种选择是尝试在构造函数中设置属性:

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 回答