使 FlowLayoutPanel.AutoSize 与固定的行或列一起工作

Make FlowLayoutPanel.AutoSize to work with fixed rows or columns

我正在创建左右滑块控件,方法是将 FlowLayoutPanel 放置在面板内并将 FlowLayoutPanel.Autosize 设置为 true。面板大小是固定的,这些是我为 FlowLayoutPanel 设置的一些属性。

FlowDirection = LeftToRight
AutoSize = true
AutoSizeMode = GrowAndShrink
WrapContents = true

在运行时,我以编程方式将按钮添加到 FlowLayoutPanel,它看起来像这样

问题是我想通过设置固定数量的行或列来实现多行,但它总是在一行中。也就是说,如果我选择 3 行,所有按钮将仅在 3 行中流动,列数越多越好,反之亦然

pnlSlider.SetFlowBreak(btn,true)

这就是我想要实现的

有什么解决办法吗

编辑

我在这里提到了一个解决方案,这似乎与我需要的有关,但是这个解决方案是在设计时设置FlowBreaks,并且行数无法固定。

我试图复制的样本。如果你仔细观察,这些是放置在面板中的按钮,很可能是在另一个控件内滑动的流程布局

要拥有自动调整大小、可滚动的多行 FlowLayoutPanel,您可以在自动滚动面板中托管 FlowLayoutPanelFlowLayoutPanel 也应该自动调整大小:

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles MyBase.Load
    Me.Size = New Size(320, 160)
    Dim p = New Panel() With {.AutoScroll = True, .Dock = DockStyle.Fill}
    Dim f = New FlowLayoutPanel() With {.AutoSize = True, .WrapContents = True}
    p.Controls.Add(f)
    Me.Controls.Add(p)
    For i = 1 To 20
        Dim btn = New Button() With {.Text = i.ToString()}
        If (i Mod 10 = 5) Then f.SetFlowBreak(btn, True)
        f.Controls.Add(btn)
    Next
    Me.ActiveControl = f.Controls(0)
End Sub

在上面的示例中,我在第 5 项和第 15 项上插入了一个分隔符,使结果成为多行。同样如您所见,水平滚动条可见: