C# 安排FlowLayoutPanel控件以占用最少的空间
我使用FlowLayoutPanel控件,我想知道是否有任何方法来执行控件的自动布局,以便它们占用尽可能少的空间? 例如,添加一个宽度为100px的控件,三个宽度为500px的控件,再添加一个宽度为100px的控件 应该是这样的:C# 安排FlowLayoutPanel控件以占用最少的空间,c#,.net,flowlayoutpanel,C#,.net,Flowlayoutpanel,我使用FlowLayoutPanel控件,我想知道是否有任何方法来执行控件的自动布局,以便它们占用尽可能少的空间? 例如,添加一个宽度为100px的控件,三个宽度为500px的控件,再添加一个宽度为100px的控件 应该是这样的: ##Control1## ##############Control2########################## ##############Control3########################## ##############Control4#
##Control1##
##############Control2##########################
##############Control3##########################
##############Control4##########################
##Control5##
正如你所看到的,一些空间被浪费了,是否有任何方法来优化它的位置,以实现这样的东西,而无需手动重新定位
##Control1## ##Control5##
##############Control2##########################
##############Control3##########################
##############Control4##########################
如何安排控件以占用最少的空间:
(顶部:初始布局,底部:结果布局)
初始布局:
新布局:
注意:它们是按发现顺序排序的,即如果您希望将编号3放在编号4之后,则在重新组织面板之前,您必须手动将其放在编号4之后。遗憾的是,这并不能解决我的问题。面板内项目的
FlowBreak
属性是否设置为False?是,所有控件都具有流中断特性。嗯,我需要一些与您显示的相反的东西,我需要从“新布局”转到“初始布局”,以尽可能减少浪费的空间。rry!:D检查我的编辑是否有其他方法,应该很容易理解我是如何做的。我还测试了添加一些控件(和奇数个控件),它没有爆炸,所以我想它没问题;)很好,这似乎正是我所需要的:)我将研究您的代码,将其实现到我的项目中。谢谢
public partial class Form1 : Form
{
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
var flowLayoutPanel = flowLayoutPanel1;
ReorganizeFlowLayoutPanel(flowLayoutPanel);
}
private static void ReorganizeFlowLayoutPanel(FlowLayoutPanel flowLayoutPanel) {
var width = flowLayoutPanel.Width;
var controls = flowLayoutPanel.Controls.OfType<Control>().ToList();
var ascending = new List<Control>(controls.OrderBy(s => s.Width));
var descending = new List<Control>(controls.OrderByDescending(s => s.Width));
var list = new List<Control>();
while (ascending.Count > 0) {
Control smallest = ascending[0];
ascending.RemoveAt(0);
if (ascending.Count == 0) {
list.Add(smallest);
break;
}
foreach (var largest in descending) {
if (smallest.Width + largest.Width < width) {
list.Add(smallest);
list.Add(largest);
ascending.Remove(largest);
descending.Remove(largest);
descending.Remove(smallest);
break;
}
}
}
var i = 0;
foreach (var control in list) {
flowLayoutPanel.Controls.SetChildIndex(control, i++);
}
}
}
using System;
using System.Linq;
using System.Windows.Forms;
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
var flowLayoutPanel = flowLayoutPanel1;
ReorganizeFlowLayoutPanel(flowLayoutPanel);
}
private static void ReorganizeFlowLayoutPanel(FlowLayoutPanel flowLayoutPanel) {
var controls = flowLayoutPanel.Controls.OfType<Control>().OrderBy(s => s.Width);
var index = 0;
foreach (var tuple in controls) {
flowLayoutPanel.Controls.SetChildIndex(tuple, index++);
}
}
}
}