应用程序启动中的OpenFileDialog立即关闭

本文关键字:OpenFileDialog 启动 应用程序 | 更新日期: 2023-09-27 18:05:32

我想在应用程序启动时加载由另一个项目在我的解决方案中序列化的一些文件:
App.xaml.cs:

<Application (...)
         Startup="Application_Startup">
</Application>
Application_Startup方法:
private void Application_Startup(object sender, StartupEventArgs e)
    {
        (...)
        if (Environment.GetCommandLineArgs().Contains("C"))
        {
            if (Directory.Exists(Settings.Default.SavedPath) && Directory.GetFiles(Settings.Default.SavedPath, "*.extension").Length == 0)
                // do sth
            else
            {
                var result = MessageBox.Show("somerror", "Error!",
                    MessageBoxButton.YesNo, MessageBoxImage.Error, MessageBoxResult.No, MessageBoxOptions.DefaultDesktopOnly);
                if (result == MessageBoxResult.Yes)
                    OpenUserConfig();
                else
                    Shutdown();
            }
        }
(..)
}

OpenUserConfig方法

private void OpenUserConfig()
        { 
var dial = new OpenFileDialog();
            if (dial.ShowDialog() != System.Windows.Forms.DialogResult.OK) return;
            //do sth
        }

这两个方法都在App类中,因此有一个问题:
消息框和字段对话框在弹出后的几分之一秒后就会消失。
我设法找到解决方案的messagebox(通过使用MessageBoxOptions.DefaultDesktopOnly),但我不能维持OpenFileDialog我应该怎么做?
另外(这可能很重要-我不知道):我的应用程序中有SplashScreen

应用程序启动中的OpenFileDialog立即关闭

正如Hans Passant根据我的观察所指出的:当应用程序处于空闲状态时,例如当打开对话框时,启动屏幕关闭。在MainWindow准备好之前打开的任何Window都倾向于在闪屏关闭时关闭。

在用户可以与MainWindow交互之前,您需要加载一个文件,我可以看到两种方式:

  • 你可以打开第二个MessageBox与一些虚拟文本,然后打开OpenFileDialog

    private void OpenUserConfig()
    { 
        MessageBox.Show("Select file");
        var dial = new OpenFileDialog();
        if (dial.ShowDialog())
        {
            // Do something...
        }
     }
    
  • 或者我最终做的是完全从MainWindow运行设置代码,通过将必要的信息复制到App中的公共getter并订阅Window.Loaded事件

     private async void Window_Loaded(object sender, RoutedEventArgs e)
     {
         if (!(Application.Current as App).LoadedWithoutError)
         {
             var dial = new OpenFileDialog();
             if (dial.ShowDialog())
             {
                // Do something...
             }
         }
         IsEnabled = true;
     }
    

您可以使用dialog创建自己的表单并打开该表单。这是最快的方法。