W mojej aplikacji WPF hostuję zawartość Win32 przy użyciu HwndHost. Jednak tworzenie obiektu HwndHost nie tworzy okna macierzystego. Robi się to raczej w nadpisanej metodzie, którą później nazywa WPF.Wymuszenie zainicjowania pliku HwndHost
Moja hostowana zawartość wymaga uchwytu okna macierzystego okna do własnej inicjalizacji. Niestety, nie ma możliwości, aby wymusić utworzenie okna (tj. O wywołaniu WPF BuildWindowCore), więc mam drugi wątek, który odpytuje HwndHost, dopóki nie zostanie zainicjowany.
W .NET 4.0/WPF 4.0 dodano nową metodę WindowInteropHelper.EnsureHandle()
. Miałem nadzieję, że to rozwiąże sytuację, ale działa tylko dla Okna, a nie HwndHost (który nie pochodzi z Okna). Czy masz sugestię, co mogę zrobić zamiast tego?
EDIT:
zapomniałem dodać jeszcze kilka ograniczeń dla możliwego rozwiązania:
- The HwndHost jest umieszczony w kontroli, które, w zależności od ustawień użytkownika, mogą być dzieckiem wniosek Głównego lub może zostać umieszczone w nowym oknie (za pośrednictwem menedżera dokowania innej firmy). Oznacza to, że podczas tworzenia okna nie wiem na pewno, czym będzie okno główne (a zatem jego hWnd).
- Podczas gdy kod natywny wymaga hWnd podczas jego inicjalizacji, okno jest wyświetlane tylko wtedy, gdy użytkownik zażąda, aby zostało ono wyświetlone (tzn. Jest niewidoczne na początku). Jeśli to możliwe, należy unikać wyświetlania okna tylko w celu natychmiastowego ukrycia go.
Występują dwa problemy: 1) Nie znam rodzica hWnd, ponieważ kontrola jest później pozycjonowana przez menedżera dokowania innej firmy, a zapisane ustawienia użytkownika określają, czy jest on wyświetlany samodzielnie, czy jako ". dziecko "głównego okna. 2) Kontrola za pomocą HwndHost może nie być w ogóle pokazywana na początku (w zależności od zapisanych ustawień użytkownika), ale przy starcie starszy kod wymaga hWnd. –
Powinieneś być w stanie podłączyć się do zdarzenia Loaded na twojej kontroli i wykonać tam całą inicjalizację: http://msdn.microsoft.com/en-us/library/system.windows.frameworkelement.loaded.aspx. Jeśli starsza wersja kodu wymaga hwnd, musisz po prostu wstrzymać się od zrobienia czegokolwiek z dotychczasowym kodem, dopóki hwnd nie będzie gotowy (co musiałem zrobić). –
Cytat z linku: "Występuje, gdy element jest ułożony, renderowany i gotowy do interakcji." Jeśli nie pokazuję kontrolki, ładowanie się nie uruchomi. –