C#,WPF - OpenFileDialog没有出现

时间:2010-02-04 16:18:08

标签: c# wpf openfiledialog savefiledialog

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

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

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

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

7 个答案:

答案 0 :(得分:8)

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

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

答案 1 :(得分:6)

最近发生在我身上。问题是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();
}

将按预期工作。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

我知道这个问题是在2010年提出来的,直接答案不是我提供的那个问题但是今天也有另外一个原因可以解决这个问题。

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

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

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

我希望这会帮助别人。

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

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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