Winforms 上的位置属性表现得很奇怪

Location properties on winforms acting strange

我有一个表单,允许用户通过按 "add" 按钮生成多个面板,面板中包含一些不同的内容。根据用户在面板中的操作,面板会扩大和缩小以适应内容。由于大小发生了这种变化,我创建了一个用于格式化表单面板的子项。

Private Sub formatPanels(frm As Form)
    Dim count As Integer = 0
    Dim startPoint As Point = New Point(12, 80)
    Dim endPoint As Point = New Point(0, 0)
    Dim maxY As Integer = 0
    For Each pnl As Control In frm.Controls
        If TypeOf pnl Is Panel Then
            ReDim Preserve _arr_Panels(count)
            _arr_Panels(count) = pnl
            count += 1
            pnl.Location = startPoint
            startPoint.Y += pnl.Size.Height + 30
        End If
    Next
End Sub

如您所见,我们遍历每个面板,第一个始终从位置 (12,80) 开始,然后随着面板的大小和一些间距递增。

这是问题所在。这只有在我向下滚动表格时才会发生。面板间距突然搞砸了,并决定将第一个面板向下放置数百个像素。位置 属性 是基于您正在查看的内容吗?因此,如果我向下滚动,则表单 location(0,0) 将位于当前视图的左上角?一定有一些奇怪的地方 属性 我不知道。

谢谢

此行为与面板无关,但与具有 AutoScroll = TrueAnchor(包括 Top)的窗体上的任何控件相关。 (注意:如果 Anchor 也没有包括 Left 我在函数的第一次调用时有一些奇怪的定位。

解决方法是described here,就是使用AutoScrollPosition。如果您将 startPoint 更改为此,它将调整滚动位置。

Dim startPoint As Point = New Point(12, Me.AutoScrollPosition.Y + 80)  

AutoScrollPosition 的文档说明了这一点:

When adding controls programmatically to a form, use the AutoScrollPosition property to position the control either inside or outside of the current viewable scroll area.