如何让我的usercontrol在设计时将控件定义到其父窗体?

时间:2015-01-11 00:09:18

标签: .net winforms user-controls design-time

我希望我的usercontrol在设计时在其父表单类中定义(声明和初始化)控件。例如,usercontrol(或其关联的设计器类)应该能够将面板“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

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

在具有此功能的内置winforms控件中,例如TabControl和ListView。尝试这种情况:将TabControl添加到设计器中的表单,查看设计器生成的表单文件,您会发现TabPage1和TabPage2已在表单代码中声明和初始化。如果添加另一个选项卡然后再返回设计器生成的文件,您会发现TabControl设计器已将TabPage3添加到已定义的项目,从TabControl中删除这些TabPages,您将发现从文件中删除它们的关联声明和初始化源代码。

如何在我的usercontrol和/或其设计者中实现这一目标? 谢谢您的帮助。

1 个答案:

答案 0 :(得分:0)

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