C# 在winforms中创建动态UI

C# 在winforms中创建动态UI,c#,winforms,user-interface,user-controls,controls,C#,Winforms,User Interface,User Controls,Controls,如果我想创建一个出现动态UI控件的winform,最好的方法是什么 我有一个表单,有一个文本框,右侧有一个按钮1,下面有一个列表框,列表框下面有一个按钮2。按下按钮1应在第一个文本框下方生成另一个文本框,并且列表框/按钮2应向下移动。如果有人以前使用过AdobeBridge,批量重命名窗口就是我所说的一个例子 我想简单地将textboxN.Height添加到this.Size,然后将textboxN.Height添加到每个控件(第一个文本框除外)的Y位置,这样它们都会下移textboxN.Hei

如果我想创建一个出现动态UI控件的winform,最好的方法是什么

我有一个表单,有一个文本框,右侧有一个按钮1,下面有一个列表框,列表框下面有一个按钮2。按下按钮1应在第一个文本框下方生成另一个文本框,并且列表框/按钮2应向下移动。如果有人以前使用过AdobeBridge,批量重命名窗口就是我所说的一个例子


我想简单地将
textboxN.Height
添加到
this.Size
,然后将
textboxN.Height
添加到每个控件(第一个文本框除外)的Y位置,这样它们都会下移
textboxN.Height
像素。但我认为有更好的方法。相反,Winforms是否适合这样做?

您可以将文本框的高度添加到表单的大小中,但最好使用一个常量来指定文本框的大小,然后再添加它

要移动列表框/按钮2,请将它们锚定到表单底部,它们将自动与表单底部保持相同的距离

至于动态生成,请使用列表(或堆栈,具体取决于您使用它的方式)

部分类表单1:表单
{
列表文本框=新列表();//或堆栈
const int textBoxWidth=200;//文本框放置的控制变量
const int textBoxHeight=50;
常量int textBoxMargin=5;
无效按钮1\u单击(对象发送者,事件参数e)
{
this.Height+=textBoxHeight+textBoxMargin;
TextBox tb=新的TextBox();
如果(textboxs.Count==0)
{
tb.Top=textBoxMargin;
}
其他的
{
tb.Top=((textBoxHeight+textBoxMargin)*textboxs.Count)+textBoxMargin;
}
tb.Left=textBoxMargin;
tb.Height=textBoxHeight;
tb.Width=textBoxWidth;
文本框。添加(tb);
this.Controls.Add(tb);
}
}
这应该行得通。这里使用的方法是,几乎所有的位置定制都可以用常量值来完成

在WinForms中这样做最好吗?当然,没有真正的理由不在WinForms中实现它,这个功能很容易实现。我自己也是WPF成员,但这仍然是合法的


编辑逻辑错误

这很好,让它发生。您是否尝试过使用
FlowLayoutPanel
?这是一个非常简单的示例,但一般来说,WPF更容易创建动态UI吗?@Jack从某种意义上讲,它更像是编写网页而不是表单-您可以获得动态和相对大小、网格、,许多布局面板和其他有用的东西。至于实用的界面制作,我还没有尝试过。所有的事情都认为它值得学习,因为它正在成为一种更为主导的UI开发技术。
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);
    }
}