繁体   English   中英

在 Windows 窗体应用程序中单击按钮时隐藏一个窗体并显示另一个窗体

[英]Hiding a form and showing another when a button is clicked in a Windows Forms application

我正在做一个应用程序 Windows 窗体应用程序。 首先,出现某个表单,当用户点击下一步按钮后,该表单应该被隐藏并显示另一个表单。

我试着去做。 我设法隐藏了当前表单,但下一个不会显示。

这是我的尝试:

这是按钮的事件处理程序

private void button1_Click_1(object sender, EventArgs e)
{
    if (richTextBox1.Text != null)
    {
        this.Visible=false;


    }
    else
        MessageBox.Show("Insert Attributes First !");
}

这是主要功能:

static void Main()
{
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Form2 form2 = new Form2();
    Form1 form1 = new Form1();
    form2.Hide();
    Application.Run(form1);
    while (true)
    {
        if (form1.Visible == false)
            form2.Show();
    }
}

While 语句在 form1 关闭后才会执行 - 因为它在主消息循环之外。

删除它并将代码的第一位更改为:

private void button1_Click_1(object sender, EventArgs e)  
{  
    if (richTextBox1.Text != null)  
    {  
        this.Visible=false;
        Form2 form2 = new Form2();
        form2.show();
    }  
    else MessageBox.Show("Insert Attributes First !");  

}

但这并不是实现您想要做的事情的最佳方式。 而是考虑向导设计模式。

或者,您可以实现一个自定义 ApplicationContext 来处理两种表单的生命周期。 这里有一个实现闪屏的例子,它应该让你走上正确的道路。

http://www.codeproject.com/KB/cs/applicationcontextsplash.aspx?display=Print

private void button5_Click(object sender, EventArgs e)
{
    this.Visible = false;
    Form2 login = new Form2();
    login.ShowDialog();
}

要链接到您需要的表单:

Form2 form2 = new Form2();
        form2.show();

this.hide();

然后隐藏之前的表格

Application.Run() 之后的任何内容只会在主窗体关闭时执行。

您可以做的是按如下方式处理VisibleChanged事件:

static Form1 form1;
static Form2 form2;

static void Main()
{

    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    form2 = new Form2();
    form1 = new Form1();
    form2.Hide();
    form1.VisibleChanged += OnForm1Changed;
    Application.Run(form1);

}

static void OnForm1Changed( object sender, EventArgs args )
{
    if ( !form1.Visible )
    {
        form2.Show( );
    }
}

A) 主 GUI 线程将在调用 Application.Run 时无休止地运行,因此永远不会到达您的 while 循环

B)你永远不会想要像那样的无限循环(while(true) 循环)——它只会冻结线程。 不太确定你想在那里实现什么。

我会在 Main 方法中创建并显示“main”(初始)表单(就像 Visual Studio 默认为您所做的那样)。 然后在您的按钮处理程序中,创建另一个表单并显示它以及隐藏主表单(而不是关闭它)。 然后,确保主窗体在通过事件关闭时再次显示。 例子:

public partial class Form1 : Form
{
  public Form1()
  {
    InitializeComponent();
  }    

  private void button1_Click(object sender, EventArgs e)
  {      
    Form2 otherForm = new Form2();
    otherForm.FormClosed += new FormClosedEventHandler(otherForm_FormClosed);
    this.Hide();
    otherForm.Show();      
  }

  void otherForm_FormClosed(object sender, FormClosedEventArgs e)
  {
    this.Show();      
  }
}

我相信以下代码只会form1关闭运行

 while (true)
    {
        if (form1.Visible == false)
            form2.Show();
    }

为什么不从form1开始你的form2呢?

Form2 form2 = new Form2();
 private void button1_Click_1(object sender, EventArgs e)
    {
        if (richTextBox1.Text != null)
        {
            form1.Visible=false;
            form2.Show();

        }
        else MessageBox.Show("Insert Attributes First !");

    }

这是对我有用的代码,它已经足够好了。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Me.Hide()
    Form2.Show()
End Sub

结束类

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM