2010-10-08 55 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关闭。