我的基于桌面的WPF应用程序(4.0)可以与DB一起工作,为此,它应该在应用程序启动时与SQL Server建立连接。当然,当.Net框架启动并连接到SQL Server时,此操作需要一些时间,用户必须等待几秒钟(3-5秒)。
在这种情况下,如果合适,我决定使用闪屏。我在解决方案中添加了一些图片,将构建操作设置为“闪屏”,编译了我的应用程序,它工作了!如果尝试连接到SQL Server失败(例如,服务器不可用),我的应用程序将抛出异常,我将向用户MessageBox显示警告和异常详细信息,用户按下OK并关闭应用程序(Application.Current.Shutdown())。
在我添加闪屏之前,所有这些逻辑都可以完美地工作,但现在,随着闪屏的添加,如果我在SQL Server不可用的情况下运行应用程序,应用程序会抛出一个异常(正如我在代码中所要求的那样),但带有通知的MessageBox会出现1-2秒,并且在没有任何用户交互的情况下消失,用户甚至无法读取上面写的内容。
我发现,如果我尝试显示2个MessagBoxes,那么第一个会立即出现和消失,但第二个会一直保留到用户按下OK。
我的问题是:如何解决这个问题?我想使用闪屏,并在异常抛出时显示一个MessageBox,并让用户决定何时关闭它(用户单击OK按钮)。
下面的流程图描述了我的应用程序的逻辑:
没有例外(很好的场景):运行应用程序显示闪屏if(isConnectedToSQL=true)→→main window…
with exception (最糟糕的情况):Run if(isConnectedToSQL=false) MessageBox→Splash screen→Throw exception→Show MessageBox With exception details→User click on OK→Close application.
发布于 2010-10-08 23:41:29
原因在于SplashScreen如何使用BeginInvoke来关闭自身。我不能确切地确定MessageBox在哪里关闭*,但我确实看到了一个简单的修复方法:
不要使用MessageBox。
创建一个错误窗口,我们称它为"ErrorWindow.xaml“。使用该窗口向用户显示错误消息并响应OK按钮。
遵循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);
}发布于 2011-03-17 00:44:38
在一个类似的StackOverflow问题上,我列出了处理此问题的几种不同方法。
如果@Tergiver的方法不适用于您的应用程序,您可能会发现其中一些其他技巧很有用。
how to set wpf MessageBox.Owner to desktop window because SplashScreen closes MessageBox
发布于 2011-11-14 20:16:53
根据https://connect.microsoft.com/VisualStudio/feedback/details/381980/wpf-splashscreen-closes-messagebox#tabs上的问题描述,解决此问题的一种方法是DllImport SetActiveWindow,并在调用MessageBox.Show之前将其调用为SetActiveWindow(IntPtr.Zero)。这样,消息框就不会将启动画面作为它的父级,并且在启动画面关闭时也不会死掉。
https://stackoverflow.com/questions/3891719
复制相似问题