我试图在标题中描述的问题源于我创建一个继承自Panel的自定义控件。它基本上只是一个简单的面板,但是该类包含了另一个自动调整大小的面板(因此它可以非常小甚至不可见)。
<System.ComponentModel.DefaultEvent("ScrollPossibilitiesChanged")> _
Public Class ScrollPanel
Inherits Panel
Private WithEvents pnlContents As Panel
Public Sub New()
pnlContents = New Panel
pnlContents.AutoSize = True
pnlContents.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink
pnlContents.Location = New System.Drawing.Point(0, 0)
pnlContents.Name = "pnlContents"
MyBase.Controls.Add(pnlContents)
ResetScroll()
LimitScroll = True
End Sub
[...]
End Class
主面板不应包含任何控件,只能包含pnlContents。相反,pnlContents应该包含其他所有控件。 Codewise我通过遮蔽Controls属性
来实现这一点Public Shadows ReadOnly Property Controls As ControlCollection
Get
Return pnlContents.Controls
End Get
End Property
所以当我使用例如项目中的Scrollpanel1.Controls.Add(Button1)
Button1将正确添加到我的控件中的pnlContents中。这很好。
问题是,我无法在Visual Studio Designer中复制该行为。如果我将控件拖到我的Scrollpanel控件上,它的位置只会翻转到拖动开始的位置。如果我选择我的Scrollpanel并双击工具箱中的控件,我会收到错误消息:&#34; child&#34;不是这个父元素的子控件。 (或类似的,由我翻译自德语)。
据我所知,在设计时,我将元素拖到主面板而不是pnlContents上(因为它太小而内部没什么)。但是,不应该将它添加到pnlContents.Controls中,因为我隐藏了该属性?
当我尝试将控件添加到Scrollpanel时,我能以某种方式告诉设计师它需要将控件添加到pnlContents.Control吗?
这是Visual Studio 2012中的WinForms应用程序。
整个班级可在此处Google Docs
的用例不是很好答案 0 :(得分:2)
首先,不影响Controls
属性。对于“仅运行时”控件,可能可以,但在设计时它可能会导致一些意外问题。考虑创建一个反映pnlContents
中控件的属性。
<Browsable(False)> _
Public ReadOnly Property Contents() As ControlCollection
Get
Return Me.pnlContents.Controls
End Get
End Property
<EditorBrowsable(EditorBrowsableState.Never)> _
Public Shadows ReadOnly Property Controls() As ControlCollection
Get
Return MyBase.Controls
End Get
End Property
其次,您需要像ParentControlDesigner一样创建自定义ControlDesigner
。如果我理解正确,您正尝试使用TabControl
创建类似TabPage
的内容。创建这个设计师是可行的,但比你想象的要复杂一点。
<强>结论强>
我建议您将System.Design.dll
拖到Reflector,然后查看MS如何创建TabControlDesigner
。您还应该阅读MSDN上的extending design-Time support。