В моем приложении WPF я размещаю содержимое Win32 с использованием HwndHost. Однако создание HwndHost не создает собственное окно. Скорее, это делается в переопределенном методе BuildWindowCore()
, который позже называется WPF.Принудительная инициализация HwndHost
Мой размещенный контент требует дескриптора окна собственного окна для его собственной инициализации. К сожалению, я не могу заставить создать окно (т. Е. WPF вызывает BuildWindowCore), поэтому у меня есть второй поток, который опроса HwndHost до тех пор, пока он не будет инициализирован.
В .NET 4.0/WPF 4.0 был добавлен новый метод WindowInteropHelper.EnsureHandle()
. Я надеялся, что это решит ситуацию, но она работает только для Window, а не HwndHost (которая не получается из Window). У вас есть предложение, что я мог бы сделать вместо этого?
EDIT:
Я забыл добавить еще некоторые ограничения для возможного решения:
- В HwndHost находится в элементе управления, который, в зависимости от настроек пользователя, может быть потомком приложения основной окно или может быть помещено в новое окно (через стороннего менеджера по стыковке). Это означает, что во время создания окна я точно не знаю, что такое родительское окно (и, следовательно, его hWnd).
- Хотя нативный код нуждается в hWnd во время его инициализации, окно отображается только тогда, когда пользователь запрашивает его показ (т. Е. Он невидим вначале). Необходимо показать окно, только чтобы скрыть его сразу же, следует избегать, если это возможно.
Есть две проблемы: 1) Я не знаю родительского hWnd, так как элемент управления позже позиционируется сторонним менеджером стыковки, а сохраненные пользовательские настройки определяют, отображается ли это самостоятельно или как " ребенок "главного окна. 2) Управление с помощью HwndHost может вообще не отображаться (в зависимости от сохраненных настроек пользователя), но при запуске устаревший код нуждается в hWnd. –
Вы должны иметь возможность подключиться к событию Loaded на вашем элементе управления и выполнить всю инициализацию там: http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.loaded.aspx. Если устаревший код нуждается в hwnd, вам просто нужно удержать что-либо с устаревшим кодом до тех пор, пока hwnd не будет готов (что я и должен был сделать). –
Цитата из ссылки: «Происходит, когда элемент выложен, отображен и готов к взаимодействию». Если я не покажу контроль, Loaded не будет срабатывать. –