我以为先登陆后启动应用主程序是一个很经典的问题,基本上若是要写一个应用程序都会用到这个的小环节。我在这个问题上挣扎了大半天才找到解决方案,个人实现方法我以为有点不正宗,若是有哪位高手知道更好的方法欢迎留言指导!!html
首先来讲一下传统C#在WinForm中的实现方法,基本上是在Main函数中根据第一个启动窗口的DialogResult来判断是否实例第二个窗口,DialogResult是在第一个窗口中根据登陆状况来设置的。代码以下app
第一个登陆窗口中设置DialogResult的代码:ide
this.DialogResult = DialogResult.OK;函数
this.Close();this
From: http://www.itc8.cn/a/bianchengleyuan/2011/0126/216.htmlspa
参考WinFrom中的这个基本想法,在WPF中实现。我重写了OnStartup函数:.net
死活都是只能启动第一个窗口登陆,而后第二个窗口没法呈现出来。调试后发现main窗口已经实例化了可是ShowDialog()貌似彻底不起做用。纠结了。。调试
这个问题的可能缘由有:orm
1. MainWindow也就是我要建立的第二个主窗口没有实例化成功;htm
2. DialogResult错误致使没有进入MainWindow的实例和显示过程;
3. 第一个窗口在做祟。
通过调试排除第1、二中可能,那么确定就是第一个窗口设置不对或者哪里出问题了。Google了一下别人WPF的方法,发现有一篇文章中提到了须要将WPF的ShutDownMode设置为OnExplicitShutdown才行,试了一下,果真生效了!只须要很简单的在Main主函数修改Application的ShutdownMode,修改代码以下
让咱们来看看这个ShutdownMode是何方神圣。ShutdownMode能够设置为一个ShutdownMode 枚举值,包括三种:OnLastWindowClose、OnMainWindowClose、OnExplicitShutdown,默认值是OnLastWindowClose。若是将 ShutdownMode 设置为 OnLastWindowClose,则 Windows Presentation Foundation (WPF) 会在应用程序中的最后一个窗口关闭时隐式调用 Shutdown,即便任何当前已经实例化的窗口被设置为主窗口也是如此(MSDN: http://goo.gl/fAyrD )。最后一句是关键:即便任何当前已经实例化的窗口被设置为主窗口也是如此。由于WPF中默认将在Application中实例化的第一个 Window 对象的引用自动设置为MainWindow。
也就是说当咱们实例化第一个窗口的时候,它被认为是一个MainWindow,因此当它被关闭的时侯WPF就已经隐式调用了ShutDown因此以后咱们在怎么实例化窗口都是徒劳。这就是为何把ShutdownMode设为显示关闭这样就能够避免上面的问题了。须要注意的是在OnStartUp中记得调用App.Shutdown()来关闭Application哦