C#, WPF - OpenFileDialog does not appear

2019-01-18 05:48发布

I have been searching up and down the web and unfortunately never came across an issue quite like mine, so here goes:

My C# WPF application won't show me no OpenFileDialogs or 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)
        {
           //...
        }
    }

This exact code does in one occasion exactly what it is supposed to do and hardly five minutes later I can click the button all I want, nothing happens but the mouse pointer turning into a little busy-indicator and then nothing. I can step through the method or do something like this

bool? shown = ofd.ShowDialog();

But no matter what, the dialog won't show. Of course, shown will be false in that case. I wasted one and a half hours searching yesterday and right when I quit I tried it again and all of a sudden it worked. Sometimes it works, sometimes it doesn't. But it seems to be project specific because I can paste the same code into a new project and it works like it is supposed to do. Also, that's the only thing about the project that seems fishy. Everything else works as intended.

Has anyone on here ever experienced something similar and thus an idea of what on earth I could do? Any help weould be highly appreciated.

7条回答
不美不萌又怎样
2楼-- · 2019-01-18 06:28

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.

查看更多
在下西门庆
3楼-- · 2019-01-18 06:31

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.

查看更多
Deceive 欺骗
4楼-- · 2019-01-18 06:38

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.

查看更多
贪生不怕死
5楼-- · 2019-01-18 06:41

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.

查看更多
ら.Afraid
6楼-- · 2019-01-18 06:41

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.

查看更多
可以哭但决不认输i
7楼-- · 2019-01-18 06:44

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.

查看更多
登录 后发表回答