Я пытаюсь вызвать диалоговое окно WPF из дочернего окна приложения Win32, и мне удалось добиться этого с помощью дескриптора окна (HWND) вызывающего окна и передать его в код WPF, где я использую класс WindowInteropHelper
для установки Свойство Owner дескриптора вызывающего окна. В приведенном ниже фрагменте кода показан код WPF, в котором я устанавливаю свойство Owner.
public void ShowModal(IntPtr ownerWindow)
{
WindowInteropHelper helper = new WindowInteropHelper(this);
helper.Owner = ownerWindow;
this.ShowDialog();
}
Я получаю HWND вызывающего диалогового окна с помощью функции Windows, как показано ниже:
HWND handle = GetTopWindow(GetActiveWindow());
Хотя функционально это работает должным образом (диалоговое окно WPF вызывается как модальное диалоговое окно), оно вызывается в верхнем левом углу экрана. Я даже установил свойство WindowStartupLocation="CenterOwner"
в коде XAML. Он отлично работает при вызове из окна WPF, но не когда задействовано окно Win32. Полагаю, мне что-то не хватает в взаимодействии WPF-Win32, хотя мне кажется, что проблема заключается в HWND, полученном из GetTopWindow (GetActiveWindow ()).
ОБНОВЛЕНИЕ: я заменил приведенный выше код, чтобы получить 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.