2

我试图folderbrowserdialog在 wpf 中显示,但我得到了这个异常

在进行 OLE 调用之前,必须将当前线程设置为单线程单元 (STA) 模式。确保您的 Main 函数上标记了 STAThreadAttribute。仅当调试器附加到进程时才会引发此异常

我尝试在此函数之前添加 [STAThread] 但没有更改如何解决此异常?

功能是:

private void Save_any_File()
        {
            System.Windows.Forms.FolderBrowserDialog get_location = new System.Windows.Forms.FolderBrowserDialog();
            get_location.ShowDialog();
        }
4

2 回答 2

1

您的 Main() 函数已经具有 [STAThread] 属性,它隐藏在 WPF 的自动生成代码中。除了对 Main() 方法外,它在其他任何地方都没有任何影响。它确保 WPF 应用程序的主线程(又名 UI 线程)创建“单线程单元”。这是由 CLR 在您的应用程序中的任何代码开始运行之前完成的。

STA 是 UI 线程的硬性要求,许多 COM 组件都需要它。STA 为非线程安全的软件提供了一个安全的家。因此“单线程”。OpenFileDialog 就是这样一个组件,其他组件是剪贴板和拖放支持。

还有许许多多的 COM 组件试图在您的应用程序中找到归宿。对于 OpenFileDialog,这些是自定义文件夹视图外观的 shell 扩展。

长话短说,毫无疑问,问题在于您正试图在工作线程上显示对话框。没办法。使用 Dispatcher.BeginInvoke() 编组对 UI 线程的调用。

于 2011-07-08T23:18:38.903 回答
0

这篇文章可能会有所帮助。那是一个 Windows 窗体对话框,您通常需要一个 WindowsFormHost 或其他互操作方法。

于 2011-07-08T23:21:51.117 回答