C#, WPF - OpenFileDialog does not appear

淺唱寂寞╮ 提交于 2019-11-28 09:21:37

There are a large number of possible failure modes for OpenFileDialog. Using one exposes your app to just about any shell extension that's installed on your machine. Many of which can be very destabilizing, it isn't that likely that the extension author has checked if it works properly in a WPF process.

Tackle this problem by running SysInternals' AutoRuns utility. Click the Explorer tab and look for the groups that have "ShellEx" in their name. Uncheck anything that wasn't published by Microsoft. Reboot and check if the problem is solved.

This happened to me recently. The problem was the Main method wasn't marked as an STAThread which will cause the WPF OpenFileDialog's ShowDialog method to block indefinitely.

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

will never exit or throw an exception, whereas

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

will work as expected.

I am experiencing a similar problem, and as Garrett suggested, it is an STA issue. I have been struggling with STA issues a lot in the past few months, as I need to launch screens from a console window (Testing purposes) - this means that the calling thread is not STA, but can be simulated in something like the following:

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

Unforunately, it did not work for me to just mark the method as STAThread, I had to launch the operation in a thread marked as STA.

I know this question was ask in 2010 and the direct answer wasn't the one I'll provide but as today date there is an other reason to have this problem.

I recently installed my software on a fresh virtual machine which works perfectly on my dev computer and many other testing machines.

The Windows 7 virtual machine was too fresh and did not have the SP1 KB976932 installed.

Once installed, I could use the open sand save file dialogs.

I hope this will help someone else.

Not sure if you figured it out or not, but I recently had this same problem. In my case, the problem was that my application hadn't established an existing window.

My code looked something like this.

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

The OpenFileDialog (or SaveFileDialog) would immediately return false without showing because my application had no window for it to attach itself to.

My solution was to put the open/save code after I created my main window but before I called the Show() method.

In the console application you will need STAThread appartment for it to work. But WPF is different.

I would advise you using the File Dialogs only after the window starts and the Main Thread starts working. Try showing your dialog in some MainWindow event of its lifecycle.

sometime [staThread] not working, you can try this:

    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();
    }
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!