WPF中实现先登录后启动主程序的方法
我覺得先登錄后啟動應用主程序是一個很經典的問題,基本上如果要寫一個應用程序都會用到這個的小環節。我在這個問題上掙扎了大半天才找到解決方案,我的實現方法我覺得有點不正宗,如果有哪位高手知道更好的方法歡迎留言指導!!
首先來說一下傳統C#在WinForm中的實現方法,基本上是在Main函數中根據第一個啟動窗口的DialogResult來判斷是否實例第二個窗口,DialogResult是在第一個窗口中根據登錄情況來設置的。代碼如下
| 主函數代碼: static class Program { ??? [STAThread] ??? static void Main() ??? { ??????? try ??????? { ??????????? Application.EnableVisualStyles(); ??????????? Application.SetCompatibleTextRenderingDefault(false); ??????????? frmLogin frm = new frmLogin(); //登錄 ??????????? if (frm.ShowDialog() == DialogResult.OK) ??????????? { ??????????????? Application.Run(new frmMain()); //主窗體 ??????????? } ??????????? else ??????????? { ??????????????? Application.Exit(); ??????????? } ??????? } ??????? catch (Exception ex) ??????? { ??????????? MessageBox.Show(ex.Message, "系統登陸", MessageBoxButtons.OK, MessageBoxIcon.Stop); ??????????? Application.Exit(); ??????? } ??? } } 第一個登錄窗口中設置DialogResult的代碼: this.DialogResult = DialogResult.OK; this.Close(); From: http://www.itc8.cn/a/bianchengleyuan/2011/0126/216.html |
參考WinFrom中的這個基本想法,在WPF中實現。我重寫了OnStartup函數:
| protected override void OnStartup(StartupEventArgs e) ??????? { ??????????? base.OnStartup(e); ? ??????????? Login loginWindow = new Login(); ??????????? loginWindow.ShowDialog(); ??????????? result = loginWindow.DialogResult; ??????????? username = loginWindow.UserName; ??????????? if (true == result) ??????????? { ??????????????? MainWindow main = new MainWindow(username); ??????????????? main.ShowDialog(); ??????????? } ?????????? ??????? } //這里需要注意的一點就是上面要用ShowDialog(),而不能直接調用Show(),Show()是不會返回任何結果的,只有用ShowDialog()才能渠道DialogResult ? |
死活都是只能啟動第一個窗口登錄,然后第二個窗口無法呈現出來。調試后發現main窗口已經實例化了但是ShowDialog()貌似完全不起作用。糾結了。。
這個問題的可能原因有:
1.?????? MainWindow也就是我要創建的第二個主窗口沒有實例化成功;
2.?????? DialogResult錯誤導致沒有進入MainWindow的實例和顯示過程;
3.?????? 第一個窗口在作祟。
經過調試排除第一、二中可能,那么肯定就是第一個窗口設置不對或者哪里出問題了。Google了一下別人WPF的方法,發現有一篇文章中提到了需要將WPF的ShutDownMode設置為OnExplicitShutdown才行,試了一下,果然生效了!只需要很簡單的在Main主函數修改Application的ShutdownMode,修改代碼如下
| public static void Main() ??????? { ??????????? PFM.GUI.App.App app = new PFM.GUI.App.App(); ??????????? app.ShutdownMode = ShutdownMode.OnExplicitShutdown; ??????????? app.Run(); ??????? } |
讓我們來看看這個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哦。
轉載于:https://www.cnblogs.com/imjustice/archive/2011/05/08/2198114.html
總結
以上是生活随笔為你收集整理的WPF中实现先登录后启动主程序的方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库抽象层 PDO
- 下一篇: ASP.NET 安全认证(二)——灵活运