2017-05-30 113 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);在主窗体中初始化