2012-09-04 109 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

相關問題