closures窗体没有退出应用程序

我目前正在研究一个小项目,并希望得到一些帮助。

我有两种forms,第一种是login窗口,第二种是主程序。 我遇到的问题是,当我用this.Close()closuresform1this.Close()它正在退出整个程序。

我有一种感觉,我需要使用线程或类似的东西,但我找不到合适的资源来解决我的问题。

谢谢。

Solutions Collecting From Web of "closures窗体没有退出应用程序"

您可以隐藏第一个窗体而不是关闭它:

 this.Hide(); Form2 form2 = new Form2(); form2.Show(); 

难道你不能改变你的program.cs,以便它运行的主要形式,并在主窗体的创建,并显示一个登录表单,然后隐藏自己(等待登录发生自己显示)启动?

如果您使用的是WPF,则可以在关闭登录表单之前将Application.MainWindow设置为第二个“主”窗口。

Program.cs是你主要功能的地方。 如果您使用Visual Studio将项目创建为Windows应用程序,那么主程序中会有一个运行在启动程序时打开的窗体的功能。 只需从主登录表单中获取登录信息,然后调用第二个窗口即可。 这里是一个例子:

 [STAThread] private static void Main(string[] args) { //there's some other code here that initializes the program //Starts the first form (login form) Application.Run(new form1()); //Get the login info here somehow. Maybe save in public members of form1 or // in a global utilities or global user class of some kind //Run the main program Application.Run(new mainProgramForm()); } 

编辑:忘记的东西

我忘了提及,如果你从登录表单获得成员,你将不得不首先实例化它。 这不是一个好的技术,我建议在这个方面做全局用户类的想法,但是我有一个程序需要这个方法,而且我提到它,下面是这个例子:

 private static void Main(string[] args) { //there's some other code here that initializes the program //Instead of running a new form here, first create it and then run it Form1 form1 = new Form1(); //Creates the form Application.Run(form1); //Runs the form. Program.cs will continue after the form closes //Get the login info string username = form1.Username; string password = form1.Password; //Get rid of form1 if you choose form1.Dispose(); //Validate the user info //Run the main program Application.Run(new mainProgramForm()); } 

打开Program.cs – 在调用Application运行之前,您可以做很多事情,包括显示您的登录信息。 以下是我的一个项目的示例。 它试图找到数据库连接。 如果它不能,它会打开一个向导,并连接到访问或mssql。 如果打开是好的,它显示一个spalsh屏幕,最后运行应用程序,否则关闭。

 Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); DialogResult LclResult; EESDatabasePersistentData LclPersist; LclPersist = new EESDatabasePersistentData(); string LclDataType; string LclDatabase; string Lclserver; string Password; string UserID; if (!LclPersist.GetConnection(out Lclserver, out LclDatabase, out LclDataType, out UserID, out Password)) { // Run the connection wizard GetConnection(out Lclserver, out LclDatabase, out LclDataType, out UserID, out Password); } if (LclDataType == "ACCESS") InitDataAccess(LclDatabase); else if (LclDataType == "SQLSERVER") InitDataSQL(Lclserver, LclDatabase, UserID, Password); if (OpenGood) { if (!System.Diagnostics.Debugger.IsAttached) { FormSplash.Instance.SetupVersion(); /////////////////////////////////// // If we don't call do events // splash delays loading. Application.DoEvents(); FormSplash.Instance.Show(); } Application.DoEvents(); Application.Run(new FormMentorMain()); } else Application.Exit(); 

你的意见是什么创造类似的东西

任务栏图标

其称为托盘图标

所以用户可以close all formsapp still runninguser can go back to app any time

让我们开始编码(注意这是WPF应用程序)

 private NotifyIcon m_notifyIcon; private ContextMenuStrip m_contextMenu; private bool _ForceClose; public MainWindow() { InitializeComponent(); CreateNotifyIcon(); } private void CreateNotifyIcon() { m_contextMenu = new ContextMenuStrip(); ToolStripMenuItem mI1 = new ToolStripMenuItem { Text = "Open" }; mI1.Click += (sender, args) => Maximize(); ToolStripMenuItem mI2 = new ToolStripMenuItem { Text = "Exit" }; mI2.Click += (sender, args) => EndApplication(); m_contextMenu.Items.Add(mI1); m_contextMenu.Items.Add(mI2); //Initalize Notify Icon m_notifyIcon = new NotifyIcon { Text = "Application Title", Icon = new Icon("Icon.ico"), //Associate the contextmenustrip with notify icon ContextMenuStrip = m_contextMenu, Visible = true }; } 

我们有这些功能

 protected void Minimize() { Hide(); } protected void Maximize() { Show(); this.WindowState =WindowState.Normal; } protected void EndApplication() { Minimize(); Thread.Sleep(1000); _ForceClose = true; WindowState = WindowState.Normal; this.Close(); Environment.Exit(0); } 

并在Window Closing事件监听器(不要忘记添加它)

 private void Window_Closing(object sender, CancelEventArgs e) { if (_ForceClose == false) { e.Cancel = true; Minimize(); } } 

就是这样,希望它能帮助你