WPF中實現先登陸後啓動主程序的方法

原文: WPF中實現先登陸後啓動主程序的方法

 我以爲先登陸後啓動應用主程序是一個很經典的問題,基本上若是要寫一個應用程序都會用到這個的小環節。我在這個問題上掙扎了大半天才找到解決方案,個人實現方法我以爲有點不正宗,若是有哪位高手知道更好的方法歡迎留言指導!!html

  首先來講一下傳統C#在WinForm中的實現方法,基本上是在Main函數中根據第一個啓動窗口的DialogResult來判斷是否實例第二個窗口,DialogResult是在第一個窗口中根據登陸狀況來設置的。代碼以下app

主函數代碼:

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的代碼:ide

  this.DialogResult = DialogResult.OK;函數

  this.Close();this

  From: http://www.itc8.cn/a/bianchengleyuan/2011/0126/216.htmlspa

  參考WinFrom中的這個基本想法,在WPF中實現。我重寫了OnStartup函數:.net

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()貌似徹底不起做用。糾結了。。調試

  這個問題的可能緣由有:orm

  1. MainWindow也就是我要建立的第二個主窗口沒有實例化成功;htm

  2. DialogResult錯誤致使沒有進入MainWindow的實例和顯示過程;

  3. 第一個窗口在做祟。

  通過調試排除第1、二中可能,那麼確定就是第一個窗口設置不對或者哪裏出問題了。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哦

相關文章
相關標籤/搜索