【问题标题】:How to Change the default properties of ToolBox items?如何更改工具箱项目的默认属性?
【发布时间】:2017-05-30 15:41:47
【问题描述】:

我目前正在使用 WinForms 中的 C# 在 Visual Studio 2015 中创建一个项目;我使用“工具箱项目”一词来指代 dateTimePickers、文本框、标签等。这是一个非常大的项目,如果我可以拖放对象并且它们已经具有格式,它将为我节省大量时间;例如 datetimePicker 自定义格式、文本框对齐等。

问题是我需要自定义这些对象的一些属性。到目前为止,我有这段代码可以让我更改一些可覆盖的属性。

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

但对于其他属性,我不能这样做。此外,我无法从已格式化的对象继承,因为该对象尚未初始化,并且在继承时我得到 null。我还尝试自定义初始化组件和对象的绘制事件,但由于某种原因,这些更改没有显示在对象上。

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

有什么想法吗?

提前致谢!

【问题讨论】:

  • 复制粘贴工具箱项应该保留设置的属性。
  • 它只是不需要属性是可覆盖的。使用new 关键字重新定义属性也很有效,设计师对此没有任何问题。反射允许它总是找到正确的。当然,您可以随时添加自己的。 InitializeComponent() 通常只有在 Form 或 UserControl 是基类时才有意义。
  • @HansPassant 并没有真正理解你的意思。
  • 在大多数情况下,您可以在控件的构造函数中初始化属性。对于像Text属性这样的情况,当您将控件放到设计图面上时,值将设置在控件的DesignerInitializeNewComponent方法中。

标签: c# .net winforms visual-studio windows-forms-designer


【解决方案1】:

构造函数是初始化控件属性的合适位置。对于大多数属性,要在将控件放在设计图面上时使用自定义值初始化控件,只需在构造函数中设置新值即可,例如:

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

在某些情况下,例如Text 属性,当您将控件的实例拖放到设计图面上时,该属性会在控件的DesignerInitializeNewComponent 方法中设置。

【讨论】:

    【解决方案2】:

    这可能不是您正在寻找的,我确信有更好的方法,但这是我的默认控件属性的解决方案。它列出表单中的所有控件(及其子控件)并在初始化时更改属性。

       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);在你的主窗体初始化中

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-06
      相关资源
      最近更新 更多