RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 882473
Accepted
Aleksey
Aleksey
Asked:2020-09-18 05:12:19 +0000 UTC2020-09-18 05:12:19 +0000 UTC 2020-09-18 05:12:19 +0000 UTC

打开子窗体时如何关闭主窗体?

  • 772

打开子窗口的主窗体按钮的处理程序。

private void button1_Click(object sender, EventArgs e)
        {  
            Form2 mainForm = new Form2(this); // передаю управление дочерней форме
            mainForm.ShowDialog();

        }

子窗体构造函数

public Form2(Form1 f)
        {
            InitializeComponent();
            f.Close();

        }

结果,当子项打开时,两个表单都关闭。

c#
  • 2 2 个回答
  • 10 Views

2 个回答

  • Voted
  1. Best Answer
    Uranus
    2020-09-18T11:32:14Z2020-09-18T11:32:14Z

    如果您在 Visual Studio 中创建一个新的 WinForms 项目并查看 Program.cs 文件中的代码,您可以看到应用程序已启动并带有以下行:

    Application.Run(new Form1());
    

    此代码隐式创建一个新的ApplicationContext实例,该实例订阅提交表单上的FormClosed事件。当事件发生时FormClosed,ApplicationContext调用Application.ExitThread方法,该方法关闭所有窗口并终止应用程序。

    您可以创建自己的 ApplicationContext,它允许您根据需要管理应用程序的生命周期。例如,这样的应用程序永远不会自行终止,它需要从任务管理器中终止。

    public class MyApplicationContext :ApplicationContext {
      public MyApplicationContext(Form startupForm) {
        startupForm.Show();
      }
    }
    // ..
    Application.Run(new MyApplicationContext(new Form1()));
    

    要在且仅在最近的表单关闭时终止应用程序,您可以使用Application.OpenForms属性检查是否至少打开了一个表单。

    public class MyApplicationContext :ApplicationContext {
      public MyApplicationContext(Form startupForm) {
        startupForm.FormClosed += OnFormClosed;
        startupForm.Show();
      }
    
      private void OnFormClosed(object sender, FormClosedEventArgs e) {
        if (Application.OpenForms.Count > 0) {
          foreach (Form form in Application.OpenForms) {
            form.FormClosed -= OnFormClosed;
            form.FormClosed += OnFormClosed;
          }
        }
        else ExitThread();
      }
    }
    

    现在主要的只是确保用户有机会关闭所有表单。我们不能让最后一个表单在右上角没有按钮,并且不处理 Alt + F4。


    但是,如果您将上述方法应用于您的示例,它仍然不起作用。

    1. 您在孩子的构造函数中关闭调用表单。此时子窗体还没有打开,Application.OpenForms会为空,导致应用程序终止。

      • 您可以将关闭调用表单的代码移动到OnShown.

        public partial class Form2 : Form {
          private Form PrevForm;
          private Form2() {
            InitializeComponent();
          }
        
          public Form2(Form f) : this() {
            PrevForm = f;
          }
        
          protected override void OnShown(EventArgs e) {
            base.OnShown(e);
            PrevForm.Close();
            PrevForm = null;
          }
        }
        
      • 并且更容易使调用表单自行关闭。

        private void simpleButton1_Click(object sender, EventArgs e) {
          Form2 mainForm = new Form2(this); // передаю управление дочерней форме
          mainForm.ShowDialog();
          Close();
        }
        
    2. ShowDialog方法打开一个模式窗口。它取决于父窗口,并随之关闭。如果调用窗体是当前打开的唯一窗口,它会自动成为Form2. 要断开与调用表单的链接,请Form2使用Show方法显示。


    奖金

    在这种情况下,您可能不希望最初显示的表单在关闭后仍保留在内存中。但是,Form1这是一个方法局部变量Main。对的引用Form1将保留在堆栈中,直到应用程序终止。

    为了不创建局部变量,您可以更改 MyApplicationContext,使其自动在其构造函数中创建第一个表单。例如,传递给构造函数的不是表单的实例,而是对该实例可以创建的方法的引用。

    public MyApplicationContext(Func<Form> formFactory) {
      Form startupForm = formFactory();
      startupForm.FormClosed += OnFormClosed;
      startupForm.Show();
    }
    // ..
    Application.Run(new MyApplicationContext(() => new Form1()));
    

    附言

    这个想法是应用程序从一个输入登录名和密码的表单开始,这个表单首先出现,这意味着主要的。按下登录按钮后,登录和密码输入表单消失,主窗口出现。

    public class MyApplicationContext :ApplicationContext {
      public MyApplicationContext() {
        Form loginForm = new LoginForm();
        loginForm.UserCancelledLogin += OnUserCancelledLogin;
        loginForm.UserAuthorized += OnUserIsAuthorised;
      }
    
      private void OnUserCancelledLogin(object sender, EventArgs e) {
        ExitThread();
      }
    
      private void OnUserAuthorised(object sender, EventArgs e) {
        Form loginForm = (Form)sender;
        loginForm.Close();
        Form mainForm = new MainForm();
        mainForm.FormClosed += OnformClosed();
        mainForm.Show();
      }
    
      private void OnFormClosed(object sender, FormClosedEventArgs e) {
        ExitThread();
      }
    }
    
    • 2
  2. tym32167
    2020-09-18T05:42:56Z2020-09-18T05:42:56Z

    这取决于您的应用程序是如何启动的。如果您的应用程序只是等待主窗体关闭,那么当您关闭它时,应用程序将退出,并且所有其他窗体都将关闭。

    关闭主窗体有什么意义?你打算再回到她身边吗?

    如果你仍然需要从屏幕上移除主窗体,你可以隐藏它,例如,像这样

    Form2 mainForm = new Form2(); // передаю управление дочерней форме
    this.Hide();
    mainForm.ShowDialog();
    

    好吧,例如,如果在关闭子窗体后,您需要再次显示主窗体

    Form2 mainForm = new Form2(); // передаю управление дочерней форме
    this.Hide();
    mainForm.ShowDialog();
    this.Show();
    
    • 1

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5