【问题标题】:get exception when show System.Windows.Forms.FolderBrowserDialog in wpf在 wpf 中显示 System.Windows.Forms.FolderBrowserDialog 时出现异常
【发布时间】:2011-07-08 23:10:37
【问题描述】:

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

当前线程必须设置为单线程 OLE 之前的线程单元 (STA) 模式 可以拨打电话。确保您的 主函数具有 STAThreadAttribute 标在上面。这个例外只 如果调试器附加到 过程

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

函数是:

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

【问题讨论】:

    标签: c# wpf folderbrowserdialog sta


    【解决方案1】:

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

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

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

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

    【讨论】:

    • ShowDialog() 之前在哪里?或者在调用函数之前我将编辑我的问题以添加函数你可以编辑它并添加 dispatcher.begininvoeke();在正确的位置
    • 我真的不想编辑你的代码,那不会解决你的问题。您需要了解答案才能取得成功。你不清楚哪一部分?你找到话题了吗?
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-09-20
      • 2017-02-11
      • 1970-01-01
      • 1970-01-01
      • 2014-10-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多