Winforms: 使用Docking的FlowLayoutPanel

7
这是在winforms中。我正在创建一个用户控件,它基本上是一个填充了其他用户控件的FlowlayoutControl。我需要添加的每个控件都停靠在前一个控件的顶部(从左到右)。不幸的是,看起来flowlayoutcontrol忽略了任何停靠属性。有没有办法停靠里面的控件?我需要它从左到右填充项目,但项目应该像列表视图一样布局。由于这是找出采取什么方法的问题,所以真的没有可以提供的代码。
3个回答

13

将 FlowLayoutPanel正确停靠是有技巧的。根据原始问题,您想要类似列表视图的东西。重要的是要知道,在您的列表中,其中一个项目(最宽的那个)定义了 FlowLayoutPanel中的“虚拟列”。其余项目将跟随它。您可以通过将其中一个项目向右拖动来在 VS 设计器中证明这一点。'虚拟列'会跟随它,如果其他项目被锚定,则它们也将跟随虚拟列。

请注意,无法将定义列的控件锚定。它没有任何东西可以锚定到,奇怪的事情会发生。

要以编程方式执行所有此操作,请在 FlowLayoutPanel上处理 Layout 事件,并放置类似于下面代码的代码。在设计器中,确保列表中的所有项都未停靠并且将其锚定设置为“无”。昨天我花了一整天才做到这一点,而这正是使下面的代码起作用的关键。

flowLayoutPanel.Controls[0].Dock = DockStyle.None;                
flowLayoutPanel.Controls[0].Width = flowLayoutPanel.DisplayRectangle.Width - lowLayoutPanel.Controls[0].Margin.Horizontal;

for (int i = 1; i < flowLayoutPanel.Controls.Count; i++)
{
    flowLayoutPanel.Controls[i].Dock = DockStyle.Top;
} 

感谢您订阅布局事件的想法。这正是我所需要的,我只是根据父控件的宽度手动设置了子控件的宽度。 - argyle

6

@Akram,WrapContents属性解决了控件相互填充的问题,谢谢。现在我遇到的问题是让用户控件从左到右填满整个区域。 - Alex
@Alex:你考虑过在这里使用TableLayoutPanel吗? - Akram Shahda
我有一个问题,当我使用TableLayoutPanel时,它无法检测到需要滚动条的情况,即使设置了AutoScroll为true。 - Alex
@Alex:你有没有考虑把 TableLayoutPanel 放在一个 Panel 里面? - Akram Shahda
@Akram,我之前有这个问题,但现在想起来了,我不认为面板的AutoScroll设置为true。我会尝试一下。 - Alex
@Alex:我相信这将是一个稳定的解决方案。 - Akram Shahda

1

FlowLayoutPanel的停靠属性适用于面板本身(例如,如果您想要将FlowLayoutPanel停靠在表单的左侧等),而不是其中控件的容器。

尝试调整DefaultPadding和DefaultMargin属性,这些属性适用于它包含的控件的间距。


谢谢您的回复,不过我指的是流式布局面板中用户控件的停靠属性,而不是面板本身。 - Alex
我已经尝试将用户控件的 Dock 属性设置为 DockStyle.Top 和 DockStyle.Fill,但是当我这样做时,它不会绘制控件。然而,它仍然显示滚动条。我不明白为什么它在停靠时不会绘制控件。 - Alex

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接