在 windows 表单设计器中自动创建控件

Automate control creation in windows forms designer

我需要在设计模式下自动创建和配置表单中的多个控件。

对于类似的事情,我创建了一个控件来交互和修改表单中的一些其他控件并设置默认值,将列添加到网格,...完成后,我删除了控件,仅此而已。

这是一种创建临时宏的不太复杂的技术,但它就像一个魅力,可以简化配置属性的重复性工作,特别是对于 "big" 具有许多元素(如网格)的对象。

问题是我无法创建新控件并将它们动态添加到表单中在设计模式下。考虑以下代码(只是一个简化的示例):

  public partial class ButtonCreator : UserControl

    [Category("Automation")]
    public int LeftPosition { get; set; }

    [Category("Automation")]
    public bool AutoCreate
    {
        get { return false; }
        set
        {
            var form = FindForm();

            if (value)
            {
                for (var i = 10; i < 100; i = i + 20)
                {
                    var button = new Button(){Name = "btn_" + DateTime.Now.Ticks + "_" + i};
                    form.Controls.Add(button);
                    button.Location = new Point(LeftPosition, i);
                    button.BringToFront();
                }
            }
        }
    }

(我也试过使用具有类似代码的组件设计器,但结果相同,所以这种方式不那么冗长)

为了使用它,我将 ButtonCreator 的一个实例添加到表单,然后设置 AutoCreate 属性(在设计模式下,来自 属性 列表)。显然它可以工作并将按钮添加到表单,但它们没有序列化为自动生成的 C# 代码,我在保存后丢失了它们。

当 Visual studio 生成 designer.cs 文件时,我可以做些什么来强制它们序列化吗?

考虑这个限制:这不是要发布的代码,只是用于简化开发的脏代码,因此我更愿意避免更复杂的技术,以便能够在编码时轻松引入更改。如果可能,应避免提及 Visual Studio 自动化或创建 visual studio 扩展。

根据 Hans Passant 的评论,只需要求设计器环境创建对象,即可跟踪新组件。

   var host = GetService(typeof(IDesignerHost)) as IDesignerHost;
   var button = host.CreateComponent(typeof(Button), "someName") as Button;
   FindForm().Controls.Add(button);