在FlowLayoutPanel中将多行控件居中

时间:2019-02-05 19:58:09

标签: c# winforms user-interface tablelayoutpanel flowlayoutpanel

我正在尝试制作一个面板,以承载动态添加的控件。有两个警告:

  • 将有很多控件,因此面板在达到宽度限制并垂直滚动时应将元素包装到新行中。
  • 控件可以更改大小,这会更改元素的数量
    可以放入一行。

我已经看到了一些提议的解决方案,这些解决方案将动态控件集中在窗体中,但由于以下原因而拒绝了它们:

  • TableLayoutPanel-使用此文件时遇到的主要问题是 元素生长,必须从3-2网格转换为2-4, TableLayoutPanel似乎不能很好地处理这些问题。
  • 可以在内部扩大和缩小的AutoSize FlowLayoutPanel TableLayoutControl-这个解决方案的主要问题是 仅将表格内的一行居中,一旦换行到新行, 元素开始向右对齐。我想我可以动态地 将新的FlowLayoutPanels添加到TableLayoutControl的新行中,然后 我有一个与第一种情况类似的问题,我需要手动 如果行大小增加/缩小,则在行之间重新分配元素。

我想知道我是否缺少一些可以帮助我处理增长/收缩事件而不创建自己的TableLayoutPanel变体的功能?

编辑:
以下是功能草案:

  • A-以面板为中心的两个元素
  • B-添加了第三个元素,所有三个元素居中
  • C-添加了Forth元素,包装到新行并居中
  • D-元素已放大,现在环绕在第二个元素上,居中

Draft

1 个答案:

答案 0 :(得分:3)

这是一个再现您描述的行为的示例。
它利用了承载多个FlowLayoutPanel的TableLayoutPanel。

一个重要的细节是子FlowLayoutPanel的锚定:它们需要锚定到 Top-Bottom :这会使面板位于TableLayoutPanel行的中心。

请注意,在Form构造函数中, RowStyles 之一已被删除。这也非常重要:TLP(这是一个很古怪的家伙),即使您只有一行(或同一列,也只有一列),也将保留2 RowStyles。第二种样式将应用于您添加的第一行;仅针对第一个,而不是其他:这可能会破坏布局。

另一个异常,它没有提供删除行的方法,所以我做了一个。它功能齐全,但很简单,需要扩展,包括进一步的验证。

请参阅有关当前功能的图形示例。如果您在实施其他方面需要帮助,请发表评论。


要构建此表单,请将以下控件添加到表单(在这里称为 FLPTest1 ):

  1. 添加一个面板,设置Dock.Bottom。右键单击,然后SendToBack()
  2. 添加一个TableLayoutPanel(在这里称为 tlp1 ),设置为:
    • AutoScroll = trueAutoSize = true
    • AutoSizeMode = GrowAndShrinkDock.Fill
    • 保留1列,设置为“自动调整大小”,保留1行,设置为“自动调整大小”
  3. FlowLayoutPanel内添加一个flp1(在这里称为 TableLayoutPanel )。实际上没有必要,仅对于此示例代码
    • 将其锚点设置为 Top, Bottom <= ,即!important,如果没有它,布局将无法正常工作:它可以将FLP居于{ {1}}行,
    • TLPAutoSize = true
  4. 添加按钮(称为 AutoSizeMode = GrowAndShrink
  5. 添加第二个按钮(称为 btnAddControl
  6. 添加复选框(称为 btnRemoveControl
  7. 将代码粘贴到表单的代码文件中

TableLayoutPanel Flow

chkRandom