c#打开一个新窗体然后closures当前窗体?
例如,假设我在表单1中,那么我想:
- 打开表单2(从表单1中的一个button)
- closures表格1
- 关注表单2
史蒂夫的解决scheme不起作用。 当调用this.Close()时,当前表单与form2一起处理。 因此,你需要隐藏它,并设置form2.Closed事件来调用this.Close()。
private void OnButton1Click(object sender, EventArgs e) { this.Hide(); var form2 = new Form2(); form2.Closed += (s, args) => this.Close(); form2.Show(); }
试着做这个…
{ this.Hide(); Form1 sistema = new Form1(); sistema.ShowDialog(); this.Close(); }
这个问题的生命线:
Application.Run(new Form1());
这可能可以在你的program.cs文件中find。
这一行指示form1处理消息循环 – 换句话说,form1负责继续执行应用程序 – 当form1closures时,应用程序将被closures。
有几种方法可以处理这个问题,但是所有这些方式都不能closuresform1。
(除非我们将项目types更改为Windows窗体应用程序以外的其他项目)
我认为最容易的就是创造3种forms:
-
form1 – 将保持不可见状态并充当pipe理员,如果需要,可以将其分配为处理托盘图标。
-
form2 – 将有button,点击时将closuresform2并打开form3
-
form3 – 将具有需要打开的其他表单的angular色。
这里是一个示例代码来实现这一点:
(我还添加了一个例子来closures从第三种forms的应用程序)
static class Program { /// <summary> /// The main entry point for the application. /// </summary> [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new Form1()); //set the only message pump to form1. } } public partial class Form1 : Form { public static Form1 Form1Instance; public Form1() { //Everyone eveywhere in the app should know me as Form1.Form1Instance Form1Instance = this; //Make sure I am kept hidden WindowState = FormWindowState.Minimized; ShowInTaskbar = false; Visible = false; InitializeComponent(); //Open a managed form - the one the user sees.. var form2 = new Form2(); form2.Show(); } } public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { var form3 = new Form3(); //create an instance of form 3 Hide(); //hide me (form2) form3.Show(); //show form3 Close(); //close me (form2), since form1 is the message loop - no problem. } } public partial class Form3 : Form { public Form3() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form1.Form1Instance.Close(); //the user want to exit the app - let's close form1. } }
注意:使用面板或dynamic加载用户控件是更具学术性和更好的行业生产标准 – 但在我看来,你只是试图推断事情的工作原理 – 为此目的,这个例子是更好的。
现在这个原则被理解了,我们只用两种forms来尝试:
-
第一种forms将像前一个示例一样担当pipe理者的angular色,但也将呈现第一个屏幕 – 所以它不会被隐藏起来。
-
第二种forms将扮演显示下一个屏幕的angular色,通过点击一个button将closures应用程序。
public partial class Form1 : Form { public static Form1 Form1Instance; public Form1() { //Everyone eveywhere in the app show know me as Form1.Form1Instance Form1Instance = this; InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { //Make sure I am kept hidden WindowState = FormWindowState.Minimized; ShowInTaskbar = false; Visible = false; //Open another form var form2 = new Form2 { //since we open it from a minimezed window - it will not be focused unless we put it as TopMost. TopMost = true }; form2.Show(); //now that that it is topmost and shown - we want to set its behavior to be normal window again. form2.TopMost = false; } } public partial class Form2 : Form { public Form2() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { Form1.Form1Instance.Close(); } }
如果你改变了前面的例子 – 从项目中删除form3。
祝你好运。
你没有具体的,但它看起来像你试图做我的Win窗体应用程序做什么:从login表单开始,然后成功login后,closures该表单,并把焦点放在主窗体。 以下是我如何做到这一点:
-
使创build窗体成为可能; 这是我的Program.cs的样子:
[STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); Application.Run(new frmMain()); }
-
在我的frmLogin中,创build一个公共属性,将其初始化为false,并且只有在成功login时才会设置为true:
public bool IsLoggedIn { get; set; }
-
我的frmMain看起来像这样:
private void frmMain_Load(object sender, EventArgs e) { frmLogin frm = new frmLogin(); frm.IsLoggedIn = false; frm.ShowDialog(); if (!frm.IsLoggedIn) { this.Close(); Application.Exit(); return; }
没有成功login? 退出应用程序。 否则,用frmMain进行。 由于它是启动窗体,当它closures时,应用程序结束。
private void buttonNextForm(object sender, EventArgs e) { NextForm nf = new NextForm();//Object of the form that you want to open this.hide();//Hide cirrent form. nf.ShowModel();//Display the next form window this.Close();//While closing the NextForm, control will come again and will close this form as well }
在form1中使用这个代码片段。
public static void ThreadProc() { Application.Run(new Form()); } private void button1_Click(object sender, EventArgs e) { System.Threading.Thread t = new System.Threading.Thread(new System.Threading.ThreadStart(ThreadProc)); t.Start(); this.Close(); }
我从这里得到这个
我认为这是更容易:)
private void btnLogin_Click(object sender, EventArgs e) { //this.Hide(); //var mm = new MainMenu(); //mm.FormClosed += (s, args) => this.Close(); //mm.Show(); this.Hide(); MainMenu mm = new MainMenu(); mm.Show(); }
其他答案已经描述了许多不同的方法。 然而,其中许多涉及ShowDialog()
或form1
保持打开,但隐藏。 在我看来,最好和最直观的方法是简单地closuresform1
,然后从外部位置创buildform2
(即不是从这两个表单中的任何一个)。 在Main
中创buildform1
的情况下, form2
可以简单地使用Application.Run
创build,就像之前的form1
一样。 以下是一个示例场景:
我需要用户input他们的凭据,以便我以某种方式validation它们。 之后,如果authentication成功,我想向用户显示主应用程序。 为了做到这一点,我使用两种forms: LogingForm
和MainForm
。 LoginForm
有一个标志,用于确定authentication是否成功。 然后使用此标志决定是否创buildMainForm
实例。 这两种forms都不需要了解其他forms,两种forms都可以优雅地打开和closures。 这是这个代码:
class LoginForm : Form { bool UserSuccessfullyAuthenticated { get; private set; } void LoginButton_Click(object s, EventArgs e) { if(AuthenticateUser(/* ... */)) { UserSuccessfullyAuthenticated = true; Close(); } } } static class Program { [STAThread] static void Main() { LoginForm loginForm = new LoginForm(); Application.Run(loginForm); if(loginForm.UserSuccessfullyAuthenticated) { // MainForm is defined elsewhere Application.Run(new MainForm()); } } }
假设您有两个表单,第一个表单名称是Form1,第二个表单名称是Form2。您必须从Form1跳转到Form2,在此处input代码。 编写如下代码:
在Form1上,我有一个名为Button1的button,在它的点击选项中写下面的代码:
protected void Button1_Click(Object sender,EventArgs e) { Form frm=new Form2();// I have created object of Form2 frm.Show(); this.Visible=false; this.Hide(); this.Close(); this.Dispose(); }
希望这段代码能帮助你
//if Form1 is old form and Form2 is the current form which we want to open, then { Form2 f2 = new Form1(); this.Hide();// To hide old form ie Form1 f2.Show(); }
此代码可以帮助您:
Master frm = new Master(); this.Hide(); frm.ShowDialog(); this.Close();
this.Visible = false; //or // will make LOgin Form invisivble //this.Enabled = false; // or // this.Hide(); Form1 form1 = new Form1(); form1.ShowDialog(); this.Dispose();
如果你有两种forms:frm_form1和frm_form2。下面的代码是用来打开frm_form2和closuresfrm_form1的(对于windows窗体应用程序)
this.Hide();//Hide the 'current' form, ie frm_form1 //show another form ( frm_form2 ) frm_form2 frm = new frm_form2(); frm.ShowDialog(); //Close the form.(frm_form1) this.Close();
我会通过这样做来解决它:
private void button1_Click(object sender, EventArgs e) { Form2 m = new Form2(); m.Show(); Form1 f = new Form1(); this.Visible = false; this.Hide(); }