【问题标题】:How can I add a button to the layout? - C# [duplicate]如何在布局中添加按钮? - C# [重复]
【发布时间】:2024-01-22 06:50:01
【问题描述】:

我找不到将按钮添加到布局的任何方法。

我正在尝试将子(按钮)添加到布局中,但找不到任何方法。

源代码:

using System;
using System.Windows.Forms;

namespace WinForms
{
    internal static class Program
    {
        /// <summary>
        ///     The main entry point for the application.
        /// </summary>
        [STAThread]
        private static void Main()
        {
            Application.SetHighDpiMode(HighDpiMode.SystemAware);
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

            Button button = new Button {Height = 100, Width = 100, Text = "Test"};
            

        }
    }
}

【问题讨论】:

  • 你应该在Form1的构造函数中这样做:Button button = new Button { ... }; this.Controls.Add(button);。如果出于某种原因,您想在Main() 中执行此操作(我认为没有充分的理由),只需将表单实例分配给变量并将按钮添加到其Controls 集合中。 Form1 frm = new Form1(); frm.Controls.Add(button); Application.Run(frm);.

标签: c# winforms user-interface desktop-application desktop


【解决方案1】:
  • 您在 Visual Studio 2019(不是 Visual Studio Code,不是 JetBrains Rider)中打开您的项目 - 如果您的上下文符合许可条件,则存在免费版本。如果您没有资格获得免费许可证,您[r 工作场所] 可以轻松购买某种形式的许可证

  • 您在解决方案资源管理器中双击 Form1,然后您会看到一些类似于运行程序时表单的外观,然后打开控件工具面板并从中拖出一个按钮并将其拖放到形式...

但是,如果您想通过手写大量无聊的重复代码来构建 UI,那么您可以将控件添加到其他控件的 Controls 集合中,即:

        Form1 f = new Form1();
        Button button = new Button {Height = 100, Width = 100, Text = "Test"};
        f.Controls.Add(button);

        Application.Run(f);

每个控件都有一个控件集合,可以向其中添加其他控件(不仅仅是您认为的“具有子控件的东西,例如 Panel 或 GroupBox” - 有些控件是其他控件的集合,例如 NumericUpDown 是文本框和几个按钮)

例如,您需要编写多少代码,在设计视图中布置一个外观合理的 UI,然后打开 Form1.Designer.cs - 您会明白我们为什么要借助设计工具! :)


如果我不使用 Designer 工具,学习会不会更快?

国际海事组织,不。这就像说“如果我在记事本中手动编写 SVG 代码而不是使用 Inkscape/Gimp 直观地绘制图像,或者通过在十六进制编辑器中输入字节来创建 PNG,学习起来会不会更快”

如此接近原始的低水平意味着您最终会“只见树木不见森林”,这会阻碍您的学习。有关抽象以及我们为什么使用它们/它们如何应用于每个日常过程(包括生活中的学习和操作)的冗长论述,请参阅评论跟踪

【讨论】:

  • 当我尝试打开设计器工具时,它不起作用。我还有一个问题:如果我没有使用 Designer 工具,学习会不会更快?
  • 对于 windows 窗体?不,绝对不是。这就像在问“如果我从汽车发动机上取下顶部并用手上下推动位置,上班会不会更快”。我们生活中有一种叫做“抽象层”的东西——我们对最终用户隐藏某些任务的复杂性,因为深入每一个小细节都是压倒性的,而且毫无意义。它很早就开始告诉孩子“只有 2 个糖果,你不能带走 3 个糖果”,然后是“实际上我们可以有负数但你不能平方根”,然后是“所以有想象的数字..”
  • 我必须同意你的观点。
  • 当我尝试打开设计器工具时,它不起作用
  • 我们不会直接教 3 岁的孩子量子纠缠。电脑也一样;您没有通过拿起一本关于汇编语言的书或在面包板上构建一个 cpu、编写网卡驱动程序然后实现两个、http 等来开始编程,这样您就可以发出 Web 请求 - 您只需编写一行代码webclient.downloadstring(url) 和大量的细节对你隐藏。我一直在使用 C# winforms,我唯一一次手动编写 ui 代码是在 SO 上作为演示发布,并带有“将其粘贴到新项目中”
【解决方案2】:

您需要将按钮添加到您的表单,而不是 Main 方法!

您的代码的问题在于它位于错误的位置 - 实际上,它仅在表单关闭后运行,因为Application.Run 将在消息循环中运行您的表单,允许 UI 事件开火。

您可以使用 Visual Studio WinForms 设计器(如果使用 Visual Studio),也可以在InitializeComponent() 方法之后手动添加代码 - 因此,可以直接在构造函数中,也可以在任何Form 启动事件,例如 Load 或 Shown。

Button(或任何动态实例化的控件,就此而言)添加到表单的Controls 集合中同样非常重要 - 否则,您的Button 将不会显示:

Button button = new Button {Height = 100, Width = 100, Text = "Test"};
this.Controls.Add(button); 

当然有动态生成控件的用例;但是,在窗体运行之前手动构建控件是非常不寻常的 - 在大多数动态控件生成的情况下,窗体已启动并正在运行 - 动态生成是对某些用户操作的响应。我建议使用设计器进行一般 UI 布局。

【讨论】: