首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如果在WPF4.0中使用闪屏,包含异常详细信息的MessageBox会立即消失

如果在WPF4.0中使用闪屏,包含异常详细信息的MessageBox会立即消失
EN

Stack Overflow用户
提问于 2010-10-08 22:50:43
回答 3查看 5.3K关注 0票数 10

我的基于桌面的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.

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-08 23:41:29

原因在于SplashScreen如何使用BeginInvoke来关闭自身。我不能确切地确定MessageBox在哪里关闭*,但我确实看到了一个简单的修复方法:

不要使用MessageBox。

创建一个错误窗口,我们称它为"ErrorWindow.xaml“。使用该窗口向用户显示错误消息并响应OK按钮。

遵循this guideline声明您自己的主过程,并像这样修改它:

编辑以显示如何将信息传递到ErrorWindow。

代码语言:javascript
复制
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会关闭。
票数 9
EN

Stack Overflow用户

发布于 2011-03-17 00:44:38

在一个类似的StackOverflow问题上,我列出了处理此问题的几种不同方法。

如果@Tergiver的方法不适用于您的应用程序,您可能会发现其中一些其他技巧很有用。

how to set wpf MessageBox.Owner to desktop window because SplashScreen closes MessageBox

票数 2
EN

Stack Overflow用户

发布于 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)。这样,消息框就不会将启动画面作为它的父级,并且在启动画面关闭时也不会死掉。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3891719

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档