re:UserControl在设计器和运行时的行为

时间:2014-09-10 18:47:01

标签: vb.net winforms

我正在尝试创建一个StackPanel用户控件,允许我以垂直方式堆叠新添加的控件(如WPF StackPanel但使用Windows窗体)。

我使用下面显示的核心代码创建了一个新的用户控件,但即使我的位置在设计器中获得了对齐的正确值,我也可以弹出消息框,设计器视图不会重新排列我拖放到的子控件我的堆栈面板,也在运行时我的位置似乎被设计师认为正确的位置覆盖(我放置控件的位置)

Public Class StackPanel
    Inherits Panel
    Private biasHeight As Integer = 0
    Private Sub StackPanel_ControlAdded(ByVal sender As System.Object, ByVal e As System.Windows.Forms.ControlEventArgs) Handles MyBase.ControlAdded
        Dim newControl As System.Windows.Forms.Control = e.Control
        '
        ' NOT WORKING: Set location of the newly added control in a panel and at runtime
        '
        newControl.Location = New System.Drawing.Point(0, biasHeight)
        '
        ' Store the y-cooridnate of the next control
        '
        biasHeight = biasHeight + newControl.Height
    End Sub
End Class

1 个答案:

答案 0 :(得分:0)

通常,这些事情将通过实施自定义LayoutEngine来完成。 Msdn也有一个样本。

我不确定为什么你的代码不起作用,没有理由支持它,因为它有很大的缺陷。您只是在添加新控件时才设置位置。还有很多。您需要考虑何时删除控件,隐藏某些控件(可见设置为false),更改大小时,填充更改等等。

所以,我建议您使用FlowLayoutPanel而不是重新发明轮子。如果你想自己实现它,那就做吧。我的意思是创建您的LayoutEngine,如提供的链接所示。事实上,这个链接确实有你需要的东西。