Visual Studio Designer:在一个面板上拖动控件但添加到另一个面板

时间:2013-12-22 07:40:53

标签: vb.net winforms visual-studio panel

我试图在标题中描述的问题源于我创建一个继承自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

使用Google Docs

的用例不是很好

1 个答案:

答案 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