Модальное диалоговое окно WPF не вызывается в центре вызывающего окна

Я пытаюсь вызвать диалоговое окно 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.


person Rahul Vijay Dawda    schedule 10.06.2014    source источник


Ответы (1)


В вашем ShowModal () вы можете попробовать:

this.Owner = App.MainWindow;
person skolte    schedule 10.06.2014
comment
Я не думаю, что могу установить App.MainWindow, потому что диалоговое окно WPF является автономным диалоговым окном, которое можно повторно использовать, и я пытаюсь вызвать его из дочернего окна приложения Win32. Я должен был упомянуть об этом в своем первоначальном посте. - person Rahul Vijay Dawda; 10.06.2014