WPF OpenFileDialog с родительским окном Win32;окно не восстанавливает фокус при закрытии - PullRequest
3 голосов
/ 12 апреля 2011

У меня есть приложение c ++ для Windows, которое вызывает библиотеку c ++ / cli, которая вызывает управляемую библиотеку. Управляемая библиотека вызывает OpenFileDialog.Show с родительским окном WPF, которое принадлежит окну Win32. Я не нашел лучшего способа сделать это, и все ресурсы, которые я прочитал здесь и в поиске google и social.msdn, рекомендуют делать то, что я делаю.

Диалог открывается просто отлично, но когда я нажимаю, например, кнопку «Отмена», приложение полностью теряет фокус. Я не уверен, почему это происходит, но я не могу остановить это. Я пробовал разные вещи безрезультатно.

Если я просто запускаю OpenFileDialog без создания окна WPF, я не вижу проблемы. Если я не установлю владельца окна WPF, я не вижу проблемы. Если я вызываю OpenFileDialog.Show и не передаю родительский элемент, но все равно создаю окно WPF и устанавливаю его владельца, я все равно вижу проблему.

Я могу взломать его, чтобы установить окно родительского приложения на передний план после того, как оно потеряет фокус, но я бы не хотел.

Я загрузил небольшой пример решения для моего сценария, который иллюстрирует проблему:

http://dl.dropbox.com/u/26054523/MixedExample.zip

Любая помощь будет оценена.

Ответы [ 2 ]

0 голосов
/ 28 февраля 2014

Я знаю, что это старый пост, но я думаю, что это общая проблема, и у меня есть хороший ответ. Если у вас есть родительское окно окна Win32 с именем ParentWindow и дочернее окно WPF с именем WPFChild, вы можете сделать это:

using System.Windows.Interop;

void OpenWindow()
{
    WPFChildWindow WPFChild = new WPFChildWindow();
    WindowInteropHelper helper = new WindowInteropHelper(WPFChild)
    {
        Owner = new NativeWindowWrapper(ParentWindow.Hwnd).Handle
    };
    bool? ret = _stepsForm.ShowDialog();
}

Это приведет к тому, что дочернее окно останется поверх родительского и будет функционировать как диалог. Имейте в виду, что окно WPF не возвращает DialogResult, а скорее обнуляемое значение bool.

Оболочка NativeWindow - это простой класс, который принимает значение типа int как IntPtr. Это на самом деле из .NET Excel проекта редактирования ссылки, расположенный здесь: Как кодировать .NET RefEdit ControlT

0 голосов
/ 13 апреля 2011

Вы пытались инвертировать сценарий хостинга?Прямо сейчас это звучит так, как будто вы работаете неуправляемо -> мост-> управляемо-> WPF-> Winforms.Может быть, вы могли бы пойти ... managed-> WinForms-> WPF, используя ElementHost http://msdn.microsoft.com/en-us/library/ms742215.aspx

Таким образом, окно WPF будет просто дочерним элементом управления приложения WinForms, и это может сработать лучше для фокусапереключатели.Элементы управления WinForms на самом деле не предназначены для непосредственной работы с приложениями WPF, как вы заметили, используются две разные настройки потоков пользовательского интерфейса.

...