2017-05-30 114 views
1

我目前在WinForms中使用C#在Visual Studio 2015中創建一個項目;我用「工具箱項目」這個詞來指代dateTimePickers,文本框,標籤等。它是一個非常大的項目,如果我能夠拖放這些對象並且它們已經具有格式,它將爲我節省大量時間;例如datetimePicker自定義格式,文本框對齊等。如何更改ToolBox項目的默認屬性?

問題是我需要自定義這些對象的一些屬性。到目前爲止,我有這段代碼可以讓我更改一些可覆蓋的屬性。

public partial class MoneyBox : TextBox 
{ 
    public override Color BackColor 
    { 
     get { return Color.Azure;} 
     set { base.BackColor = value; } 
    } 
} 

但是對於其他屬性,我不能這樣做。此外,我不能從已經格式化的對象繼承,因爲此對象尚未初始化,並且在繼承時我得到空值。我還試圖定製初始化組件和對象的繪製事件,但由於某些原因,更改不會顯示在對象上。

public partial class DateTimePick : DateTimePicker 
{ 
    public void InitializeComponent() 
    { 
     InitializeComponent(); 
     this.Format = DateTimePickerFormat.Custom; 
     this.CustomFormat = "dd/MM/yyyy"; 
    } 
} 

任何想法?

在此先感謝!

+0

複製和粘貼工具箱項目應保留設置的屬性。 – Tod

+0

它只是不需要屬性被覆蓋。使用'new'關鍵字重新定義屬性的效果也非常好,設計師沒有問題。反射允許它總是找到正確的。當然,你可以隨時添加你自己的。 InitializeComponent()通常只有在Form或UserControl是基類時纔有意義。 –

+0

@HansPassant並沒有真正展現你的意思。 –

回答

1

構造函數是初始化控件屬性的合適位置。對於大多數屬性,當你把它放到設計表面初始化使用自定義值控制,它足以在構造函數中設置新的值,例如:

public class MyDateTimePicker : DateTimePicker 
{ 
    public MyDateTimePicker() 
    { 
     this.Format = DateTimePickerFormat.Custom; 
     this.CustomFormat = "dd/MM/yyyy"; 
    } 
} 

在某些情況下,例如用於Text屬性,當你在設計圖面上放置控件的實例,該屬性設置爲InitializeNewComponent方法的控件Designer

0

這可能不是你正在尋找的東西,我確定有更好的方法來做這件事,但這是我對默認控件屬性的解決方案。它會創建表單中的所有控件(及其子控件)的列表,並更改初始化時的屬性。

public static void ChangeDefaultProperties(Control C)  
    { 
     var ControlQueue = new Queue<Control>(); 
     ControlQueue.Enqueue(C); 
     while (ControlQueue.Count > 0) 
     { 
      Control Current = ControlQueue.Dequeue(); 

      DefaultPropertiesOverride(Current); 
      foreach (Control c in Current.Controls) 
      { 
       ControlQueue.Enqueue(c); 
      } 
     } 
    } 

    public static void DefaultPropertiesOverride(Control C) 
    { 
     if(C is DateTimePicker) 
     { 
      ((DateTimePicker)C).Format = DateTimePickerFormat.Custom; 
      ((DateTimePicker)C).CustomFormat = "dd/MM/yyyy"; 
     } 
     if(C is TextBox) 
     { 
      ((TextBox)C).BackColor = Color.Azure; 
     } 
    } 

然後,只需調用ChangeDefaultProperties(this);在主窗體中初始化