C# 消息框在短暂延迟后自动关闭

C# 消息框在短暂延迟后自动关闭,c#,wpf,C#,Wpf,我有一个wpf应用程序,我需要显示一个messagebox,问题是messagebox会显示0.5秒,甚至不会等待用户单击OK MainWindow.xaml.cs: public partial class MainWindow : Window { public MainWindow() { //verifying application setting file to see if the connection is ok string p

我有一个wpf应用程序,我需要显示一个messagebox,问题是messagebox会显示0.5秒,甚至不会等待用户单击OK

MainWindow.xaml.cs:

public partial class MainWindow : Window
{
    public MainWindow()
    {

        //verifying application setting file to see if the connection is ok
        string pathToApp = System.AppDomain.CurrentDomain.BaseDirectory + "settings.sts";
        ApplicationSettings applicationSettings = new ApplicationSettings();
        applicationSettings.ServerIp = "127.0.0.1";
        applicationSettings.ServerDatabase = "test";
        applicationSettings.ServerUserName = "root";
        applicationSettings.MakeConnectionString();
        foreach (char  c in "")
        {
            applicationSettings.ServerPassword.AppendChar(c);
        }



        MySqlConnection connection = new MySqlConnection(applicationSettings.ConnectionString);
        try
        {
            connection.Open();
        }
        catch (Exception e)
        {
            // here the message box shows for 0.5 second and closes immediately
            MessageBox.Show(e.Message);
        }
        finally
        {
            connection.Close();
        }

        //display window
        InitializeComponent();

    }
如果这与消息框有关,我也应该使用图像作为启动屏幕


抱歉,此代码尚未完成。提前感谢

您的问题源于WPF的已知问题:

首先,它发生在与启动屏幕一起使用时。如果未为消息框指定父项,则它假定启动屏幕是其父项,因此在启动屏幕关闭时关闭。其次,即使在MainWindow的构造函数中指定父窗口作为MainWindow,它仍然无法工作,因为MainWindow还没有句柄(稍后会创建它)

因此,解决方案是将消息框的调用推迟到构造函数之后,并将MainWindow指定为父窗口。以下是修复该问题的代码:

Dispatcher.BeginInvoke(
    new Action(() => MessageBox.Show(this, e.Message)),
    DispatcherPriority.ApplicationIdle
);
以下是对父/飞溅问题的参考:

您能显示应用程序的初始化代码吗?什么是你的“启动屏幕”?可能是启动屏幕关闭导致应用程序在主窗口被视为“加载”之前关闭。@NathanA我只添加了一个图像并将其构建操作更改为SplashScreen,@NathanA can you please help:/它正在工作,但还有一点是消息框在主窗口显示之前显示,然后在此之后关闭主窗口并再次显示messagebox。我是否可以建议您从构造函数中取出所有代码,并在“Loaded”事件中处理它?如果你这样做,很多问题可能会消失。施工人员应留在现场,例如施工作业,不得展示消息框或其他重型作业。