9

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

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

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

这里有没有人经历过类似的事情,因此知道我到底能做什么?我们将不胜感激任何帮助。

4

7 回答 7

9

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

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

于 2010-02-04T17:00:31.837 回答
7

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

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

永远不会退出或抛出异常,而

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

将按预期工作。

于 2011-09-16T14:48:07.600 回答
3

我遇到了类似的问题,正如 Garrett 所建议的,这是一个 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 的线程中启动操作。

于 2016-04-28T13:40:08.730 回答
1

我知道这个问题是在 2010 年提出的,而直接答案不是我将提供的,但截至今天,还有其他原因会出现这个问题。

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

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

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

我希望这对其他人有帮助。

于 2017-03-02T18:58:25.840 回答
1

有时[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();
    }
于 2018-03-30T03:05:46.313 回答
0

不知道你是否想通了,但我最近遇到了同样的问题。就我而言,问题是我的应用程序没有建立现有的窗口。

我的代码看起来像这样。

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() 方法之前放置打开/保存代码。

于 2011-09-20T17:18:52.047 回答
0

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

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

于 2012-09-11T14:02:32.270 回答