【问题标题】:Why does setting a MinimumSize break the table layout?为什么设置 MinimumSize 会破坏表格布局?
【发布时间】:2014-12-31 07:19:10
【问题描述】:

我目前正在使用布局并制作了一个测试项目,在该项目中我构建了一个显示面板的表单,该面板包含一个三行的 TableLayoutPanel:

  • 一个文本框
  • 一个按钮
  • 一个占位符标签,应该占据剩余的垂直空间。

这个测试可以正常工作,但是如果我将文本框的最小大小设置为例如(400, 200),我看不到按钮了。表格布局 AutoSize 中的第一行不应该为其内容吗?注意 将 RowStyles 显式设置为 SizeType.AutoSize 不会改变任何内容。


没有设置最小尺寸:

最小尺寸集:


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);
        }
    }
}

【问题讨论】:

  • 您期望 TableLayoutPanel 完成它的工作,在表格排列中布局控件,而不告诉它 如何 完成它的工作。添加行。由于 TextBox.GetPreferredSize() 返回值,这会出错。使用设计器。

标签: c# winforms layout


【解决方案1】:

按钮位于文本框下方。您需要将multiline 属性设置为true

例如

sampleTextBox.Multiline = true;

此行为的来源是TableLayoutPanelTextBox。在决定遵守MinimumSize 约束之前,TableLayoutPanel 明确测试Control 是否为TextBox 以及Multiline 属性是否设置为true 会很奇怪。但是,在我的测试中,似乎必须在将 Multiline 属性添加到 TableLayoutPanel 之前设置它,如果未设置 Multiline,则控件将返回文本框下方,即使 @987654335 也不会返回@ 再次设置为 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();
        };

【讨论】:

  • 看来我选择了错误的测试控件 ;-) 感谢您解决此问题。
  • TableLayoutPanelFlowLayoutPanel 的行为不符合预期(例如您的 TextBox 示例)。此外,MSDN 文档没有提供关于每个 Layout 在执行布局时所遵循的所有属性的足够信息。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 2021-07-10
  • 2012-10-15
  • 2023-03-24
  • 1970-01-01
  • 2013-04-07
相关资源
最近更新 更多