【问题标题】:Message box closes automatically after a brief delay消息框在短暂延迟后自动关闭
【发布时间】:2014-09-23 18:05:00
【问题描述】:

我有一个 wpf 应用程序,我需要显示一个消息框,问题是消息框显示 0.5 秒,甚至不等待用户单击确定。

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();

    }

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

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

【问题讨论】:

  • 你能显示应用程序的初始化代码吗?什么正在显示您的“启动画面”?在您的主窗口被视为“已加载”之前,启动屏幕关闭可能会导致应用关闭。
  • @NathanA 我只添加了一个图像并将其构建操作更改为 SplashScreen,
  • @NathanA 你能帮忙吗:/

标签: c# wpf


【解决方案1】:

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

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

因此,解决方案是将消息框的调用推迟到构造函数之后,并将 MainWindow 指定为父级。这是修复它的代码:

Dispatcher.BeginInvoke(
    new Action(() => MessageBox.Show(this, e.Message)),
    DispatcherPriority.ApplicationIdle
);

这是对父/飞溅问题的参考: http://connect.microsoft.com/VisualStudio/feedback/details/381980/wpf-splashscreen-closes-messagebox

【讨论】:

  • 它正在工作,但还有一点是消息框在主窗口显示之前显示,然后在此之后关闭主窗口显示并再次显示消息框。
  • 我还可以建议您从构造函数中取出所有代码并在“Loaded”事件中处理它吗?如果你这样做,很多这些问题可能会消失。构造函数应该留给例如建筑工作,而不是显示消息框或其他繁重的工作。
【解决方案2】:

在我的情况下(最小的托盘图标应用程序)没有启动屏幕或主窗口。

我发现另一个 SO 问题中的 this solution 很有帮助:

var tempWindow = new Window();
var helper = new WindowInteropHelper(tempWindow);
helper.EnsureHandle();
MessageBox.Show(tempWindow, "Lorem Ipsum");
tempWindow.Close();

(我不确定.Close()是否可以省略)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 2013-08-04
    • 2017-04-17
    • 2017-11-01
    • 1970-01-01
    相关资源
    最近更新 更多