文件夹浏览对话框 - 发生了Win32Exception异常 - 参数不正确

10

我尝试像这样使用WPF中的FolderBrowserDialog:

public static bool BrowseFolder(out string folderName)
{
   using (System.Windows.Forms.FolderBrowserDialog dlg = new System.Windows.Forms.FolderBrowserDialog())
   {
        var result = dlg.ShowDialog();
        folderName = dlg.SelectedPath;
        return result == System.Windows.Forms.DialogResult.OK;
   }
}

在使用Visual Studio 2010中的“断点异常”时,关闭ShowDialog()调用中的对话框后会出现异常。我很想知道这是为什么。

异常:Win32Exception
消息:参数不正确
堆栈跟踪: 在MS.Win32.UnsafeNativeMethods.SetFocus(HandleRef hWnd)

更新
我还尝试了显式设置父级,但仍然抛出了异常。

var w = new System.Windows.Interop.WindowInteropHelper(parent);
System.Windows.Forms.IWin32Window i = new WindowWrapper(w.Handle);
result = dlg.ShowDialog(i);

这还有什么其他的吗?你的应用程序中使用其他窗体吗?在空白的WPF应用程序上测试,不会引发任何异常并且运行良好。 - Jeff Mercado
我创建了一个空的测试应用程序,只包含该函数和对该函数的调用,异常就会发生。您必须在Visual Studio 2010中激活“异常中断”才能查看应用程序(调试->异常...->复选框)。 - testalino
你需要展示异常的 StackTrace 属性的值。 - Hans Passant
Stacktrace属性的值已经被发布了。它只包含一行。 - testalino
3
每次从我的WPF应用程序中显示WinForms消息框或对话框时,我都会得到完全相同的异常。 - Anthony Brien
3个回答

9

这只是一些互操作性问题。当对话框关闭时,WPF代码尝试将焦点返回到主窗口。问题在于,对话框已禁用窗口,因此它无法立即接收焦点。WPF太急于改变焦点,并且不知道对话框的行为。实际上没有任何错误发生。


0

我建议尝试在不使用 "using" 语句的情况下完成它,也许会被过早清理掉。


-1

我相信你需要一个Windows Forms主机才能运行来自Windows.Forms命名空间的任何内容...试一下吧!


窗体主机控件/组件在工具箱中。顺便说一下。 - Faizan Kazi
将Windows Forms主机放在WPF窗口上并没有帮助。 - C.J.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接