单击closuresbutton时隐藏表单而不是closures

当用户单击表单上的Xbutton时,如何隐藏它而不是closures它?

我已经在FormClosing尝试this.hide() ,但它仍然closures窗体。

像这样:

 private void MyForm_FormClosing(object sender, FormClosingEventArgs e) { if (e.CloseReason == CloseReason.UserClosing) { e.Cancel = true; Hide(); } } 

(通过Tim Huffman )

我在之前的回答中评论过,但认为我会提供自己的。 根据你的问题,这段代码与最上面的答案类似,但增加了另一个提到的function:

 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { if (e.CloseReason == CloseReason.UserClosing) { e.Cancel = true; Hide(); } } 

如果用户只是在窗口中点击X ,窗体将隐藏; 如果任何其他如任务pipe理器, Application.Exit()或Windowsclosures,表单将被正确closures,因为return语句将被执行。

来自MSDN :

要取消表单的closures,请将传递给您的事件处理程序的FormClosingEventArgsCancel属性设置为true

所以取消然后隐藏。

如果你想使用显示/隐藏方法,我已经自己做了一个菜单结构我最近做了一个游戏…这就是我做的:

创build一个button,并为你想要做什么,例如一个“下一步”button,并将下面的代码匹配到您的程序。 对于这个例子中的下一个button,代码将是:

 btnNext.Enabled = true; //This enabled the button obviously this.Hide(); //Here is where the hiding of the form will happen when the button is clicked Form newForm = new newForm(); //This creates a new instance object for the new form CurrentForm.Hide(); //This hides the current form where you placed the button. 

以下是我在游戏中使用的代码片段,以帮助您了解我想要解释的内容:

  private void btnInst_Click(object sender, EventArgs e) { btnInst.Enabled = true; //Enables the button to work this.Hide(); // Hides the current form Form Instructions = new Instructions(); //Instantiates a new instance form object Instructions.Show(); //Shows the instance form created above } 

所以有一个显示/隐藏方法的几行代码,而不是做这么简单的任务一个巨大的代码段。 我希望这有助于解决您的问题。

请注意,在这样做时(多个答案已经发布),您还需要find一种方法来允许用户在他们真正想要的时候closures表单。 如果用户试图在应用程序运行时closures机器,这真的会成为一个问题,因为(至less在某些操作系统上)这会阻止操作系统正确或有效地closures。

我解决这个问题的方法是检查堆栈跟踪 – 当用户尝试点击X时与系统尝试结束应用程序以准备closures时有区别。

 private void Form1_FormClosing(object sender, FormClosingEventArgs e) { StackTrace trace = new StackTrace(); StackFrame frame; bool bFoundExitCommand = false; for (int i = 0; i < trace.FrameCount; i++) { frame = trace.GetFrame(i); string methodName = frame.GetMethod().Name; if (methodName == "miExit_Click") { bFoundExitCommand = true; Log("FormClosing: Found Exit Command ({0}) - will allow exit", LogUtilityLevel.Debug3, methodName); } if (methodName == "PeekMessage") { bFoundExitCommand = true; Log("FormClosing: Found System Shutdown ({0}) - will allow exit", LogUtilityLevel.Debug3, methodName); } Log("FormClosing: frame.GetMethod().Name = {0}", LogUtilityLevel.Debug4, methodName); } if (!bFoundExitCommand) { e.Cancel = true; this.Visible = false; } else { this.Visible = false; } } 

这是Modal表单的行为。 当你使用form.ShowDialog()你正在询问这个行为。 原因是form.ShowDialog不会返回,直到窗体被隐藏或销毁。 所以当窗体被隐藏的时候,窗体内部的窗体会被破坏,使窗体返回。

如果要显示和隐藏表单,则应使用无模式对话框模型http://msdn.microsoft.com/en-us/library/39wcs2dh(VS.80).aspx

form.Show()立即返回,你可以显示和隐藏这个窗口,只要你明确的销毁它就不会被销毁。

当你使用非模式forms的子模式时,你还需要使用Application.RunApplication.DoEvents循环运行一个消息泵。 如果创build表单的线程退出,那么表单将被销毁。 如果该线程不运行泵,那么它所拥有的表单将无响应。

编辑:这听起来像ApplicationContext旨在解决的事情。 http://msdn.microsoft.com/en-us/library/system.windows.forms.applicationcontext.aspx

基本上,你从ApplicationContext派生一个类,将ApplicationContext的一个实例作为parameter passing给Application.Run()

 // Create the MyApplicationContext, that derives from ApplicationContext, // that manages when the application should exit. MyApplicationContext context = new MyApplicationContext(); // Run the application with the specific context. Application.Run(context); 

您的应用程序上下文将需要知道什么时候退出应用程序,并且隐藏窗体不应该退出应用程序。 当应用程序退出的时候。 您的应用程序上下文或表单可以调用应用程序上下文的ExitThread()方法来终止消息循环。 此时Application.Run()将返回。

如果不了解更多有关你的forms和你决定什么时候隐藏表格以及何时退出的规则,那么就不可能更具体。

基于其他的回应,你可以把它放在你的表单代码中:

  protected override void OnFormClosing(FormClosingEventArgs e) { base.OnFormClosing(e); if (e.CloseReason == CloseReason.UserClosing) { e.Cancel = true; Hide(); } } 

重写是首选: MSDN “OnFormClosing方法还允许派生类处理事件,而无需附加委托,这是在派生类中处理事件的首选技术。