2021年在WPF中使用FolderBrowserDialog是否需要Owner Window?
2021年在WPF中使用FolderBrowserDialog是否需要Owner Window?
在WPF中使用FolderBrowserDialog时,我看到一些答案要求使用Win32 API使其成为模态对话框。例如:在WPF应用程序中使用FolderBrowserDialog和如何在WPF应用程序中使用FolderBrowserDialog。实际上,是否真的需要使用Win32 API?我刚刚尝试了FolderBrowserDialog,发现它默认就是模态的;只需调用.ShowDialog()方法就可以将其设置为底层窗口的模态对话框。(其他答案在谈论什么或者WPF的内部机制发生了变化吗?)
编辑:使用带有.NET Framework的Visual Studio 2015(不是核心版本)。
实际上,WPF中的FolderBrowserDialog是否需要Owner Window?
是的。FolderBrowserDialog是通过Win32公开的。在Windows上编写软件时,无论如何都需要使用Win32。
我刚试了一下FolderBrowserDialog,默认情况下已经是模态的了;只需调用.ShowDialog()就已经是模态的了。
这是因为当调用ShowDialog()时,它将IntPtr.Zero传递给owner hWnd参数(在C中与NULL相同)。当你传递NULL时,Windows会将当前活动窗口作为所有者 - 因此仍然设置了一个所有者,只是自动确定:
来自WinForms的ShowDialog()的文档(没有owner参数的重载。尽管WinForms和WPF是分开的,但原则对两者都是相同的):
当调用此版本时,将当前活动窗口设置为对话框的所有者。如果要指定特定的所有者,请使用此方法的其他版本。
尽管如此,你在可能的情况下仍然应该指定owner hWnd,因为你可能会重新设计你的应用程序,希望另一个窗口成为所有者(例如,当你希望在非根父窗口关闭后立即显示对话框时)。
我的问题的其他答案似乎暗示我们必须使用它,否则它不会是模态的。对于一个简单的工具应用程序,只有一个主窗口,我会忽略这些复杂的所有者窗口设置。
你发布的两个问题中只有一个答案以一种暗示你需要它的方式编写。该答案在事实上是不正确的。
关于链接我搞错了,但还有其他答案让我感到困惑,所以才提出这个问题。