【问题标题】:Closing Parent without closing child关闭父级而不关闭子级
【发布时间】:2012-09-02 01:05:38
【问题描述】:

我有一个项目,其中会弹出一个设置对话框(父级)。当用户点击继续时,会打开一个主对话框(子级)。 从主对话框中,用户可以重新编辑设置对话框(父)。当用户单击 X 关闭设置对话框时,应用程序终止。 我认为这是因为我们关闭了 Parent 并且它处理了它的所有孩子

是否可以在不关闭主对话框(子项)的情况下关闭父项(或隐藏它)? 如果没有,以下修复会起作用吗? 以父级身份打开主对话框并使其打开设置对话框(子级)

【问题讨论】:

标签: c# winforms dialog


【解决方案1】:

Program.cs 文件中,你可能有这样的函数:

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

此函数是您的应用程序的入口点。 Application.Run() 函数运行应用程序的主循环。图形应用程序的 主循环 是事件处理程序触发事件、更新 UI 等的地方。如果某个事件(例如按下按钮)处理时间过长,则 UI 会挂起。为了防止这种情况发生,可以使用线程。

Application.Run()函数被重载了,所以如果函数有参数(本例中为new Form1()),窗体就变成了'main'窗体,所以当窗体关闭时主循环会退出。

要解决这个问题,你需要去掉参数,这会使主循环在窗体关闭时运行而不关闭:

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run();
    }

但是,这会产生两个问题:

  1. 启动时不显示表单,因为我们从Main 函数中删除了它。要解决这个问题,您需要在主函数中创建一个新表单,并显示它:

    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
    
        Form1 form = new Form1();
        form.Show();
    
        Application.Run();
    }
    
  2. 当您关闭表单时,应用程序不会退出。如果您关闭所有表单,该进程仍将运行,因此您需要在希望应用程序退出时调用Application.Exit();(例如表单关闭事件)。

【讨论】:

    【解决方案2】:

    或者,您无法理解 modal 窗口没有父窗口就无法生存。当父级最小化时,所有的模态表单都被隐藏了。当父级关闭时,模态表单也会发生同样的情况。

    因此,在父母去世后欺骗模型表单以使其保持活力是一种不好的做法。尽量保持第二个形式与第一个形式相同的模式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多