如何使多种形式工作?

时间:2016-08-02 07:00:18

标签: c# winforms tray

我有一个应用程序,有许多表单,用户可以从托盘运行。但是当用户运行2个表单时,只有最后一个表单才能运行,直到他关闭它。第二个表单关闭后,第一个表单再次运行。

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

以下是我在互联网上找到的代码的一部分,我将其用于显示和隐藏表单。

        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();
    }

1 个答案:

答案 0 :(得分:1)

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

同样从方法中删除使用,因为在使用中的语句执行后使用处理新表单,这使表单消失。

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

编辑:更新了有关新信息的答案

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

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类中有某些东西需要处理,比如打开数据库连接或者使用那个使用Disposable对象的类/方法中的using