在 winforms 中创建动态 UI

Posted

技术标签:

【中文标题】在 winforms 中创建动态 UI【英文标题】:Creating a dynamic UI in winforms 【发布时间】:2011-12-07 15:04:28 【问题描述】:

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

我有一个带有文本框的表单,它的右侧有一个按钮 1,下方有一个列表框,列表框下方有一个按钮 2。按下 button1 应该在第一个文本框下方生成另一个文本框,并且 listbox/button2 应该向下移动。如果有人以前使用过 Adob​​e Bridge,批量重命名窗口就是我所说的一个示例。

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

【问题讨论】:

这很好,让它发生。 您是否尝试过使用FlowLayoutPanel 【参考方案1】:

您 - 可以 - 只需将 TextBox 的高度添加到表单的大小,但最好使用一个指示 TextBox 大小的常量,然后添加它。

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

对于动态生成,请使用 List(或 Stack,具体取决于您正在使用它做什么)。

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 从某种意义上说,它更像是编写一个网页而不是一个表单——你可以获得动态和相对大小、网格、许多布局面板和其他有用的东西。至于务实地做一个界面,我没试过。无论如何,所有事情都认为它值得学习,因为它正在成为更占主导地位的 UI 开发技术之一。

以上是关于在 winforms 中创建动态 UI的主要内容,如果未能解决你的问题,请参考以下文章

Winforms:在设计器中创建对象并对其进行自定义

在 WinForms 中,如何在 DevExpress GridControl 中创建删除按钮?

在vs2012中创建一个winform,并且运行起来。

C#在WINForm程序中创建XML文件

C# 程序(Winform 和 WPF)在启动文件夹中创建快捷方式时被视为病毒?

如何在Visual Studio中创建Winform窗体应用