在winforms中创建动态用户界面

4
如果我想创建一个动态 UI 控件的 winform,最好的方法是什么?
我有一个带有文本框的表单,右边有一个按钮1,在下面有一个列表框,在列表框下面有一个按钮2。按下按钮1应该在第一个文本框下面生成另一个文本框,并将列表框/按钮2向下移动。如果有人之前使用过 Adobe Bridge,则批量重命名窗口就是我所说的内容示例。
我考虑简单地将 textboxN.Height 添加到 this.Size,然后将 textboxN.Height 添加到每个控件(除了第一个文本框)的 Y 位置,以便它们都向下移动 textboxN.Height 像素。但我认为有更好的方法来做到这一点。而且,Winforms 是否适合此类操作?

这很好,实现它。 - Hans Passant
你尝试过使用 FlowLayoutPanel 吗? - sallushan
1个回答

3

你可以将TextBox的高度加到窗体的大小中,但更好的做法是使用常量来规定TextBox的大小,然后再添加。

要移动listBox/button2,将它们锚定在窗体底部,它们将自动保持与窗体底部相同的距离。

至于动态生成,请使用列表(或栈,取决于所需操作)。

partial class Form1 : Form
{
    List<TextBox> textBoxes = new List<TextBox>(); // or stack
    const int textBoxWidth = 200;  // control variables for TextBox placement
    const int textBoxHeight = 50;
    const int textBoxMargin = 5;

    void button1_Click(object sender, EventArgs e)
    {
        this.Height += textBoxHeight + textBoxMargin;
        TextBox tb = new TextBox();

        if (textBoxes.Count == 0)
        {
            tb.Top = textBoxMargin;
        }
        else
        {
            tb.Top = ((textBoxHeight + textBoxMargin) * textBoxes.Count) + textBoxMargin;
        }

        tb.Left = textBoxMargin;
        tb.Height = textBoxHeight;
        tb.Width = textBoxWidth;
        textBoxes.Add(tb);
        this.Controls.Add(tb);
    }
}

应该可以工作。这里的方法之所以很好用是因为所有的定位自定义都可以使用常量值来完成。

最好在WinForms中实现吗?嗯,没有任何真正的理由不在WinForms中实现,这个功能足够容易实现。我自己是WPF人,但这也是合法的。

逻辑错误已经被编辑


这只是一个相当简单的例子,但总体来说,使用WPF创建动态UI更容易吗? - Jack
@Jack,从某种意义上说,它比表单更容易,因为它更像编写网页 - 您可以获得动态和相对大小、网格、许多布局面板和其他有用的功能。至于实现界面的实用性,我还没有尝试过。总的来说,学习它仍然是值得的,因为它正在成为更为主流的UI开发技术之一。 - Kristian Fenn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接