模态WPF对话框不在调用窗口的中心进行调用
本文关键字:调用 窗口 对话框 模态 WPF | 更新日期: 2023-09-27 18:07:46
我试图从Win32应用程序的子窗口调用WPF对话框,并且能够使用调用窗口的窗口句柄(HWND)实现这一点,并将其传递给WPF代码,在那里我使用WindowInteropHelper
类将Owner属性设置为调用窗口的句柄。下面的代码片段显示了我设置Owner属性的WPF代码。
public void ShowModal(IntPtr ownerWindow)
{
WindowInteropHelper helper = new WindowInteropHelper(this);
helper.Owner = ownerWindow;
this.ShowDialog();
}
我正在使用Windows函数获得调用对话框的HWND,如下所示:
HWND handle = GetTopWindow(GetActiveWindow());
虽然这在功能上按预期工作(WPF对话框作为模态对话框调用),但它在屏幕的左上角被调用。我甚至在XAML代码中设置了WindowStartupLocation="CenterOwner"
属性。当从WPF窗口调用时,它工作得很好,但当涉及到Win32窗口时就不是了。我想我在WPF-Win32互操作中缺少了一些东西,尽管在我看来,问题在于从GetTopWindow(GetActiveWindow())检索的HWND。
UPDATE:我替换了上面的代码以获得调用窗口的HWND到下面的代码,现在WPF对话框总是在屏幕的中心调用,而不管调用它的窗口的位置。
HWND hWnd = GetActiveWindow();
if (hWnd != NULL)
{
hWnd = FindWindowEx(hWnd, NULL, "Window1", NULL);
if (hWnd != NULL)
{
hWnd = FindWindowEx(hWnd, NULL, "Window2", NULL);
}
}
这里的Window2是调用WPF对话框的窗口
你可以在你的ShowModal()中尝试:
this.Owner = App.MainWindow;