阻塞/解除阻塞winforms调用

a14dhokn  于 2023-03-03  发布在  其他
关注(0)|答案(3)|浏览(157)

我目前正面临这种情况,我需要你的帮助:
有两个winForms Form 1和Form 2,在form 1上单击按钮的事件将启动form 2。我想启动form 2并关闭(释放)form 1。
有两种方法调用form 2:
1)将阻塞调用与ShowDialog()一起使用;

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

    private void callForm2bt_Click(object sender, EventArgs e)
    {
      Form2 form2 = new Form2();
      form2.ShowDialog();
      this.Close();  
    }
  }
}

在本例中,一旦调用了form 2,我就不能关闭(释放)form 1。
2)通过Show()使用解除阻塞调用;

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

    private void callForm2bt_Click(object sender, EventArgs e)
    {
        Form2 form2 = new Form2();
        form2.Show();
        this.Close();

    }
  }
}

在这种情况下,一旦关闭(处理)了form 1,它就会自动处理form 2。
知道如何处理form 1并保持form 2的功能吗?
谢谢

piah890a

piah890a1#

或者执行相反操作:将Form2作为主窗体运行,并将其可见性设置为false,然后从该窗体启动Form1,从Form1完成后关闭该窗体并将Form2可见性设置为true。

static void Main()
{
    ...
    Application.Run(new Form2());//instead of Form1
}

public class Form2 ...
{
    //At From2.Load:
    private void Form2_Load(object sender, EventArgs e)
    {
        this.Hide();//the form2 will hide and show the form 1.
        Form1 form1 = new Form1(this);
        form1.Show();
    }
}

public class Form1...
{

    private Form2 _form2 = null;

    public Form1()
    { InitializeComponents();}

    public Form1(Form2 form2) : this()
    {
        _form2 = form2;
    }

    private void callForm2bt_Click(object sender, EventArgs e)
    {
        if (_form2 != null)
        {
            _form2.Show();
        }
        this.Close();
    }
}

或者使用当前方法但不关闭Form1,而是在完成后将其visability设置为false。通过调用this.Hide();this.Visable = false;类似于:

private void callForm2bt_Click(object sender, EventArgs e)
{
    Form2 form2 = new Form2();
    form2.Show();
    this.Hide();//this will hide the control from the user but it will still alive.
}

**编辑:**在第一个解决方案中,您还可以使用form1.ShowDialog(),并避免将Form2示例传递给Form1构造函数,因此:

//At From2.Load:
private void Form2_Load(object sender, EventArgs e)
{
    this.Hide();//the form2 will hide and show the form 1.
    Form1 form1 = new Form1();
    form1.ShowDialog();
    this.Show();//the form1 is closed so just show this again.
}
hyrbngr7

hyrbngr72#

从MSDN获取Application.Run(窗体)方法:
“此方法将事件处理程序添加到Closed事件的mainForm参数。该事件处理程序调用ExitThread以清理应用程序。”
http://msdn.microsoft.com/en-us/library/ms157902(VS.90).aspx
基本上,当主窗体退出时,所有消息泵都停止。
我不知道表单在实际应用程序中的作用,但您必须解决这个问题。以下是一些想法--正确的想法可能取决于您正在做什么:

  • 如果Form 1是某种对话框,则可以在Application. Run之前对其调用ShowDialog。例如:
static void Main() {
    Application.EnableVisualStyles();
    Application.SetCompatibleTextRenderingDefault(false);
    Form1 fm = new Form1();
    fm.ShowDialog();
    Application.Run(new Form2());
}

当Form 1关闭时,Form 2将打开。ShowDialog的返回值可用于确定是继续并打开Form 2,还是退出应用程序。

  • 另一种方法是调用Application.Run两次。Form 1可以设置一个标志来指示是否打开Form 2。

通常在我的应用程序中,Form 1是一种典型的对话框(例如注册表单等),所以第一个行为通常是我所做的。如果对话框被取消,那么我就不运行应用程序。

**编辑:**如果Form 1可以分支为多个其他表单,则可以让它通过字段将要打开的表单返回到Main。例如:

  • 在Form 1中增加一个公共字段“Form FormToOpen”,构造表单时设置为空。
  • 按下Form 1上的按钮时,为FormToOpen提供一个值。例如:“窗体到打开=新建窗体2()"。
  • 更改Application.Run行,如下所示:
if (fm.FormToOpen != null) Application.Run(fm.FormToOpen);

在这一点上,对于Form 1来说,使用更多的按钮来打开其他窗体是微不足道的。主函数不需要关于每个窗体的特殊知识,附加窗体也不需要关于Form 1的特殊知识。

k10s72fa

k10s72fa3#

考虑通过Form1的构造函数注入Form2示例,减少了类耦合,增加了灵活性,这样可以安全地处理form1,并保持form2的活动

相关问题