【发布时间】:2014-12-18 14:11:24
【问题描述】:
我有一个包含大量子控件的 WinForms 面板控件。每个孩子都停靠在左边,导致内容的水平宽度增加。包含面板设置了其 AutoScroll 属性,以便您可以访问所有内容。
当内容的总宽度变得太大时,我遇到了问题。一旦达到这个最大宽度,其他内容元素就会放置在现有内容的顶部,而不是放在右侧。但是,如果我在完成初始布局后调整面板的大小,它会通过扩展其逻辑宽度并将每个内容元素放置在正确的位置来进行自我纠正。如何在用户调整窗口大小之前正确布局?
这是一个简单的例子:
Form1.vb
Public Class Form1
Protected Overrides Sub OnLoad(e As EventArgs)
MyBase.OnLoad(e)
For i As Integer = 1 To 200
Dim gb As New GroupBox
gb.Text = "Box " & i.ToString
gb.Width = 250
gb.Dock = DockStyle.Left
Panel1.Controls.Add(gb)
gb.BringToFront()
Next
End Sub
End Class
Form1.Designer.vb
Partial Class Form1
Inherits System.Windows.Forms.Form
Private Sub InitializeComponent()
Me.Panel1 = New System.Windows.Forms.Panel()
Me.SuspendLayout()
'
'Panel1
'
Me.Panel1.AutoScroll = True
Me.Panel1.Dock = System.Windows.Forms.DockStyle.Fill
Me.Panel1.Location = New System.Drawing.Point(0, 0)
Me.Panel1.Name = "Panel1"
Me.Panel1.Size = New System.Drawing.Size(284, 262)
Me.Panel1.TabIndex = 0
'
'Form1
'
Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
Me.ClientSize = New System.Drawing.Size(284, 262)
Me.Controls.Add(Me.Panel1)
Me.Name = "Form1"
Me.Text = "Form1"
Me.ResumeLayout(False)
End Sub
Friend WithEvents Panel1 As System.Windows.Forms.Panel
End Class
这是窗口第一次出现时的样子,几乎滚动到最后,这样您就可以看到问题区域。请注意,框 183 到 199 缺失,因为它们被放置在彼此的顶部。这是不对的。
这是手动调整窗口大小后的样子,几乎滚动到最后。面板会根据调整大小自行修复;面板的总逻辑宽度自动扩展到足以容纳所有内容。这就是我希望它第一次出现时的样子。
我尝试手动设置每个框的位置,并尝试调用 PerformLayout() 和其他几个函数。似乎没有任何效果。到目前为止,我还没有找到获得良好布局的神奇组合。有谁知道如何解决这个问题?
编辑:
这是一个屏幕截图,可能会使问题更加明显。我调整了框的宽度和框的数量以更好地显示问题。看看最后一个框如何与框 656 重叠?从 657 到 700 的每个盒子都有相同的错误位置。关闭停靠并自行设置位置无济于事。
【问题讨论】:
-
autoscroll 不是自动定位,您需要在添加面板/框时使用滚动面板的
AutoScrollPosition设置它们的位置 -
这并不能解决问题。问题不在于面板滚动到的位置,问题在于您在向右滚动后看到的项目位于错误的位置,彼此堆叠在一起。仔细看看第一个屏幕截图有什么问题。