2012-09-04 59 views
1

我在我的WinForms创建一个自定义按钮使用applicationusing的followng小类自定义控件防止标准控件出现在的WinForms

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

我只是希望让我的应用程序cusomizeable,这样我只需要在一个地方改变按钮颜色(以及适时的其他控制),并且该改变反映在整个应用程序中。

使用上面的代码创建自定义按钮后,我设置了使用MyNamespace.MyButton()替换所有标准System.Windows.Forms.Buttons()。但是,尽管新按钮在屏幕上全部出现,但其他控件(如我未修改过的)却完全不在屏幕上显示。但是,如果我在应用程序中单击并拖动窗口,则突然出现所有丢失的控件。

我不知道这是什么原因造成的。任何人都可以提醒我。

回答

3

您不应该在paint事件中“设置”backcolor属性,这会导致屏幕持续刷新。

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

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

为了忽略控制的序列化背景色属性,你可以尝试到您的按钮类更改为这样的事情:

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值并重新构建。

+0

完成了这一步 - 但现在颜色根本不会改变在Visual Studio的UI中设置 – PJW

+0

@PJW在构造器中设置BackColor只是设置按钮的默认颜色。它仍然由设计者序列化,所以它记住了设置的最后一个背景颜色值。从您的文章中不清楚您打算如何使用此代码。你需要解释“颜色不会改变......设置在...... UI”的意思。您尚未分享您设置的“财产”。 – LarsTech

+0

如果我在上面的代码中替换Forest Green,它没有区别。按钮的背景色仍然是青色,因为那是我最初在Visual Studio属性窗口中设置的。我正在寻找一种通过代码设置颜色的方法,这样我只需要在一个地方更改颜色就可以更改应用程序中所有按钮的背景颜色。但是,如果我必须手动通过Visual Studio的每个按钮的属性,并改变背景颜色,那么我什么都没有实现。 – PJW

相关问题