设置按钮填充所有宽度&在WinForms中父元素的顶部

本文关键字:WinForms 元素 顶部 填充 按钮 设置 | 更新日期: 2023-09-27 18:16:39

我想创建一个带有按钮列的表单。按钮应该适合所有的宽度的形式。我也想把它推到最好的形式。它应该看起来像这样:

|----------------------------------|
|           Form caption           |
|----------------------------------|
||--------------------------------||
||Button0                         ||
||--------------------------------||
||--------------------------------||
||Button1                         ||
||--------------------------------||
||--------------------------------||
||Button2                         ||
||--------------------------------||
|                                  |
|                                  |
|           free space             |
|                                  |
|----------------------------------|

通常我用c++/Qt工作,它有丰富的布局。据我所知,c#在这方面不是很好。我发现有一列的TableLayoutPanel可以做到这一点。我唯一想做的就是把所有的按钮都按到顶部。因此,我创建了以下代码:

// panelButton was created by VS with following params:
this.panelButton = new System.Windows.Forms.TableLayoutPanel();
this.panelButton.Dock = System.Windows.Forms.DockStyle.Fill;
this.panelButton.Name = "panelButton";
this.panelButton.RowCount = 1;

for(int i = 0;i < 3;i ++)
{
    Button button = new Button();
    button.Dock = DockStyle.Fill;
    button.Height = 40;
    button.Text = "Button" + i;
    button.Click += new EventHandler(delegate(object o, EventArgs args) {});
    panelButton.Controls.Add(button, 0, i);
}

但是我得到的布局是错误的- button0button1是40px的高度,但button2填充所有的空间,当我期望它将是40px。

补充:我已经找到了一个解决方案。我添加

panelButton.Controls.Add(new Control(), 0, rowIndex);

设置按钮填充所有宽度&在WinForms中父元素的顶部

您不需要使用TableLayoutPanel来完成这样的任务。使用Panel并添加按钮就足够了。对于每个按钮,您需要将其Dock设置为Top

如果你想让面板增长而不是显示卷轴,你可以设置面板的AutoSize=trueAutoScroll=false

如果你想要滚动条,只需设置为AutoSize=falseAutoScroll=true

示例1

一个自动调整大小的表单,包含一个面板,其中有一个按钮列表:(截图)

public Form1()
{
    InitializeComponent();
    this.Controls.Clear();
    this.AutoSize = true;
    this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
    var panel = new Panel();
    panel.Dock = DockStyle.Fill;
    panel.AutoScroll = false;
    panel.AutoSize = true;
    panel.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
    this.Controls.Add(panel);
    for (int i = 0; i < 20; i++)
    {
        var buttun = new Button();
        buttun.Text = string.Format("Button {0}", i + 1);
        buttun.Dock = DockStyle.Top;
        panel.Controls.Add(buttun);
    }
}
示例2

一个包含有一个按钮列表的自动滚动面板的表单:(截图)

public Form1()
{
    InitializeComponent();
    this.Controls.Clear();
    this.AutoSize = false;
    var panel = new Panel();
    panel.Dock = DockStyle.Fill;
    panel.AutoScroll = true;
    this.Controls.Add(panel);
    for (int i = 0; i < 20; i++)
    {
        var buttun = new Button();
        buttun.Text = string.Format("Button {0}", i + 1);
        buttun.Dock = DockStyle.Top;
        panel.Controls.Add(buttun);
    }
}

注意:布局与C#无关,它是UI框架的工作,如Windows窗体。要了解有关windows窗体布局的更多信息,请查看这些文档:

  • Windows窗体布局
  • Windows窗体控件的布局