2014-02-11 40 views
4

我正在創建一個黑色背景的自定義控件,但與設計者有一些問題。真相被告知我有一個基本控制類繼承UserControl,然後一些子類代表我將在我的GUI中使用的最終控件。在該基類中,我重寫BackColor屬性,添加DefaultValue屬性並在構造函數中將默認值設置爲BackColor。作爲一個例子我的代碼看起來是這樣的:在usercontrol中更改默認背景的問題

public partial class MyControl1 : UserControl 
{ 
    public MyControl1() 
    { 
     InitializeComponent(); 
     BackColor = Color.Black;    
    } 

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

...

public partial class MyControl2 : MyControl1 
{ 
    public MyControl2() 
    { 
     InitializeComponent(); 
    } 
} 

的事情是我每次打開設計時間MyControl2BackColor對話框恢復到System.Drawing.SystemColors.Control和我的控件的屬性被塗成灰色。如果我調用BackColor上的重置,它會正確返回到Color.Black。此外,設計者不會將更改序列化到System.Drawing.SystemColors.Control,直到對控件進行其他更改。

那麼,我嘗試了什麼?

  • 我想作爲一個環境屬性,所以我嘗試添加屬性AmbientValue(false)它可能與BackColor。當然,它不起作用。

  • 我試着擦除重寫的屬性,在構造函數中只留下了BackColor=Color.Black。令人驚訝的是,它解決了設計師的問題,但現在重置該屬性將其恢復爲默認值System.Drawing.SystemColors.Control。重寫ResetBackColor()並未解決最後一個問題。

順便說一句,我在Visual Studio 2010下工作,我的項目是作爲.NET 2.0 Windows窗體應用程序創建的。

我很高興是否有人能幫我找到我的代碼中有什麼問題。這不會阻止我完成這個項目,但這非常煩人。非常感謝您提前!

+0

只存在於設計師的問題? I.E.當你使用你的控件運行一個應用程序時,它是否像預期的那樣工作? – Sacrilege

+0

是的,它的行爲正確,直到設計師序列化到BackColor的變化,只有在對控件的其他屬性進行更改後纔會發生變化。這就是爲什麼它如此煩人的原因之一 – Anarion

回答

1

可能幫助 - 似乎是在設計師的WinForms一些巫術(有點像XML序列化),將尋找其被命名爲一種特定的方式屬性,因爲正如你所預料的默認值不起作用:

以下是來自另一篇文章的示例,我知道您不是繼承DataGridView的子類,但原理應該是相同的。

public class MyGridView : DataGridView { 
    public MyGridView() { 
     this.BackgroundColor = DefaultBackgroundColor; 
    } 
    public new Color BackgroundColor { 
     get { return base.BackgroundColor; } 
     set { base.BackgroundColor = value; } 
    } 
    private bool ShouldSerializeBackgroundColor() { 
     return !this.BackgroundColor.Equals(DefaultBackgroundColor); 
    } 
    private void ResetBackgroundColor() { 
     this.BackgroundColor = DefaultBackgroundColor; 
    } 
    private static Color DefaultBackgroundColor { 
     get { return Color.Red; } 
    } 
} 

順便說一句 - 這不是我的代碼 - 它是從漢斯帕桑特一些更純粹的天才...鏈接到原始一個完整的解釋:https://stackoverflow.com/a/20838280/685341

+0

感謝您的回覆。這似乎是控制序列化的最完整的方式,它不應該是必要的,但如果事情的行爲像他們應該沒有任何問題開始。我稍後會嘗試它作爲解決方法,並告訴您它是否有幫助 – Anarion

+0

我嘗試了代碼,因爲它不起作用。我會深入研究你在文章中提到的文章,並測試一些變體。我很抱歉,需要我很長時間才能回答,但我偶然發現了一些優先級更高的其他問題...... – Anarion