C# 为什么设置最小尺寸会破坏表格布局?
我目前正在玩布局,并做了一个测试项目,其中我构建了一个表单,其中显示一个面板,其中包含一个包含三行的TableLayoutPanel: 文本框 钮扣 一个占位符标签,应该占据剩余的垂直空间。 此测试正常工作,但如果我将文本框的最小大小设置为例如400、200,我将无法再看到按钮。表格布局中的第一行不应该自动调整其内容大小吗?注意 将行样式显式设置为SizeType.AutoSize不会更改任何内容 没有设置最小尺寸: 最小尺寸集:C# 为什么设置最小尺寸会破坏表格布局?,c#,winforms,layout,C#,Winforms,Layout,我目前正在玩布局,并做了一个测试项目,其中我构建了一个表单,其中显示一个面板,其中包含一个包含三行的TableLayoutPanel: 文本框 钮扣 一个占位符标签,应该占据剩余的垂直空间。 此测试正常工作,但如果我将文本框的最小大小设置为例如400、200,我将无法再看到按钮。表格布局中的第一行不应该自动调整其内容大小吗?注意 将行样式显式设置为SizeType.AutoSize不会更改任何内容 没有设置最小尺寸: 最小尺寸集: 按钮在文本框下面。您需要将multiline属性设置为true
按钮在文本框下面。您需要将multiline属性设置为true 例如 此行为的来源是TableLayoutPanel或文本框。对于TableLayoutPanel来说,在决定遵守MinimumSize约束之前,显式测试控件是否是文本框,以及多行属性是否设置为true是很奇怪的。但是,在我的测试中,似乎必须在将多行属性添加到TableLayoutPanel之前设置该属性,如果未设置多行,则控件将返回文本框下方,即使再次将多行设置为true,也不会返回 例如
看起来我选择了错误的控件进行测试;-感谢您解决此问题。TableLayoutPanel和FlowLayoutPanel的行为与预期不符,例如您的文本框示例。此外,MSDN文档没有提供有关每个布局在执行布局时所遵循的所有属性的足够信息。您希望TableLayoutPanel在不告诉它如何执行其工作的情况下执行其工作,即在表格排列中使用布局控件。添加行。由于TextBox.GetPreferredSize返回值,因此出现错误。使用设计器。
using System;
using System.Drawing;
using System.Windows.Forms;
namespace LayoutTest
{
static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
var sampleForm = new Form();
var samplePanel = new Panel() { Dock = DockStyle.Fill };
var sampleTextBox = new TextBox() { Dock = DockStyle.Fill };
// This line breaks the layout
//sampleTextBox.MinimumSize = new Size(400, 200);
var sampleButton = new Button() { Dock = DockStyle.Fill };
var panelLayout = new TableLayoutPanel() { Dock = DockStyle.Fill };
panelLayout.Controls.Add(sampleTextBox, 0, 0);
panelLayout.Controls.Add(sampleButton, 0, 1);
// Add a placeholder label to take up the remaining space
panelLayout.Controls.Add(new Label() { Text = String.Empty, Dock = DockStyle.Fill });
samplePanel.Controls.Add(panelLayout);
sampleForm.Controls.Add(samplePanel);
Application.Run(sampleForm);
}
}
}
sampleTextBox.Multiline = true;
sampleButton.Click += delegate {
Size s1 = sampleTextBox.MinimumSize; // always returns the set MinSize
sampleTextBox.Multiline = !sampleTextBox.Multiline;
Size s2 = sampleTextBox.MinimumSize; // always returns the set MinSize
panelLayout.Invalidate(true);
panelLayout.PerformLayout();
};