12

我有一个 FlowLayoutPanel 的问题,我不知道如何解决它。

我将两个 FlowLayoutPanel 放在另一个里面;第二个内部 flp 内部有 3 个按钮。

在此处输入图像描述

FlowLayoutPanel 子级的属性是:

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

现在我将每个按钮的FlowBreak属性设置为 true,但是我看到的行为不是我想要的,我希望 FlowLayoutPanel 缩小到按钮的宽度,

在此处输入图像描述

更改FlowDirectionUpToDown不是一种选择。

任何人都知道为什么 AutoSize 不起作用?

这是代码。

//
//FlowLayoutPanel1
//
this.FlowLayoutPanel1.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.FlowLayoutPanel1.Controls.Add(this.FlowLayoutPanel3);
this.FlowLayoutPanel1.Location = new System.Drawing.Point(84, 77);
this.FlowLayoutPanel1.MinimumSize = new System.Drawing.Size(10, 10);
this.FlowLayoutPanel1.Name = "FlowLayoutPanel1";
this.FlowLayoutPanel1.Size = new System.Drawing.Size(308, 265);
this.FlowLayoutPanel1.TabIndex = 0;
//
//FlowLayoutPanel3
//
this.FlowLayoutPanel3.AutoSize = true;
this.FlowLayoutPanel3.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
this.FlowLayoutPanel3.Controls.Add(this.Button1);
this.FlowLayoutPanel3.Controls.Add(this.Button2);
this.FlowLayoutPanel3.Controls.Add(this.Button3);
this.FlowLayoutPanel3.Location = new System.Drawing.Point(127, 3);
this.FlowLayoutPanel3.MinimumSize = new System.Drawing.Size(10, 10);
this.FlowLayoutPanel3.Name = "FlowLayoutPanel3";
this.FlowLayoutPanel3.Size = new System.Drawing.Size(162, 87);
this.FlowLayoutPanel3.TabIndex = 1;
//
//Button1
//
this.FlowLayoutPanel3.SetFlowBreak(this.Button1, true);
this.Button1.Location = new System.Drawing.Point(3, 3);
this.Button1.Name = "Button1";
this.Button1.Size = new System.Drawing.Size(75, 23);
this.Button1.TabIndex = 0;
this.Button1.Text = "Button1";
this.Button1.UseVisualStyleBackColor = true;
//
//Button2
//
this.FlowLayoutPanel3.SetFlowBreak(this.Button2, true);
this.Button2.Location = new System.Drawing.Point(3, 32);
this.Button2.Name = "Button2";
this.Button2.Size = new System.Drawing.Size(75, 23);
this.Button2.TabIndex = 1;
this.Button2.Text = "Button2";
this.Button2.UseVisualStyleBackColor = true;
//
//Button3
//
this.Button3.Location = new System.Drawing.Point(3, 61);
this.Button3.Name = "Button3";
this.Button3.Size = new System.Drawing.Size(75, 23);
this.Button3.TabIndex = 2;
this.Button3.Text = "Button3";
this.Button3.UseVisualStyleBackColor = true;
4

3 回答 3

16

这是一个错误,它已经存在了很长时间。问题是 FlowLayoutPanel 的布局引擎计算错误的第一行的宽度,包括第二个控件的宽度,即使它被包装到第二行。

解决方法很愚蠢但很有效,在第一个控件之后添加一个宽度为 0 的虚拟面板。如果您使用设计器执行此操作,请先将其拖放到正确的位置,即第一个控件的右侧。然后在“属性”窗口中将其 Margin 设置为 (0, 0, 0, 0),将 Size 设置为 (0, 0)。

于 2013-04-03T16:04:47.367 回答
6

我不相信 FlowLayoutPanel 旨在做你想做的事情。TableLayoutPanel 可能更适合。添加具有单列的 TableLayoutPanel,并将每个按钮添加到一行。

编辑:我发现了一个 hackish 解决方法。在第一个按钮之后,创建一个大小为 0,0、边距为 0,0的面板。确保FlowBreak设置为 false。

在此处输入图像描述

编辑:您只需要在第一个按钮之后创建一个面板,而不是每个面板。

于 2013-04-03T14:58:04.160 回答
2

不是解决方案,而是解决方法。看起来您正在尝试TableLayoutPanel通过使用流中断来模拟FlowLayoutPanel. 你试过TableLayoutPanel改用吗?根据您在评论中的屏幕截图,它应该可以完美地满足您的需求。

于 2013-04-03T14:57:44.717 回答