【问题标题】:Visual Studio Designer: Drag control on one Panel but add to another panelVisual Studio 设计器:在一个面板上拖动控件但添加到另一个面板
【发布时间】:2014-01-10 17:07:48
【问题描述】:

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

所以当我使用例如项目 Button1 中的 Scrollpanel1.Controls.Add(Button1) 将正确添加到我的控件内的 pnlContents 中。这很好用。

问题是,我无法在 Visual Studio 设计器中复制该行为。如果我将一个控件拖动到我的 Scrollpanel 控件上,它的位置只会翻转回拖动开始的位置。如果我选择我的 Scrollpanel 并双击工具箱中的控件,我会收到错误消息:“child” is no sub control of this parent element。 (或类似的,由我从德语翻译)。

我知道在设计时,我将元素拖到主面板上而不是 pnlContents 上(因为它太小了,里面什么都没有)。但是,既然我隐藏了该属性,难道不应该将它添加到 pnlContents.Controls 中吗?

当我尝试将控件添加到 Scrollpanel 时,我能否以某种方式告诉设计人员它需要将控件添加到 pnlContents.Controls?

这是 Visual Studio 2012 中的 WinForms 应用程序。

整个班级都在这里Google Docs

不是很漂亮的用法示例Google Docs

【问题讨论】:

    标签: vb.net winforms visual-studio panel


    【解决方案1】:

    首先,不要隐藏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
    

    其次,您需要创建一个自定义ControlDesigner,例如ParentControlDesigner。如果我对您的理解正确,您正在尝试使用单个TabPage 创建类似TabControl 的东西。创建这个设计师是可行的,但比你想象的要复杂一些。

    结论

    我建议你将System.Design.dll 拖到Reflector 中,看看MS 是如何创建他们的TabControlDesigner 的。您还应该阅读 MSDN 上的 extending design-Time support

    【讨论】:

    • 是的,我想与 TabPage 的比较是合适的,而且我更可能认为它比实现我自己的设计器更复杂。我想我会阅读您提供的线索,然后决定是否值得为我的需要而烦恼。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多