如何使我的用户控件在设计时将控件定义到其父窗体中?

How to enable my usercontrol to define controls into its parent form at design-time?

我希望我的用户控件在设计时在其父窗体 class 内定义(声明和初始化)控件。例如,用户控件(或其关联的设计器 class)应该能够将面板 "Panel1" 声明到其父窗体中,如下所示:

Partial Class Form1
Inherits System.Windows.Forms.Form

<System.Diagnostics.DebuggerStepThrough()> _
Private Sub InitializeComponent()
      Me.MyUserControl1 = New MySolution.MyUserControl
      Me.Panel1 = New System.Windows.Forms.Panel
      Me.SuspendLayout()
      '          '
      'MyUserControl1
      '
      Me.MyUserControl1.Controls.Add(Me.Panel1)
      Me.MyUserControl1.Location = New System.Drawing.Point(50, 50)
      Me.MyUserControl1.Name = "MyUserControl1"
      Me.MyUserControl1.Size = New System.Drawing.Size(102, 102)
      Me.MyUserControl1.TabIndex = 0
      '
      'Panel1
      '
      Me.Panel1.Location = New System.Drawing.Point(1, 1)
      Me.Panel1.Name = "Panel1"
      Me.Panel1.Size = New System.Drawing.Size(100, 100)
      Me.Panel1.TabIndex = 1
      '
      'Form1
      '
      Me.ClientSize = New System.Drawing.Size(399, 262)
      Me.Controls.Add(Me.MyUserControl1)
      Me.Name = "Form1"
      Me.Text = "Form1"
      Me.ResumeLayout(False)
 End Sub

 Friend WithEvents MyUserControl1 As MySolution.MyUserControl
 Friend WithEvents Panel1 As System.Windows.Forms.Panel
End Class

注意:这个声明应该是动态的。我知道我可以通过在我的用户控件中添加 "Panel1" 作为 属性 来实现这一点,但我需要的是从代码中添加此声明,而不是通过将项目作为 属性 提供.

在具有此功能的内置 winforms 控件中,例如 TabControl 和 ListView。试试这个场景:在设计器中的窗体中添加一个TabControl,查看窗体的设计器生成文件,你会发现窗体代码中已经声明并初始化了TabPage1和TabPage2。如果再添加一个tab,再回头查看设计器生成的文件,会发现TabControl设计器在定义项中添加了TabPage3,从TabControl中删除那些TabPages,会发现文件中删除了它们的关联声明和初始化源代码。

如何从我的用户控件 and/or 它的设计器中实现这一点? 谢谢您的帮助。

这可以通过使用函数来实现: IDesignerHost.CreateComponent 在控件的设计器主机接口实例上,从控件设计器的代码中调用(子初始化或任何其他充当动词的方法)。 This is a clear example on how to do it in both Visual Basic and C#, 非常感谢作者。