2012-08-08 104 views
1

我有3種形式 - 主要形式是Form1其他是一個飛濺形式,然後登錄屏幕。 初始屏幕首先顯示並填充服務器。然後,顯示frmAppLogin,用戶輸入一個硬編碼密碼,結果返回到form1。窗體開始最小化

public Form1() 
    { 
     _assembly = Assembly.GetExecutingAssembly(); 

     Stream icon = _assembly.GetManifestResourceStream..... 

     this.Icon = new Icon(icon); 

     Thread t = new Thread(new ThreadStart(SplashScreen)); 
     t.Start(); 
     InitializeComponent(); 
     PopulateServers(); 
     //Thread.Sleep(800); 
     Form frmLogin1 = new frmAppLogin(); 
     t.Abort(); 

     frmLogin1.ShowDialog(); 


     DialogResult res = new DialogResult(); 
     res = frmLogin1.DialogResult; 
     if (res == DialogResult.OK) 
     { 
      _LoggedIn = true; 
     } 

     else 
     { 
      _LoggedIn = false; 
     } 
} 

這是Form1_Load的代碼:

private void Form1_Load(object sender, EventArgs e) 
    { 
     if (_LoggedIn) 
     { 
      try 
      { 
       blah blah........ 
      } 
      catch 
      { 
       MessageBox.Show("Error accessing resources!"); 
      } 
     } 
     else 
     { 
      this.Close(); 
     } 
    } 

並登錄表單代碼:

public frmAppLogin() 
    { 
     InitializeComponent(); 
     this.WindowState = FormWindowState.Normal; 
    } 


    private void btnAppLogin_Click(object sender, EventArgs e) 
    { 
     if (txtAppPass.Text.ToString() == requiredPass) 
     { 
      this.DialogResult = DialogResult.OK; 
      this.Close(); 
     } 
     else 
     { 
      txtAppPass.Clear(); 
      txtAppPass.Focus(); 
      MessageBox.Show("Incorrect Password"); 
     } 
    } 

問題是當啓動畫面消失,日誌形式彈出一秒鐘,但立即最小化到任務欄。

通過GUI將Startposition設置爲CenterScreen和WindowState Normal。

此外,只有當我運行application.exe(或複製它)調試文件夾,I.E.當我調試在Visual Studio 2010中

編輯它不會發生:我想補充這一點,我也嘗試:

private void frmAppLogin_Load(object sender, EventArgs e) 
    { 
     this.WindowState = FormWindowState.Normal; 
    } 

這並沒有幫助。

+0

從第二個線程內的閃屏,除了GUI線程?這怎麼能工作? – 2012-08-08 11:48:04

+1

@ uwe kiem,如http://stackoverflow.com/questions/11861701/displaying-a-user-control-is-loading-message-while-loading-a-user-control/11861903#11861903中所述,這是可行的,因爲它的一個單獨的線程,如果它的主要線程並不重要。 – wterbeek 2012-08-08 11:53:26

+0

@UweKeim我想要實現的是在顯示splashscreen時運行的populateservers方法,然後一旦完成,用戶必須登錄。 – k1f1 2012-08-08 11:53:33

回答

3

我敢肯定你在診斷這個錯誤。對話框不會最小化,它會消失在另一個應用程序的窗口後面。通常Visual Studio,每個人都能最大化它,所以它非常擅長覆蓋其他窗口。最小化其他窗口以找回對話框。

這裏出現的問題是,在瞬間,您的應用程序沒有任何Windows可以關注的窗口。實際上,在啓動屏幕和登錄表單之間兩次。再次在登錄表單和主表單之間。 Windows窗口管理器被迫尋找另一個窗口來關注,因爲你沒有任何候選人,它會選擇另一個應用程序的窗口。

窗口管理器允許給應用程序創建其第一個窗口的時間,這不可避免地需要時間。你的啓動畫面無疑會擾亂這一邏輯。該代碼不容易修復,調用ShowDialog()後調用代碼的標準技巧將無法正常工作,因爲您的應用程序尚未抽取消息循環。這本身就是一個問題。至少通過修復啓動畫面來開始解決這個問題,.NET已經對它們內置的固定支持。答案is here

+0

是的,您在這裏是正確的,對話框正在隱藏,而不是最小化。然而,它不會出現在主窗體中,僅適用於啓動屏幕後的登錄表單。感謝你的迴應,我會考慮重寫它。 – k1f1 2012-08-08 13:26:57

0

我知道我回答太晚了。我得到了同樣的問題,並閱讀這篇文章,並試圖找出解決方案。

我已創建Timer對象並將其設置爲Interval = 10並在Form Load event上啓動Timer。然後打開定時器的Tick事件對話框並停止定時器並顯示login.showDialog()。這對我來說可以。請參閱下面的代碼。

 private Timer dispatcher; 

     public MainView() 
     { 
      InitializeComponent(); 
      frmMdiChildList = new List<Form>(); 
      Load += new EventHandler(MainView_Load); 
      FormClosing += new FormClosingEventHandler(MainView_FormClosing); 
      Activated += new EventHandler(MainView_Activated); 

     } 

     void MainView_Load(object sender, EventArgs e) 
     { 
      dispatcher = new Timer(); 
      dispatcher.Interval = 10; //10 milliseconds 
      dispatcher.Tick += new EventHandler(dispatcher_Tick); 
      dispatcher.Start(); 
     } 

     void dispatcher_Tick(object sender, EventArgs e) 
     { 
      dispatcher.Stop(); 
      dispatcher = null; 
      showLoginForm(); 
     } 

     private void showLoginForm() { 
      Form loginForm = new LoginView(); 
      loginForm.ShowDialog(); 
     } 
0

對於那些誰都會有一個問題,即形式彈出的第二分裂,而是立即最小化到任務欄,這裏是一個可能的解決方案:

FormNew f = new FormNew(); 
f.Owner = this; // - this is the solution line 
f.Show();