首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >阻塞/解除阻塞winforms调用

阻塞/解除阻塞winforms调用
EN

Stack Overflow用户
提问于 2011-07-26 23:17:42
回答 3查看 238关注 0票数 2

我目前正面临着这种情况,我需要你的帮助:

有两个winForms Form1和Form2,form1上的单击按钮事件将启动form2。我想启动form2并关闭(处置) form1。

我有两种调用Form2的方法:

1)通过ShowDialog()使用阻塞调用;

代码语言:javascript
复制
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();  
    }
  }
}

在这种情况下,一旦调用了form2,我就不能关闭(处置) form1。

2)使用带有Show()的非阻塞调用;

代码语言:javascript
复制
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();

    }
  }
}

在这种情况下,一旦form1被关闭(释放),它将自动释放form2。

你知道如何处理form1并保持form2的功能吗?

谢谢

EN

回答 3

Stack Overflow用户

发布于 2011-07-26 23:23:00

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

代码语言:javascript
复制
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,而是在完成后将其可见性设置为false。通过像这样调用this.Hide();this.Visable = false;

代码语言:javascript
复制
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构造函数,因此:

代码语言:javascript
复制
//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.
}
票数 1
EN

Stack Overflow用户

发布于 2011-07-26 23:33:22

从MSDN for Application.Run(Form)方法:

“此方法向Closed事件的mainForm参数添加事件处理程序。事件处理程序调用ExitThread以清除应用程序。”

http://msdn.microsoft.com/en-us/library/ms157902(VS.90).aspx

基本上,当您的主窗体退出时,所有消息泵都会停止。

我不知道表单在您的实际应用程序中做了什么,但是您必须解决这个问题。一些想法--正确的想法可能取决于你在做什么:

  • 如果Form1是某种对话框,你可以在Application.Run之前对它调用ShowDialog。例如:

static void Main() { Application.EnableVisualStyles();Application.SetCompatibleTextRenderingDefault(false);Form1 fm =新Form1();fm.ShowDialog();Application.Run(新Form2());}

当Form1关闭时,Form2将被打开。可以使用ShowDialog的返回值来确定是否继续并打开Form2,或者退出application.

  • Another可能是调用Application.Run两次。Form1可以设置一个标志,指示是否打开Form2。

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

编辑:如果Form1可以分支到许多其他表单,您可以让它返回表单,以便通过字段打开到Main。例如:

  • 向Form1添加一个公共字段"Form FormToOpen“。将其设置为null当表单为constructed.
  • When时,Form1上的按钮被按下,则给FormToOpen一个值。例如:"FormToOpen = Form2()".
  • Change Application.Run行,如下所示:

if (fm.FormToOpen != null) Application.Run(fm.FormToOpen);

在这一点上,对于Form1来说,拥有更多用于打开其他表单的按钮将是微不足道的。main函数不需要每个表单的专门知识,其他表单也不需要Form1的专门知识。

票数 0
EN

Stack Overflow用户

发布于 2011-07-26 23:20:16

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6832382

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档