如何使我的用户控件在设计时将控件定义到其父窗体中?
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#,
非常感谢作者。
我希望我的用户控件在设计时在其父窗体 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#, 非常感谢作者。