C#,WPF – OpenFileDialog没有出现

我一直在网上搜索,不幸的是从未遇到过像我一样的问题,所以这里有:

我的C#WPF应用程序不会向我显示OpenFileDialogs或SafeFileDialogs。

private void btnBrowseNet_Click(object sender, RoutedEventArgs e) { OpenFileDialog ofd = new OpenFileDialog(); ofd.CheckPathExists = true; ofd.Multiselect = false; ofd.Title = "Open Network Configuration Batch file..."; ofd.ValidateNames = true; ofd.Filter = "Comma Seperated Value Files|*.csv"; if (ofd.ShowDialog() == true) { //... } } 

这个确切的代码在一个场合确实完成了应该做的事情,几乎五分钟之后我可以点击按钮我想要的任何事情都没有发生但是鼠标指针变成了一个忙碌的指示器然后什么都没有。 我可以单步执行该方法或执行此类操作

 bool? shown = ofd.ShowDialog(); 

但无论如何,对话框都不会显示。 当然,在这种情况下显示为假。 我昨天浪费了一个半小时的搜索,当我退出时,我再次尝试了它,突然间它起作用了。 有时它有效,有时则不然。 但它似乎是项目特定的,因为我可以将相同的代码粘贴到一个新项目中,它的工作方式就像它应该做的那样。 此外,这是该项目唯一似乎有点可疑的事情。 其他一切都按预期工作。

有没有人在这里经历过类似的事情,从而了解到我能做什么? 任何帮助都应该受到高度赞赏。

OpenFileDialog存在大量可能的故障模式。 使用一个可以将您的应用程序暴露给您计算机上安装的任何shell扩展。 其中许多可能非常不稳定,扩展作者不太可能检查它是否在WPF进程中正常工作。

通过运行SysInternals的AutoRuns实用程序解决此问题。 单击“资源管理器”选项卡,然后查找名称中包含“ShellEx”的组。 取消选中Microsoft未发布的任何内容。 重新启动并检查问题是否已解决。

这最近发生在我身上。 问题是Main方法没有标记为STAThread ,这将导致WPF OpenFileDialog的ShowDialog方法无限期地阻塞。

 static void Main(string[] args) { var openFileDialog = new OpenFileDialog(); var result = openFileDialog.ShowDialog(); } 

永远不会退出或抛出exception,而

 [STAThread] static void Main(string[] args) { var openFileDialog = new OpenFileDialog(); var result = openFileDialog.ShowDialog(); } 

将按预期工作。

我遇到了类似的问题,正如加勒特所说,这是一个STA问题。 在过去的几个月里,我一直在努力解决STA问题,因为我需要从控制台窗口启动屏幕(测试目的) – 这意味着调用线程不是STA,但可以模拟如下所示:

  [STAThread] private void Execute() { try { Thread t = new Thread(() => { OpenFileDialog dlg = new OpenFileDialog(); // The following would not return the dialog if the current // thread is not STA var result = dlg.ShowDialog(); }); t.SetApartmentState(ApartmentState.STA); t.Start(); } catch (Exception ex) { // Handle the exception ex.LogException(); } } 

不幸的是,仅仅将方法标记为STAThread并不起作用,我必须在标记为STA的线程中启动操作。

我知道这个问题是在2010年问的,而直接答案不是我提供的那个,但是今天的日期还有其他原因可以解决这个问题。

我最近在一台新的虚拟机上安装了我的软件,它在我的开发计算机和许多其他测试机器上运行良好。

Windows 7虚拟机太新鲜,没有安装SP1 KB976932

安装后,我可以使用打开的沙子保存文件对话框。

我希望这能帮助别人。

不确定你是否弄明白,但我最近遇到了同样的问题。 就我而言,问题是我的应用程序没有建立现有窗口。

我的代码看起来像这样。

 private void Application_Startup(object sender, StartupEventArgs e) { string startupFileName = String.Empty(); if ( startupMode = StartupMode.Load ) { // open existing file OpenFileDialog openDlg = new OpenFileDialog(); if (openDlg.ShowDialog() != true) return; startupFileName = openDlg.FileName; } else { // create a new file SaveFileDialog saveDlg = new SaveFileDialog(); if (saveDlg.ShowDialog() != true) return; startupFileName = saveDlg.FileName; } // show my main application window MainWindow myMainWindow = new MainWindow(startupFileName); myMainWindow.Show(); } 

OpenFileDialog(或SaveFileDialog)会立即返回false而不显示,因为我的应用程序没有窗口让它自己附加。

我的解决方案是在创建主窗口之后但在调用Show()方法之前放置打开/保存代码。

在控制台应用程序中,您需要STAThread appartment才能工作。 但WPF与众不同。

我建议您仅在窗口启动并且主线程开始工作后才使用文件对话框。 尝试在其生命周期的某个MainWindow事件中显示您的对话框。

有时[staThread]无法正常工作,你可以试试这个:

  public void showOpenFileDialog() { OpenFileDialog im = new OpenFileDialog(); if (im.ShowDialog() == DialogResult.OK) { textBox1.Text = im.FileName; } } private void select_button_Click(object sender, EventArgs e) { Thread newThread = new Thread(new ThreadStart(showOpenFileDialog)); newThread.SetApartmentState(ApartmentState.STA); newThread.Start(); }