2011-07-08 29 views
2

显示System.Windows.Forms.FolderBrowserDialog我试图表明在WPF folderbrowserdialog,但我得到这个例外得到异常,当在WPF

当前线程必须OLE之前被设置为单 线程单元(STA)模式可以拨打 。确保你的主函数有标记的STAThreadAttribute 。如果一个调试器附加到 过程

我尝试这个功能前添加[STAThread]该异常仅 提出,但没有改变我怎样才能解决这个例外?

的功能是:

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

回答

1

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

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

还有许多COM组件试图在您的应用程序中找到家。在OpenFileDialog的情况下,这些是定制文件夹视图外观的外壳扩展。

长话短说,这个问题无疑是你试图在工作线程上显示对话框。没有可以做的。使用Dispatcher.BeginInvoke()来封送对UI线程的调用。

+0

where befor ShowDialog()?或者在调用函数之前,我将编辑我的问题以添加函数,您可以编辑它并添加dispatcher.begininvoeke();在正确的位置 – kartal

+0

我真的不想编辑你的代码,这不会解决你的问题。你需要明白答案才能领先。你不清楚哪一部分?你发现线程了吗? –

+0

最后2段 – kartal

0

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