c# - 从窗口句柄设置 OpenFileDialog 的所有者

标签 c# wpf common-dialog

我想设置 OpenFileDialog 的所有者(在命名空间 Microsoft.Win32 内,而不是 System.Windows.Forms),但我只有窗口的句柄( IntPtr )(句柄不必是从我的应用程序来看,它可能是外部的)。

这可能吗,还是我被迫使用 OpenFileDialog来自System.Windows.Forms

我想要达到调用的效果

protected abstract bool RunDialog(IntPtr hwndOwner);

基类内部CommonDialog ,但它受到保护。有办法解决吗?我可以使用反射来获取此方法并执行它,还是有一种“更干净”的方法来执行它?

普通的ShowDialog()方法只允许一个Window,这是我没有的。

当我只有句柄时,我使用此代码来设置其他窗口的所有者,但 WindowInteropHelper 的构造函数仅采用 WindowCommondDialog 不继承自 Window:

Window window;
IntPtr ownerHwnd;
var wih = new WindowInteropHelper(window);
wih.Owner = ownerHwnd;

最佳答案

我怀疑这个问题仍然是一些 Stack Overflow 问题的重复,但我在快速搜索中没有找到明显的密切匹配的候选者。所以……

您可以通过将 HwndSourceRootVisual 属性值强制转换为 Window 来获取 WPF Window 对象:

Window IntPtrToWindow(IntPtr hwnd)
{
    HwndSource hwndSource = HwndSource.FromHwnd(hwnd);

    return (Window)hwndSource.RootVisual;
}

参见HwndSource Class了解更多详情。

关于c# - 从窗口句柄设置 OpenFileDialog 的所有者,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31246563/

相关文章:

c# - 正在将 int 转换为 double 并返回安全

c# - 通过用户输入将项目添加到列表

c# - c#.net 数组中的平滑曲线

c++ - GetOpenFileName 和系统函数调用运行时错误 c++ win32 api

.net - 用于选择 SQL Server 和获取登录详细信息的通用对话框?

c# - 在 C# 中处理编码的 cookie 值

wpf - 如何证明包装面板中的项目?

c# - 在 WPF 中创建自定义控件时如何克服从多个类派生的需要

c# - 满足条件时 CanExecute() 不启用按钮

c++ - 如何在 Windows 公用文件对话框中显示 API 填充的虚拟文件夹