【问题标题】:Is Owner Window required in WPF FolderBrowserDialog in 2021?2021 年的 WPF FolderBrowserDialog 中是否需要所有者窗口?
【发布时间】:2021-03-13 10:03:08
【问题描述】:

在 WPF 中使用 FolderBrowserDialog 时,我看到了一些需要使用 Win32 API 才能使其成为模态的答案。例如,

Using FolderBrowserDialog in WPF application

How to use a FolderBrowserDialog from a WPF application

实际上,真的需要 Win32 Api 吗?我刚刚尝试了 FolderBrowserDialog,默认情况下它已经是模态的;简单地调用 .ShowDialog() 已经是底层窗口的模式。 (其他答案在谈论什么或 wpf 内部结构发生了变化?)

编辑:使用带有 .NET 框架(非核心)的 Visual Studio 2015

【问题讨论】:

  • 为什么还在使用 Visual Studio 2015?
  • @Dai,如果它没有坏,就不要修复它!我不是跳上最新和最伟大的 bs 的人:-)

标签: wpf folderbrowserdialog


【解决方案1】:

实际上,真的需要Win32 Api吗

是的。 FolderBrowserDialog 通过 Win32 公开。如果不以某种方式使用 Win32,您将无法为 Windows 编写软件。

我刚刚尝试了 FolderBrowserDialog,默认情况下它已经是模态的;简单地调用 .ShowDialog() 已经是底层窗口的模态。

这是因为当您调用 ShowDialog() 时,它会为所有者 hWnd 参数传递 IntPtr.Zero(与 C 中的 NULL 相同)。当您传递NULL 时,Windows 将在进程中使用当前活动的窗口作为所有者 - 所以仍然设置了所有者,它只是自动确定:

From the documentation for WinForms' ShowDialog()(不带owner参数的重载。虽然WinForms和WPF是分开的,但原理是一样的):

调用此版本时,当前活动窗口成为对话框的所有者。如果要指定特定所有者,请使用此方法的其他版本。

也就是说,您应该仍然在可能的情况下指定所有者 hWnd,因为您可能会重新构建您的应用程序并且可能希望其他窗口成为所有者(例如,当您想在非根父窗口关闭)

【讨论】:

  • 我的问题中的其他答案似乎暗示我们必须使用它,否则它不会是模态的。对于一个带有一个主窗口的简单实用工具,我将把花哨的所有者窗口的东西放在外面。
  • @joedotnot 您发布的两个问题中只有一个答案是以暗示您需要它的方式编写的。这个答案实际上是不正确的。
  • 我对链接不好,但还有其他一些让我感到困惑,因此提出了这个问题。
猜你喜欢
  • 2010-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 2017-06-23
  • 2023-03-09
  • 1970-01-01
  • 2014-10-12
相关资源
最近更新 更多