【问题标题】:re: behaviour of a UserControl in a designer and at runtimere: 设计器中和运行时 UserControl 的行为
【发布时间】:2014-09-10 18:47:01
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么要重新发明轮子?请改用FlowLayoutPanel
  • 谢谢,是的,这绝对是正确的方法。虽然我仍然想了解为什么我的 UserControl 没有像我希望的那样工作。上面的示例只是我正在处理的控件的简化。

标签: vb.net winforms


【解决方案1】:

通常这些事情将通过实现自定义LayoutEngine 来完成。 Msdn 也有一个示例。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-02
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    相关资源
    最近更新 更多