【问题标题】:Location properties on winforms acting strangewinforms上的位置属性表现得很奇怪
【发布时间】:2018-01-02 21:44:01
【问题描述】:

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

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) 开始,然后随着面板的大小和一些间距而递增。

这就是问题所在。这仅在我向下滚动表单时发生。面板间距突然变大,并决定将第一个面板放在表格下方数百像素处。位置属性是否基于您正在查看的内容?所以如果我向下滚动表单位置(0,0)将是当前视图的左上角?位置一定有一些我不知道的奇怪属性。

谢谢

【问题讨论】:

  • 循环遍历控件的 Controls 集合遵循 z 顺序,因此如果您的 Panel 控件的 z 顺序不是您所期望的,我不会感到惊讶。与其一直使用非常低效的代码来构建数组,不如一开始就创建一个List(Of Panel),然后在创建它们时将Panels 添加到其中?这样,您每次都可以简单地循环,然后除其他优点外,z-order 变得无关紧要。
  • 另外,为什么你有一个方法来传递表单?您说“我有一个表格”,这似乎表明这只适用于一种表格。在这种情况下,操作Panels 的方法应该在该表单内,并且应该使用Me 引用自身。即使您有多个表单,您仍然可以将该功能放入基类中。
  • 说了这么多,你的代码可能是完全没有必要的。无论如何,您很可能应该使用TableLayoutPanelFlowLayoutPanel,在这种情况下,布局会自动处理。
  • 您的面板上是否设置了 Anchor 属性?
  • 好的,我切换到使用面板列表,效果更好。但是,我的问题没有解决。仍然好像“起点”(12,18)取决于我正在查看的内容,而不是表单的最左上角。当我向下滚动表单时,我仍然会遇到主要的间距问题。只有当我向下滚动表单时才会发生这种情况。我知道这是真的,因为我尝试过调整表单本身的大小。尚未设置锚属性我尝试了它们,但它们没有做任何事情。这不是面板内控件的问题,而是面板本身的问题。

标签: vb.net winforms spacing


【解决方案1】:

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

解决方案是described here,即使用AutoScrollPosition。如果您将 startPoint 更改为此,它将针对滚动位置进行调整。

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

AutoScrollPosition 的文档指出:

以编程方式向窗体添加控件时,使用 AutoScrollPosition 属性将控件定位在当前可视滚动区域的内部或外部。

【讨论】:

  • 这就是答案。解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 2010-10-24
  • 2011-12-12
  • 2012-08-04
  • 2013-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-14
相关资源
最近更新 更多