在windows窗体设计器中自动创建控件
本文关键字:创建 控件 windows 窗体 | 更新日期: 2023-09-27 18:21:50
在设计模式下,我需要自动创建和配置表单中的几个控件。
对于类似的事情,我创建了一个控件,它可以交互和修改表单中的其他一些控件,并设置默认值,向网格添加列,。。。完成后,我移除控制,就这样。
这是一种创建特别宏的不太复杂的技术,但它的作用就像一种魅力,可以简化配置属性的重复工作,特别是对于具有大量元素(如网格)的"大"对象。
问题是,在设计模式中,我无法创建新控件并将它们动态添加到表单中。考虑以下代码(只是一个简化的示例):
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);