5

InitializeComponent在表单上设置组件,但是对于我创建的用户控件,它调用默认构造函数,但我想在用户控件上调用我自己的构造函数(带参数)。样板代码说不要编辑内容,那么最好的方法是什么?

4

1 回答 1

5

您需要创建一个 TypeConverter 类,并用TypeConverterAttribute(typeof(MyTypeConverter)). 类型转换器将告诉 Visual Studio 如何创建类型 - 允许您控制放入 InitializeComponent 中的内容。您可以真正深入,并实际编写自定义 CodeDomSerializer,然后您可以在其中编写任何您想要的 C# 代码 - 我使用此技术强制 InitializeComponent 方法解析来自 Castle Windsor 的所有 Forms 控件!这真的很好用...

反正...

您会注意到 MS 已经将这种技术用于以下类型:

this.treeView1 = new System.Windows.Forms.TreeView();
this.treeView1.Location = new System.Drawing.Point(72, 104);
this.treeView1.Name = "treeView1";
this.treeView1.Nodes.AddRange(
new System.Windows.Forms.TreeNode[] {
  new System.Windows.Forms.TreeNode("Node0"),
  new System.Windows.Forms.TreeNode("Node1")});

基本上 - 在您的 TypeConverter 中,您覆盖“ConverterTo”方法,并返回一个新的 InstanceDescriptor,它将向 WinForms 设计器描述如何实例化您的类型(使用什么构造函数,以及传递什么参数)。

您可以在这里找到更多信息(包括基本实现):http: //msdn.microsoft.com/en-us/library/ms973818.aspx

InitializeComponent 非常强大,一旦您了解所有可扩展性点。快乐编码!

于 2012-09-23T22:19:08.797 回答