2011-10-14 110 views
4

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

我有一个窗体,带有一个文本框,它右边的button1,下面的列表框和列表框下面的button2。按下按钮1应该在第一个文本框下生成另一个文本框,并且列表框/按钮2应该向下移动。如果以前任何人使用过Adobe Bridge,批量重命名窗口就是我正在谈论的一个例子。

我想简单地增加textboxN.Heightthis.Size,然后textboxN.Height到每个控件(除了第一个文本框)Y位置,以便他们都得到由textboxN.Height像素下移。但我认为这样做有更好的方法。相反,Winforms是否适合这样的事情呢?

+0

这是好的,做到这一点。 –

+0

您是否尝试过使用FlowLayoutPanel? – sallushan

回答

3

您可以 - 只是将TextBox的高度添加到表单的大小,但是tbh最好使用指定TextBoxes大小的常量,然后添加该值。

要移动listBox/button2,将它们锚定到表单底部,并且它们将自动保持与表单底部相同的距离。

至于动态生成,使用一个List(或一个堆栈,取决于你在做什么)。

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的人,但这仍然是合法的。

编辑的逻辑错误

+0

这是一个非常简单的例子,但总的来说,WPF更容易创建动态UI吗? – Jack

+0

@Jack它更像写一个网页而不是表单 - 你可以获得动态和相对的大小,网格,大量的布局面板和其他有用的东西。至于实际制作界面,我还没有尝试过。无论如何,所有事情都认为值得学习,因为它正在成为更主要的UI开发技术之一。 –