【问题标题】:Select File and Continue Program In WPF在 WPF 中选择文件并继续程序
【发布时间】:2018-07-15 21:02:42
【问题描述】:

我一直在尝试按照教程和各种 Stack Overflow 帖子等来实现 OpenFileDialog 来选择文件。问题是,我似乎无法让我的程序继续执行其余的逻辑。不完全确定这是否与我试图在主窗口中打开文件对话框或什么有关。考虑以下 sn-p:

public MainWindow()
       {
           InitializeComponent();
           string file = "";
           // Displays an OpenFileDialog so the user can select a file.  
           OpenFileDialog openFileDialog1 = new OpenFileDialog();
           openFileDialog1.Filter = "Files|*.txt;*.out";
           openFileDialog1.Title = "Select a File";
           openFileDialog1.ShowHelp = true;

           // Show the Dialog.  
           // If the user clicked OK in the dialog and  
           // a file was selected, open it.  
           if (openFileDialog1.ShowDialog() == System.Windows.Forms.DialogResult.OK)
           {
               //file = openFileDialog1.FileName;
               //file = openFileDialog1.OpenFile().ToString();
               //openFileDialog1.Dispose();
           }
           openFileDialog1 = null;
           Console.WriteLine("File path is: " + file);

如您所见,我什至尝试在对话框结束之前将“帮助”值设置为 true。我尝试同时选择文件字符串的文件名等,但无济于事 - 程序似乎只是在从对话框中选择文件后等待。这里有人可以提供解决方案的建议吗?

【问题讨论】:

  • 您的期望是什么?
  • 你能发布实际代码吗? (重要部分已注释掉)另外你有没有调试看看是否真的打到了相关代码?
  • Thierry V,我希望打开一个文件,以便将其传递给我的程序解析器,根据文件格式将其分成不同的段。 Dennis Kuypers,我希望从该文件对话中获取一个字符串进行解析,其余的只是处理主窗口的逻辑。不确定发布其余代码将完成什么,因为我正在处理一个特定问题,并且我不想违反我可能与该项目隐含的任何专有协议。
  • Dennis 我没有调试,这可能是个好点。
  • 所以我发现文件对话框确实有效,并在我逐步调试后立即选择一个文件。当我在选择文件后点击“继续”时,下一个窗口会按预期加载,我肯定觉得这很有趣。

标签: c# wpf openfiledialog


【解决方案1】:

以前我在使用 WPF 时遇到过同样的问题。当您使用 WPF 时,System.Windows.Form 命名空间不包含在您的 Project references 中;

另一方面,实际上有两个 OpenFileDialog,第一个是 System.Windows.Forms.OpenFileDialog(这就是你所拥有的),第二个是 Microsoft.Win32.OpenFileDialog。如果你想让你的代码工作,你必须在你的引用中添加System.Windows.Forms

解决方案资源管理器 -> YourProject -> 引用(右键单击并添加引用...) -> 程序集 -> 框架 -> 查找并选择 System.Windows.Forms -> 确定

下一个解决方案是使用Microsoft.Win32,这很简单。只需将此命名空间添加到您的代码文件中,然后像这样更改您的代码:

 string file = "";
 // Displays an OpenFileDialog so the user can select a file.  
 OpenFileDialog openFileDialog1 = new OpenFileDialog();
 openFileDialog1.Filter = "Files|*.txt;*.out";
 openFileDialog1.Title = "Select a File";

 // Show the Dialog.  
 // If the user clicked OK in the dialog and  
 // a file was selected, open it.  
 if (openFileDialog1.ShowDialog() == true)
 {
     file = openFileDialog1.FileName;
     //file = openFileDialog1.OpenFile().ToString();
     //openFileDialog1.Dispose();
 }
 openFileDialog1 = null;
 Console.WriteLine("File path is: " + file);

【讨论】:

  • 非常感谢!!!我不敢相信这成功了 - 但是,如果 Microsoft Win32 可以在没有线程的情况下做到这一点,我现在就接受它。
【解决方案2】:

OpenFileDialog.ShowDialog()modal method

FileDialog 是一个模态对话框;因此,当显示时,它会阻止 应用程序的其余部分,直到用户选择了一个文件。当一个 对话框以模态方式显示,无输入(键盘或鼠标单击) 除对话框上的对象外,都可能发生。程序必须隐藏 或关闭对话框(通常是为了响应某些用户操作) 在调用程序的输入发生之前。

这意味着调用此方法将阻塞您的主线程,直到对话框关闭。您有几个选择:

  • 在主窗口初始化后调用 FileDialog。
  • 调用 FileDialog from a thread。在这种情况下,请注意同步。

【讨论】:

  • 我完全喜欢这个答案,因为它让我有机会再次考虑在我的代码中使用线程。尽管我将另一个答案标记为正确的答案,因为它更简单,但我非常感谢您在这里的方法 - 谢谢!
猜你喜欢
  • 2017-02-10
  • 2020-03-11
  • 1970-01-01
  • 2013-03-17
  • 2012-12-15
  • 2012-09-27
  • 2016-08-06
  • 2021-12-02
  • 2014-08-11
相关资源
最近更新 更多