如何使多种形式工作?

How to make many forms working?

我有一个包含许多表单的应用程序,用户可以从任务栏中 运行。但是当用户 运行 的 2 个表单时,只有最后一个会起作用,直到他关闭它。第二个窗体关闭后,第一个窗体又开始工作了。

如何使许多表单一直工作,就像 window 中的其他程序一样(例如,同一个 Web 浏览器的许多 windows)?

这是我在网上找到的部分代码,我用它来显示和隐藏表单。

        public MyApplicationContext()
    {

        MenuItem SmsMenuItem = new MenuItem("SMS", new EventHandler(ShowSms));
        MenuItem ExitMenuItem = new MenuItem("Wyjdź", new EventHandler(Exit));
        MenuItem HistoryMenuItem = new MenuItem("Historia", new EventHandler(ShowHistory));


        NotifyIcon notifyIcon = new NotifyIcon();
        notifyIcon.Icon = SMSapp.Properties.Resources.Icon1;
        notifyIcon.ContextMenu = new ContextMenu(new MenuItem[] { SmsMenuItem, HistoryMenuItem, ExitMenuItem });
        notifyIcon.Visible = true;
    }

    void ShowSms(object sender, EventArgs e)
            {
        if (Globals.globals.Set.DBConn)
        {
            UnitOfWork uow = new UnitOfWork();
            using (SmsForm sm = new SmsForm(uow))
            {
                if (sm.Visible)
                    sm.Focus();
                else
                    sm.ShowDialog();
            }
        }
        else
        {

            using (SmsForm sm = new SmsForm())
            {
                if (sm.Visible)
                    sm.Focus();
                else
                    sm.Show();
            }
        }
    }

    void ShowHistory(object sender, EventArgs e)
    {
        if (Globals.globals.Set.DBConn)
        {
            UnitOfWork uow = new UnitOfWork();
            using (HistoryForm sm = new HistoryForm(uow))
            {
                if (sm.Visible)
                    sm.Focus();
                else
                    sm.ShowDialog();
            }
        }
        else
        {
            using (HistoryForm sm = new HistoryForm())
            {
                if (sm.Visible)
                    sm.Focus();
                else
                    sm.ShowDialog();
            }
        }
    }

    void Exit(object sender, EventArgs e)
    {
        notifyIcon.Visible = false;
        Application.Exit();
    }

问题是您必须使用 Show() 而不是 ShowDialog() 以便父窗体和其他窗体也可以单击。

同样去掉方法中的using,因为using里面的语句执行完后,using会处理掉新的form,导致form消失。

void ShowSms(object sender, EventArgs e)
{
   SmsForm sm = new SmsForm();                
   if (sm.Visible)
     sm.Focus();
   else
     sm.Show();
}

编辑: 根据新信息更新了答案

您不需要 using 创建表单,因为 using 基本上是这样做的:

try{
  SmsForm sm = new SmsForm(); 
  //some code
}
finally{
  sm.Dispose(); 
} 

我会做成这样:

void ShowSms(object sender, EventArgs e)
{
  SmsForm sm; 
  if (Globals.globals.Set.DBConn)
  {
    UnitOfWork uow = new UnitOfWork();
    sm = new SmsForm(uow);                    
  }
  else
    sm = new SmsForm();
  if (sm.Visible)
    sm.Focus();
  else
    sm.Show();
}

现在,如果您的 UnitOfWork class 中有某些东西需要处理,比如打开数据库连接或其他东西,那么在您使用 Disposable 的 class/method 中使用 using目的。