2010-10-08 54 views
7

我的基於桌面的WPF應用程序(4.0)與數據庫協同工作,爲此,它應該在應用程序啓動時與SQL Server建立連接。當然,這個操作需要一些時間,用戶不得不等待幾秒鐘(3-5),而.Net Framework啓動並連接到SQL Server。如果在WPF 4.0中使用啓動屏幕,帶有異常詳細信息的消息框立即消失

在這種情況下,我決定使用啓動畫面。我在解決方案中添加了一些圖片,將構建操作設置爲「閃屏」,編譯我的應用程序,它的工作原理!如果嘗試連接到SQL Server失敗(例如服務器不可用),則我的應用程序會拋出異常,並向用戶MessageBox顯示警告和異常詳細信息,用戶按下OK和應用程序關閉(Application.Current.Shutdown())。如果我在SQL Server不可用的情況下運行應用程序,應用程序會拋出一個異常(正如我在我的代碼中所提到的),但是現在,在添加了啓動畫面的情況下,帶有通知的MessageBox出現1-2秒,並且在沒有任何用戶交互的情況下消失,用戶甚至不能讀取寫在其上的內容。

我發現,如果我試圖展示2個MessagBoxes,那麼第一個會立即出現並消失,但第二個將保持到用戶按OK。

我的問題是: 如何解決這個問題? 我想使用啓動畫面並顯示一個MessageBox,如果拋出異常並讓用戶決定何時關閉它(用戶單擊確定按鈕)。

這裏是一個流程圖描述我的應用程序的邏輯:

無異常(良好的情況下): 運行的應用程序→啓動畫面→如果(isConnectedToSQL =真)→顯示主窗口...

,出現異常(不好的情況): 運行應用程序→啓動屏幕→if(isConnectedToSQL = false)→拋出異常→顯示具有異常詳細信息的消息框→用戶單擊確定→關閉應用程序。

謝謝。

回答

6

原因在於SplashScreen如何使用BeginInvoke來關閉自身。我無法確切地確定MessageBox正在關閉的位置*,但我確實看到了一個簡單的修復:

請勿使用MessageBox。

創建一個錯誤窗口,我們稱之爲「ErrorWindow.xaml」。使用該窗口向用戶顯示錯誤消息並回復「確定」按鈕。

按照this guideline聲明自己的主要程序,並修改它,像這樣:

編輯,以顯示如何可能傳遞信息到ErrorWindow。

public static void Main() 
{ 
    SplashScreen splashScreen = new SplashScreen("whatever.jpg"); 
    splashScreen.Show(true); 
    string errorMessage; 
    bool dataLoaded = LoadDataFromDatabase(out errorMessage); 
    WpfApplication1.App app = new WpfApplication1.App(); 
    Window windowToRun = dataLoaded ? (Window)new MainWindow() : (Window)new ErrorWindow { ErrorMessage = errorMessage }; 
    app.Run(windowToRun); 
} 
  • 我的猜測是SplashScreen.Show和Application.Run是兩個獨立的消息的泵。第一個以PostQuitMessage調用結束。這解釋了爲什麼MessageBox關閉。