using ( new MainForm()) { Application.Run(); }
然后在NotifyIcon的Click事件中显示MainForm就可以了。 可以参考他的文章( )。 这个方法的确是解决了这个问题;但是由于切断了主窗体和Application之间的联系,因此必须使用Application.Exit来关闭程序。这样做仍然有些不自然,且有一些安全隐患;那么到底有没有更好的方法呢? 一个方法就是使用ApplicationContext。 ApplicationContext实质上就是一个Application与主窗体之间的连接器,掌管着二者之间的互动关系。 其中最主要的,就是负责在主窗体关闭时结束线程。既然如此,我们只要根据需要自定义一个ApplicationContext就可以了: internal class HideOnStartupApplicationContext : ApplicationContext { private Form mainFormInternal; // 构造函数,主窗体被存储在mainFormInternal public HideOnStartupApplicationContext(Form mainForm) { this.mainFormInternal = mainForm; this.mainFormInternal.Closed += new EventHandler(mainFormInternal_Closed); } // 当主窗体被关闭时,退出应用程序 void mainFormInternal_Closed( object sender, EventArgs e) { Application.Exit(); } }
随后,我们只需要在Main当中像下面这样调用既可: static void Main() { //... HideOnStartupApplicationContext context = new HideOnStartupApplicationContext( new MainForm()); Application.Run(context); }
这样,MainForm根本不用去考虑窗口与应用程序的关系,安安心心做它的“主窗口”就可以了。 此外,既然明白了ApplicationContext掌管着窗口结束与程序结束的关系,我们就可以用它来做出一些有趣的东西: 比如MSDN上就给出了一个“双主窗口”——同时显示2个Form,关闭其中任何一个都不会导致程序结束,只有全部关闭了才会结束程序。有兴趣的朋友可以参看MSDN关于ApplicationContext的资料,那里给出了详细的说明和范例代码。 再如,要设计一个“向导(Wizard)”类的程序,使用ApplicationContext也是最佳选择——它可以轻松控制Form到Form的流程,以及Form的启动与关闭,使得你的每个Form更加模块化,减少Form之间的依赖。